PUSH {R4,LR}
将低寄存器R4入栈,LR也入栈
POP {R4,PC}
将堆栈中的数据弹出到低寄存器 R4 及 PC 中
默认Thumb指令是16位的,指令PUSH.W中的后缀W指示编译器要把这条指令编译为32位的
STR{条件} 源寄存器,<存储器地址>
STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。”
花指令解决方案:
1.找出花指令代码块
2.nop掉代码块
NOP - 空指令 代表什么都不做 90
IDA的patch功能手工去花的,脚本牛可以写个脚本
所有花指令填充的00 bf(NOP),然后就可以F5了。
去花
去花即将规律的花指令 nop 掉并修复跳转,ida 中的去花脚本编写可参考 IDA 的 idc 或 idapython API。为了使 IDA 识别某个函数X,需要在 Functions Window 统统删除之前函数X中误将 junk code 识别为函数的垃圾函数,手动设置函数X的结尾(Edit - Functions - set function end)。函数尾部特征:BLX __stack_chk_fail -> 堆栈保护POP {R4-R7,PC} (与函数头 PUSH {R4-R7,LR} 对应) -> 堆栈平衡