JNI_onLoad 未出现在 .so (Android)

逆向工程 安卓 共享对象
2021-07-10 23:01:39

我正在尝试分析在 android 上运行的 .so 文件。将文件加载到 IDA 我无法发现 JNI_onLoad。所以我将 .so 转储到内存中,但我仍然无法发现 JNI_onLoad。

查看字符串窗口,我可以看到一个字符串“JNI_onLoad”,但没有在任何地方引用它。该库还应包含 JNI 本机方法,但我找不到任何方法。

所以我的问题是,JNI_onLoad 在哪里?必须有 JNI_onLoad 吗?以及调用 java 类如何知道在哪里可以找到它的本机函数?

以下是 IDA 列出的导出:

Name    Address  Ordinal
----    -------  -------
       0008A044        
/linker 0008A064        
       0008B098        
ס      0008AFCC        
       0008A990        
       0008A16C        
r      0008A43C        
       0008A464        
ƒ      0008A4B8        
       0008A784        
       0008A988        
       0008AB24        
       0008AB4C        
      0008AED0        
.      0008AED8        
       0008AEE0        
       0008AF44        
       0008AF7C        
h      0008AF90        
       0008B07C        
       0008C808        
       0008C85C        
       0008C0E8        
       0008B5E4        
}      0008B5EC        
       0008B690        
       0008C2D8        
       0008C0C0        
      0008C12C        
ט      0008C184        
פ      0008C0A4        
½      0008C198        
       0008C1BC        
|       0008C1E0        
       0008C228        
_«     0008C660        
       0008C6B0        
       0008C6CC        
»      0008C6D4        
נ»     0008C6DC        
_»     0008C6E4        
»      0008C6EC        
_      0008C774        
       0008C790        
       0008C7A4        
_      0008C7CC        
ר_     0008C7E0        
       0008CAE8        
1个回答

找到了一些解决方案。
经过大量谷歌搜索后,我得出的结论是 ELF 文件是故意损坏的。
我发现只能操作 3 个字段以使 ELF 中断调试器并且仍然能够运行 -> (e_shoff, e_shnum, e_shstrndx)。

Source: https://dustri.org/b/screwing-elf-header-for-fun-and-profit.html

我从http://www.elfparser.com/下载了 ELF Parser并将共享对象文件加载到其中。
在 SHeaders 下,记下最小的部分偏移量并转换为十六进制,在我的情况下,偏移量为 2056 或十六进制 0x808。我转到 ELF 标头并记下我的 SH 偏移量,即 703264 或十六进制 0xABB20
我在十六进制编辑器中打开文件并查找 0x20 0xBB 0x0A 0x00 并将其替换为 0x08 0x08。这修复了 IDA 的导出和导入,我能够找到 JNI_onLoad。