去混淆重叠的 x86 汇编指令

逆向工程 混淆 x64
2021-06-19 10:43:53

我正在尝试解决逆向工程挑战(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

这似乎是我认为的本地调用,我不确定,它从 call 指令之后的第六个字节开始调用函数(同样,我不确定),这意味着它调用从值为 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 对其进行分析,在程序开始调用重叠指令然后在某条指令处暂停后,可能是因为这是第一条不重叠的指令并且它中断了。

1个回答

高级反汇编器通过执行二进制的递归遍历来解决这个问题,即,它们还查看可能的跳转/分支目标并从该位置反汇编 - 即使原始线性扫描表明分支目标在指令内。

OllyDbgIDA Pro 都支持递归遍历。然而,OllyDbg 对 x64 的支持似乎仍在开发中,并且在 IDA Pro 的免费(作为啤酒)版本中不包含 x64 支持。

有关更多详细信息,请参阅此文章