我正在尝试解决逆向工程挑战(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 对其进行分析,在程序开始调用重叠指令然后在某条指令处暂停后,可能是因为这是第一条不重叠的指令并且它中断了。