一、目标

一、目标

上篇文章我们学会了如何增加一个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埋下的第一个坑,我们下节课来填它。

100

关注微信公众号,最新技术干货实时推送

100