2016-11-22 153 views
0

如何调试这个反汇编代码?我必须用C++语言重写这个函数。但起初我必须明白它是如何工作的。调试反汇编代码

有什么办法可以调试它吗?

0804865a <generate_key>: 
804865a: 55      push %ebp 
804865b: 89 e5     mov %esp,%ebp 
804865d: 57      push %edi 
804865e: 56      push %esi 
804865f: 53      push %ebx 
8048660: 83 ec 18     sub $0x18,%esp 
8048663: 8b 7d 0c     mov 0xc(%ebp),%edi 
8048666: ff 75 08     pushl 0x8(%ebp) 
8048669: e8 b2 fe ff ff   call 8048520 <[email protected]> 
804866e: 83 c4 10     add $0x10,%esp 
8048671: 85 c0     test %eax,%eax 
8048673: 89 c3     mov %eax,%ebx 
8048675: 75 0f     jne 8048686 <generate_key+0x2c> 
8048677: e8 d4 fe ff ff   call 8048550 <[email protected]> 
804867c: b9 40 42 0f 00   mov $0xf4240,%ecx 
8048681: 99      cltd 
8048682: f7 f9     idiv %ecx 
8048684: 89 d3     mov %edx,%ebx 
8048686: 31 c9     xor %ecx,%ecx 
8048688: be 1b 00 00 00   mov $0x1b,%esi 
804868d: eb 13     jmp 80486a2 <generate_key+0x48> 
804868f: 8d 04 c9     lea (%ecx,%ecx,8),%eax 
8048692: 31 d2     xor %edx,%edx 
8048694: 01 d8     add %ebx,%eax 
8048696: f7 f6     div %esi 
8048698: 8a 82 18 9e 04 08  mov 0x8049e18(%edx),%al 
804869e: 88 04 0f     mov %al,(%edi,%ecx,1) 
80486a1: 41      inc %ecx 
80486a2: 3b 4d 10     cmp 0x10(%ebp),%ecx 
80486a5: 73 05     jae 80486ac <generate_key+0x52> 
+0

简单,重新组装它。 – Jester

+0

有没有Windows程序? –

+3

最好的方法是a)学习汇编语言,然后b)将其逆向工程化回C或C++代码。很显然,这里的问题太广泛了。 –

回答

1

您可以:

A)使用具有像气体一些汇编的权利部分的(指令助记符)(您的商家在& T语法,所以气是自然的选择)编译它(它可能需要一些语法修复才能编译,并正确设置代码段和起点等)。好处是,如果你对某些东西感兴趣(如果你知道程序集足够好的话),你也可以包含你自己的帮助程序指令来修改代码。

B)取字节代码值的中间部分,并简单地在hexa编辑器中写入文件...然后加载到调试器到内存中以编码代码段,在开始处设置cs:eip并在那里去。这种方法的优点是你不需要修正任何语法,六进制字节值是十六进制字节值。

这两种方法都有一个巨大的缺陷,像call 8048520 <[email protected]>这样的东西不会调用所需的代码,因为它不是您的列表的一部分,也不会使它在相同的物理地址开始,因为该列表取自,所以你必须了解Assembly以充分理解如何调整该代码中的任何全局指针值,并且删除那些calls,而是通过在调试器中手动修改该点中的寄存器/内存来模拟它们的功能(因此您必须完全了解那些最初称之为的)。

但是通常当这些练习给出时,二进制文件是可用的,所以学生可以在调试器上自己运行它,所以我想知道为什么你只有这个列表(问题看起来甚至太早)。


C)明显的选项是调试它在纸面上,它是如此之短,与指令的参考指南,你可以很容易地查找任何指令和写笔记原线旁边,你的想法是怎么回事。

和A-hybrid)将它作为C++代码的一部分,因此您可以调用实际的atoirand函数。这些当然可能与原始代码不同,因此当您没有完整的原始代码时,您仍然不清楚如何获得与原始代码完全相同的结果。

从彼得的评论: 编译具有gcc一个.S(扩展汇编源文件大多使用GCC)会给你方便地访问到真正的libc atoirand功能。 GNU as(gas)甚至不需要EXTERN声明。

+1

因为它使用AT&T语法,所以你可以更容易地用gas组装它,即把它放在'.S'文件中,然后运行编辑跳转目标回到符号标签,比如'call atoi',你很好走 –

+1

@PeterCordes谢谢,我没有真正读过代码,所以我错过了它在AT&T的事实。:)(我宁愿不看它:) :) – Ped7g

+0

哈哈,是的,我经常不花很多时间试图实际阅读许多低质量的问题的代码。阅读大多数初学者可怕的代码并不是很有趣,这就是为什么我对那些没有良好文本描述的问题以及他们在调试器中发现的问题进行压缩的原因。在这种情况下,格式很显然是'objdump'输出,所以我马上就认出了它。 –