目标

打开app:

image.png

我们的目标是模拟点击LV3按钮所执行的 so 中的算法逻辑。

IDA分析

int __fastcall Java_com_sec_udemo_MainActivity_sign_1lv3(_JNIEnv *a1, int a2, int a3)
{
  ...

  Class = _JNIEnv::FindClass(a1, "com/sec/udemo/MainActivity");
  MethodID = _JNIEnv::GetMethodID(a1, Class, "getSaltFromJava", "(Ljava/lang/String;)Ljava/lang/String;");
  ...
  return v5;
}

可以看到,这个方法里面调用了 Java 层的函数。

我们加载的 so 肯定是没有这个 Java 函数的,所以要怎么搞呢?

当然是自己补咯!!!

ExAndroidNativeEmu

上一篇里,有读者(感谢pass)提到了这个项目。相比我们上一篇里面到处缝缝补补,使用这个项目就不用那么麻烦。

我看了一下,其中的差异之一就是它实现了 libc.so 的 init 相关的方法。由于我们是跳过了 libc.so 里面的 init 段的初始化,所以导致执行 libc.so 的方法时会出现无效指令等问题。这个项目里面是补齐了内核给 libc 传递的一些参数,所以执行 init 段没问题,具体可以看项目源码。

但是这个项目比较老了,参数的转换有很多问题。

我们后面依然使用AndroidNativeEmu这个项目来写代码,可以多学一点东西。

实现Java类

我们先按照 lv2 的代码,直接跑一下,看看报的错误:

  File "/home/a5right/.local/lib/python3.10/site-packages/androidemu/java/jni_env.py", line 377, in find_class
    raise RuntimeError('Could not find class \\'%s\\' for JNIEnv.' % name)
RuntimeError: Could not find class 'com/sec/udemo/MainActivity' for JNIEnv.

找不到 Java 类,所以我们先实现这个类:

class com_sec_udemo_MainActivity(metaclass=JavaClassDef, jvm_name="com/sec/udemo/MainActivity"):
    def __init__(self):
        pass
        
    @java_method_def(
        name='getSaltFromJava', 
        signature='(Ljava/lang/String;)Ljava/lang/String;', 
        native=False,
        args_list=['jstring'])
    def getSaltFromJava(self, mu, str):
        return str.value + "salt.."

然后,把这个类注入到模拟器里面: