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了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值