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对其进行分析,并且在程序开始调用重叠指令然后在某条指令处暂停后,也许是因为这是第一条不重叠且会中断的指令。
#1 楼
高级反汇编程序通过对二进制执行递归遍历来解决此问题,即,它们还会查看可能的跳转/分支目标并从该位置反汇编-即使原始线性扫描表明分支目标位于指令内。 >OllyDbg以及IDA Pro支持递归遍历。但是,似乎仍在开发对x64的OllyDbg支持,并且IDA Pro的免费版本(作为啤酒)不包括x64支持。
有关更多详细信息,请参阅本文。
评论
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中的异常处理。朋友