Android Native Library - 如何将 java 引用匹配到 sub_XXX 函数(静态方式)

逆向工程 安卓 反汇编者
2021-07-06 16:42:55

我目前正在学习如何在 APK 中包含的 ELF SO 文件中实现本机功能。我正在使用 IDA。

本机调用总是以这种方式实现的。

// First load the library 
class myClass{
public myClass(){
  super();
  v0 = system.loadLibrary("library-native"); 
  //then declare the methods 
}
public static native int nativeMethod(byte[] arg0, boolean arg1) ;
}
void a(){
  // then uses it 
  ret = this.nativeMethod(byte,bool) ; 
}

根据我在 JNI 中的一点经验,当使用反汇编器查看 library-native.so 时,我应该在导出的函数中看到类似 Java_package_name_libname_class_NativeMethod 的东西。

我看不到任何这些元素。当我在反汇编代码中搜索所需的函数(过去示例中的 nativeMethod)时,我没有找到任何线索。

我想知道 Dalvik 进程如何在执行本机调用时设法调用正确的函数,以及如何找到所需函数的源代码?

谢谢

编辑:我添加 nm 和 readelf 输出来澄清。

nm --defined-only library-native.so 
nm library-native.so : no symbols
readelf -s library-native.so | grep nativeMethod // gives no output
//The only JNI related function 
nm -D --defined-only library-native.so | grep JNI
00XX: JNI_onLoad
1个回答

好吧,如果原文件不导出符号,我只能想到两种可能:

  1. 这些方法在加载时动态注册。
  2. (最有可能)文件被混淆/加密并在加载时解密。

在这两种情况下,操作都可能发生在JNI_onLoad函数中。您将需要调试它以查看发生了什么。