如何找到在android应用程序和哪个库中调用java方法的本机c++函数?

问题描述

我对一个应用程序进行了逆向工程(在开发人员的许可下)并且我对此还是个新手,但是是否有可能获得调用 java 方法的本机函数的名称?在哪个图书馆??我肯定知道正在调用本机函数,如果我尝试使用 frida 拦截库,我收到一个错误,说 frida 找不到库我使用 jd-gui 反编译了 apk,但在 libs 文件夹中找不到库我试图拦截 System.loadLibrary() 但应用程序因地址无效错误而崩溃,但如果我使用 frida 枚举加载模块,我确实找到了应用程序正在加载的库我没有找到该库名称,并且在 libs 文件夹中也找不到有没有办法在java中指定本机库路径?应用程序如何加载库而 frida 看不到它们?

解决方法

如果我理解得很好,你想找到被 Java 调用的原生函数名?

  1. 列出对 System.loadLibrary() 的所有调用以检测所有库
  2. 使用 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方法的名称。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...