linux反汇编旁门左道小技巧一则

我个是我自已在开发过程中发现的一个小技巧。不算什么牛X的技巧。只是帖出来大家一起欣赏一下而已。权当一道小菜吧。

gdb反汇编调试技巧

linux下很多时候我们需要反汇编我们的源码,然后根据所得到的信息(例如相关的寄存器)进一步定位问题所在。这时候我们很多时间用objdump或者直接用gdb。在用gdb的情况下可以对可疑的函数采用disassemble funcname来反汇编对应的funcname函数。但如果在对汇编不是很熟的情况下我们通常不容易将源码与对应的汇编匹配起来思考。例如:

void main()

{

inta_main=1;

int i = 0x77; //技巧所在

a_main=(int)yaya;

foo();

int j = 0x88; //技巧所在

}

当我们disassemble这个函数时得到的汇编代码可能比较多,而我们感兴趣的只有func2这一段代码。就可在上下两段中加入标识行。然后在反汇编的汇编代码中查找标识7788然后只要看这中间的就OK了。注意千万不能加优化选项,因为加优化选项这些没有起实际作用的代码会被优化掉。另外最好用16进制作标识,因为立即数会以16进制显示。

在不优化的时候其反汇编的代码如下:

0x080483d6 <main+0>: lea 0x4(%esp),%ecx

0x080483da <main+4>: and $0xfffffff0,%esp

0x080483dd <main+7>: pushl -0x4(%ecx)

0x080483e0 <main+10>: push %ebp

0x080483e1 <main+11>: mov %esp,%ebp

0x080483e3 <main+13>: push %ecx

0x080483e4 <main+14>: sub $0x10,%esp

0x080483e7 <main+17>: movl $0x1,-0x10(%ebp)

0x080483ee <main+24>: movl $0x77,-0xc(%ebp)

0x080483f5 <main+31>: movl $0x804839f,-0x10(%ebp)

0x080483fc <main+38>: call 0x80483ba <foo>

0x08048401 <main+43>: movl $0x88,-0x8(%ebp)

0x08048408 <main+50>: add $0x10,%esp

0x0804840b <main+53>: pop %ecx

0x0804840c <main+54>: pop %ebp

0x0804840d <main+55>: lea -0x4(%ecx),%esp

0x08048410 <main+58>: ret

我们只需要查看红色字符中的代码段就OK了。

你可能感兴趣的:(linux,J#)