0

我对应用程序进行逆向工程(在开发人员的许可下),我对此仍然很陌生,但是是否可以获得调用 java 方法的本机函数的名称?在哪个图书馆?我确定正在调用本机函数,但如果我尝试使用 frida 拦截库,我会收到一条错误消息,提示 frida 无法找到我使用 jd-gui 反编译 apk 的库,我无法在 libs 文件夹中找到库试图拦截 System.loadLibrary() 但应用程序因地址无效错误而崩溃但我确实发现应用程序正在加载一个库有没有办法在java中指定本机库路径?以及应用程序如何加载库但 frida 看不到它们?

4

1 回答 1

1

如果我理解得很好,您想找到称为 BY 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 方法。

于 2020-12-31T09:30:37.940 回答