我的目标是在ARM平台上的剥离二进制文件中挂钩C函数而不使用符号。由于这些函数的地址可能会改变(即更新二进制文件),我希望我插入动态库本身来查找地址。
此外,这些函数在某些时候使用的C字符串永远不会通过更新进行更改。考虑到这一点,以下是查找函数地址的3个步骤:
1)找到C字符串本身的地址(通过分析__cstring
段内的__TEXT
部分。
2)找到字符串引用的地址。
3)从外部参照地址开始,向后退,直到找到函数序言。
我可以实施步骤1)和3),但我有点迷失2)。什么是外部参照?如何识别与C字符串对应的那个?不需要代码,只需要一些理论。
谢谢!
答案 0 :(得分:0)
您必须反汇编所有代码,确定从内存中读取的代码。您必须解码从内存中读取的那些指令的地址(不确定ARM是相对的还是绝对的)。此外,为了正确地反汇编您需要从已知入口点开始的所有内容,并按照所有调用来找出函数的起始位置(我假设ARM具有可变大小的指令,即具有immediates的指令)。这不是一件简单的事情,交叉引用分析是逆向工程软件(例如IDA Pro)的一个相当重要的特性。此外,如果不直接访问内存,则必须分析所有间接内存访问(通过寄存器访问)。
答案 1 :(得分:0)
你可以做什么而不是搜索字符串及其外部参照(LDR R5,= 0xnnnnnn)是为了创建一个包含函数结尾的字节数组并搜索它。您搜索的字节越多,唯一性就越高。要通过(C / ASCII)字符串不好,只能手动(在IDA中手动)工作
否则你必须实现一个反汇编引擎(就像解码IDA中的指令一样,与x86平台上的指令相比)并解析每条指令。