PUSH+RET
)或EA(如果在原始JMP
之后紧接着有一个备用字节)。这些说明是否足以解决错误的拆卸工作?如果否,那么还有什么其他方法可以解决问题?样本以自动完成这项工作?
似乎像此处所示的解决方案(幻灯片13),但不幸的是,没有提供源。经过一番研究后,我自己提出一个问题:修补原始可执行文件不可行,因为一个命令
C3
只能用一个字节命令(例如FF25XXXX
aka nop)覆盖,但不能用最小的RET
覆盖。甚至无条件跳转也将花费一个字节以上,因此内联可能性也不适用。 />完全重新组装二进制文件(请参阅ExtremeCoders的答案中的DynamoRIO-way)。可能的起点可以在这里找到。#1 楼
在解决破解问题的同时,我编写了类似的脚本。有问题的二进制文件模糊了
br />和
call imm32
jmp imm32
指令
push imm32
xor dword ptr [esp], imm32
mov edx, imm32
xor edx, imm32
jmp edx
为了消除混淆,我写了一条指令跟踪器使用DynamoRIO将已执行的所有基本块记录在跟踪文件中。
现在通过解析跟踪文件,并使用正则表达式进行模式匹配,可以对混淆后的指令进行反混淆。
由于需要动态计算跳转和调用目标,因此我使用FASM即时汇编指令。
这里是脚本。它可能并不直接有用,但是您会有所了解。
jmp imm32
#2 楼
您可以轻松地制作一个ida脚本,该脚本会将ret指令的交叉引用添加到推入中的地址。您只需要查找具有上一条指令的模式,该指令的助记符为push,下一条指令为RET。添加交叉引用将确保您的函数流程正确无误。如果有帮助,我可以整理一个脚本来添加这种类型的交叉引用?
这里是指向我使用SDK的IDA插件版本的链接。
http://milhous.no-ip.com:15980/blog/2015/09/20/ida-call-跳转/
评论
由于segment_t未定义错误,因此无法真正运行脚本进行测试。尝试了许多标头插入/代码修改,但没有遇到任何麻烦。您能否用详细的方式更新答案? IDA 6.6
–见
2015年9月22日在9:57
#3 楼
假设JMP => PUSH; RET是唯一应用的混淆技术,您可以尝试编写执行以下操作的IDAPython脚本:-对于IDA发现的每个函数,遍历每条指令。遇到“ PUSH; RET”指令时,提取对应于目标的字节。修补字节以将其更改为相对的JMP(为此您需要考虑当前的指令地址)。按照说明重新组装字节。要修补实际的二进制文件,请使用EDIT菜单中的“将修补程序应用于二进制文件”。
评论
我刚接触IPAPython时,就有一个问题:可以为该操作设置通配符吗?假定情况,当没有直接按入时,则严格按RET。 PUSH +通配符+随机基本块+通配符+ RET怎么样?
–见
2015年9月21日在5:24
评论
PUSH + RET是JMP,而不是CALL。您将需要一个FF25序列,并查找另外四个字节来存储地址,如果原始RET之后紧接着有一个备用字节,则需要一个EA。@peterferrie感谢您的通知。考虑到您的提示,我将为您更新该帖子。