"该文档是关于手机软件反分析的教程,特别关注了使用IDA工具进行逆向工程时遇到的问题和IDA的特性。内容涉及到反编译的挑战,如16位Thumb2指令的解析,IDA的自动分析偏好,以及如何通过特定编程技巧规避或干扰IDA的分析。"
在手机软件反分析过程中,IDA是一款常用的逆向工程工具。然而,当缺少Hexrays(IDA的高级反编译器)时,手动反编译变得尤为困难,尤其是面对GCC编译器生成的包含移位和立即数的复杂逻辑。由于16位Thumb2指令集的特性,分析逻辑的难度增加,这需要分析者具备深厚的逆向工程技能。
IDA有一些独特的分析癖好,比如它给予BLX指令高度优先级,甚至可能将数据误判为函数。此外,如果POP指令列表包含程序计数器(PC),IDA倾向于将其视为函数结尾,但这并不总是准确的。手动修正后,Hexrays可能仍然不认可这个调整。另一个例子是,如果不将类似“panic”的函数标记为“noreturn”,那么在其调用者处,IDA可能无法正确识别代码流,导致代码保持散乱状态。
IDA对于参数识别也有其局限性,例如,它假设任何BL/BLX调用都会丢失r0到r3寄存器的内容。如果BLXR4/RX指令被标记为函数,这可能会导致反汇编和反编译的混乱。此外,如果一个函数的堆栈分配出现问题,即使强行配平,也可能在Hexrays中产生问题。更重要的是,一旦函数被错误地F5分析,其错误的参数识别将优先于正确的参数,影响到调用者的分析。
针对IDA本身,开发者可能会采用一些策略来规避或干扰其分析。这包括利用NEON指令进行隐藏操作,如复制、清空或隐藏调用参数。使用POP {r0, r1, pc} 替代call指令来操纵堆栈,以及插入复杂函数以制造F5分析中的变量传递错误。插入SVC指令可以同时干扰反汇编和反编译过程。通过精心设计的函数,可以实现低寄存器到高寄存器的值传递,同时影响到IDA的分析。调整LR的值然后调用B指令,可以模拟BL,可能导致Hexrays在调用处停止分析或识别为JMP OUT。最后,通过在caller区使用SP正偏移,可以创建配平难题,进一步困扰IDA的F5分析。
这份文档揭示了手机软件反分析的复杂性,以及在使用IDA时需要注意的各种问题和技巧,这对于理解逆向工程和软件保护机制具有重要价值。