问题描述
我对一个应用程序进行了逆向工程(在开发人员的许可下)并且我对此还是个新手,但是是否有可能获得调用 java 方法的本机函数的名称?在哪个图书馆??我肯定知道正在调用本机函数,如果我尝试使用 frida 拦截库,我收到一个错误,说 frida 找不到库我使用 jd-gui 反编译了 apk,但在 libs 文件夹中找不到库我试图拦截 System.loadLibrary() 但应用程序因地址无效错误而崩溃,但如果我使用 frida 枚举加载模块,我确实找到了应用程序正在加载的库我没有找到该库名称,并且在 libs 文件夹中也找不到有没有办法在java中指定本机库路径?应用程序如何加载库而 frida 看不到它们?
解决方法
如果我理解得很好,你想找到被 Java 调用的原生函数名?
- 列出对 System.loadLibrary() 的所有调用以检测所有库
- 使用 IDA Pro(或其替代方法之一:https://reverseengineering.stackexchange.com/questions/1817/is-there-any-disassembler-to-rival-ida-pro)检查所有以“Java_....”开头的方法
这背后的理论是所有本地方法都应该以“Java_”开头,并以包名的其余部分继续。
例如:
Java_com_foobar_main_test(...);
ra 在包名“com.foobar”和类文件“main”中提供了一个方法“test()”。 重载的方法可以在方法名称后有它们的签名,例如:
Java_com_foobar_main_test__Ljava_lang_String_I(...,jstring text,jint integer);
但概念和以前一样。
如果您想知道特定本地方法调用了哪个 Java 方法,那么您必须从本地代码中找到“GetMethodID(..)”或“GetStaticMethodID(..)”并检查字符串作为第三个参数:这是Java方法的名称。