打开app:

我们的目标是模拟点击LV3按钮所执行的 so 中的算法逻辑。
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 函数的,所以要怎么搞呢?
当然是自己补咯!!!
上一篇里,有读者(感谢pass)提到了这个项目。相比我们上一篇里面到处缝缝补补,使用这个项目就不用那么麻烦。
我看了一下,其中的差异之一就是它实现了 libc.so 的 init 相关的方法。由于我们是跳过了 libc.so 里面的 init 段的初始化,所以导致执行 libc.so 的方法时会出现无效指令等问题。这个项目里面是补齐了内核给 libc 传递的一些参数,所以执行 init 段没问题,具体可以看项目源码。
但是这个项目比较老了,参数的转换有很多问题。
我们后面依然使用AndroidNativeEmu这个项目来写代码,可以多学一点东西。
我们先按照 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.."
然后,把这个类注入到模拟器里面: