0

我的目标是在 ARM 平台上的剥离二进制文件中挂钩没有符号的 C 函数。由于这些函数的地址可能会改变(即更新二进制文件),我希望我的插入动态库本身能够找到地址。

此外,在某些时候,这些函数使用一个 C 字符串,它永远不会通过更新而改变。考虑到这一点,以下是查找函数地址的 3 个步骤:

1)找到C字符串本身的地址(通过分析__cstring段内的__TEXT部分。

2) 找到对字符串的引用的地址。

3)从外部参照地址开始,往回走,直到找到一个函数序言。

我可以实施步骤 1)和 3),但我对 2)有点迷茫。究竟什么是外部参照?如何识别与 C-string 对应的那个?不需要代码,只需要一些理论。

谢谢 !

4

2 回答 2

0

您必须反汇编所有代码,确定从内存中读取的代码。您必须解码从内存中读取的那些指令的地址(不确定 ARM 是相对的还是绝对的)。此外,为了正确反汇编所有内容,您需要从已知入口点开始并跟踪所有调用以找出函数的开始位置(我假设 ARM 具有可变大小的指令,即带有立即数的指令)。这不是一件简单的事情,交叉引用分析是逆向工程软件(例如 IDA Pro)的一个相当重要的功能。此外,如果不直接访问内存,则必须分析所有间接内存访问(通过寄存器访问)。

于 2012-10-01T22:27:52.227 回答
0

除了搜索字符串及其外部参照(LDR R5,= 0xnnnnnn)之外,您可以做的是创建一个包含函数结尾的字节数组并搜索它。您搜索的字节数越多,唯一性就越高。使用(C/ASCII)字符串并不好,只能手动(在 IDA 中手动)工作

否则,您必须实现一个反汇编引擎(例如在 IDA 中解码指令的引擎,与 x86 平台上的类似)并解析每条指令。

于 2015-07-14T17:46:35.663 回答