一、目标
上篇文章我们学会了如何增加一个java类,最后遇到的问题是这个java类需要有成员函数被so调用
RuntimeError: Could not find method ('getPackageManager', '()Landroid/content/pm/PackageManager;') in class android/app/Activity.
二、步骤
需要在 android/app/Activity 类,增加一个成员函数 getPackageManager
class Activity(metaclass=JavaClassDef, jvm_name='android/app/Activity'):
def __init__(self):
self.__pkg_Manager = PackageManager()
pass
@java_method_def(name='getPackageManager', signature='()Landroid/content/pm/PackageManager;' , native=False)
def getPackageManager(self, mu):
logger.info("Im in Activity.getPackageManager")
pass
@的函数修饰符,实现类似 getPackageManager = java_method_def(getPackageManager) 的效果,定义在androidemu/java/java_method_def.py里面, 主要注意的是 native参数:
- native=True 说明是一个native函数,实现在so中,会被Unicorn执行。
- native=False 说明是一个模拟的java函数,可能会被so中的函数调用,我们在python代码里要实现他的逻辑。
跑一下
File "step1/androidemu/java/jni_env.py", line 678, in call_object_method
raise NotImplementedError()
NotImplementedError
call_object_method函数报错,从jni_env.py里面找到这个函数,发现大神没有实现这个函数……
从Ida的反汇编代码看:
(*v1)→CallObjectMethod)(v1, ApplicationObj, v4);
CallObjectMethod 除了 env参数之外,还有两个参数,分别是 object_id 和 method_id。
我们直接实现它
def call_object_method(self, mu,env,obj_idx, method_id):
logger.debug("JNIEnv->call_object_method(%d,%s) was called" % (obj_idx,method_id) )
return self.__call_xxx_method(mu, env, obj_idx, method_id, None, 1)
再跑
2020-11-25 17:04:00,265 DEBUG androidemu.java.jni_env | JNIEnv->call_object_method(4096,3523215368) was called
Traceback (most recent call last):
File "step1/androidemu/hooker.py", line 100, in _hook
hook_func(self._emu)
File "step1/androidemu/java/helpers/native_method.py", line 115, in native_method_wrapper
result = func(argv[0], mu, *native_args)
File "step1/androidemu/java/jni_env.py", line 680, in call_object_method
return self.__call_xxx_method(mu, env, obj_idx, method_id, None, 1)
File "step1/androidemu/java/jni_env.py", line 689, in __call_xxx_method
method = pyobj.__class__.find_method_by_id(method_id)
File "step1/androidemu/java/java_class_def.py", line 75, in find_method_by_id
return cls.jvm_methods[jvm_id]
KeyError: 3523215368
从错误提示上来看,应该是调用 3523215368 这个函数失败, 这个有点奇怪,这里实际上是so埋下的第一个坑,我们下节课来填它。
关注微信公众号,最新技术干货实时推送