在逆转我遇到过的反Dissm技巧的恶意软件时,实际上在这里对此进行了详细描述。 -> PUSH+RET)或EA(如果在原始JMP之后紧接着有一个备用字节)。这些说明是否足以解决错误的拆卸工作?

如果否,那么还有什么其他方法可以解决问题?样本以自动完成这项工作?

似乎像此处所示的解决方案(幻灯片13),但不幸的是,没有提供源。经过一番研究后,我自己提出一个问题:修补原始可执行文件不可行,因为一个命令C3只能用一个字节命令(例如FF25XXXX aka nop)覆盖,但不能用最小的RET覆盖。甚至无条件跳转也将花费一个字节以上,因此内联可能性也不适用。 />完全重新组装二进制文件(请参阅ExtremeCoders的答案中的DynamoRIO-way)。可能的起点可以在这里找到。


评论

PUSH + RET是JMP,而不是CALL。您将需要一个FF25序列,并查找另外四个字节来存储地址,如果原始RET之后紧接着有一个备用字节,则需要一个EA。

@peterferrie感谢您的通知。考虑到您的提示,我将为您更新该帖子。

#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