我正在尝试解决逆向工程挑战(http://crackmes.cf/users/beatrix/beaba/),并且在混淆方面遇到了麻烦。下面是一段代码,几乎在到达入口点后立即执行。到达调用指令后,似乎该调用正在调用下面列出的第二条指令的第二个字节。

0000000000403789 | E8 01 00 00 00           | call beaba.40378F
000000000040378E | 04 E8                    | add al,E8
0000000000403790 | 01 00                    | add dword ptr ds:[rax],eax 
0000000000403792 | 00 00                    | add byte ptr ds:[rax],al
0000000000403794 | D0 83 44 24 08 12        | rol byte ptr ds:[rbx+12082444],1
000000000040379A | 83 04 24 0A              | add dword ptr ss:[rsp],A


从第二个字节开始解码字节之后第二条指令的内容翻译为:

e8 01 00 00 00          call   0x6
d0 83 44 24 08 12       rol    BYTE PTR [rbx+0x12082444],1
83 04 24 0a             add    DWORD PTR [rsp],0xa
c3                      ret


这似乎是本地调用,我不确定,我不确定,该调用从调用指令之后的第六个字节(同样,我不确定),这意味着它从值0x12的字节开始调用指令。译为:

00 00                   add    BYTE PTR [rax],al
00 f4                   add    ah,dh
83 44 24 08 12          add    DWORD PTR [rsp+0x8],0x12
83 04 24 0a             add    DWORD PTR [rsp],0xa
c3                      ret


但是,如果要连续进行100次,这样做就不那么实际了。

现在我的问题是:这是分析程序的正确方法,还是有更好/更有效的方法?我正在使用x64dbg对其进行分析,并且在程序开始调用重叠指令然后在某条指令处暂停后,也许是因为这是第一条不重叠且会中断的指令。

评论

x64dbg使用x64dbg作为反汇编后端。您可以检出项目,也可以使用python编写脚本编写这样的解决方案,该解决方案将递归解析调用以检测代码段。

实际上,x64dbg现在使用ZyDis作为反汇编后端。参见x64dbg.com/blog/2017/10/18/goodbye-capstone-hello-zydis.html

如果您打算实施自己的分析,则此博客文章可能会有所帮助:x64dbg.com/blog/2016/07/27/Control-flow-graph.html

您确定执行到达了此调用吗?我看到在此调用之前生成了一个异常,因此您可能需要查看处理程序,以了解有关pdata,unwindinfo的信息,如果使用windbg,则需要x64中的异常处理。朋友

#1 楼

高级反汇编程序通过对二进制执行递归遍历来解决此问题,即,它们还会查看可能的跳转/分支目标并从该位置反汇编-即使原始线性扫描表明分支目标位于指令​​内。 >
OllyDbg以及IDA Pro支持递归遍历。但是,似乎仍在开发对x64的OllyDbg支持,并且IDA Pro的免费版本(作为啤酒)不包括x64支持。

有关更多详细信息,请参阅本文。