aingWM 2019-07-31 19:32 采纳率: 50%
浏览 459
已采纳

Linux下反汇编C语言程序,其中有个匿名的且非常简短的函数,通过分析发现这个函数好像没有任何意义?

/* C语言代码如下 */
int add(int a, int b)
{
    return (a+b);
}

int main(int argc, char *argv[])
{
    int a = 10;
    int b = 20;
    int result = 0;

    result = add(1, 2);
    result = add(a, b);

    return 0;
}
/* -------------------------------------- */

使用如下命令生成可执行文件“main_32bit_exe”:

gcc -m32 -c main.c -o main_32bit.o

ld -m elf_i386 -s main_32bit.o -o main_32bit_exe

通过如下命令获得其反汇编代码:
objdump -d -M intel main_32bit_exe

08048094 <.text>:
 8048094:   55                      push   ebp
 8048095:   89 e5                   mov    ebp,esp

 8048097:   e8 5b 00 00 00          call   0x80480f7 **; 调用了一个未知的匿名函数(且没有任何意义)**

 804809c:   05 64 1f 00 00          add    eax,0x1f64
 80480a1:   8b 55 08                mov    edx,DWORD PTR [ebp+0x8]
 80480a4:   8b 45 0c                mov    eax,DWORD PTR [ebp+0xc]
 80480a7:   01 d0                   add    eax,edx
 80480a9:   5d                      pop    ebp
 80480aa:   c3                      ret    
 80480ab:   55                      push   ebp
 80480ac:   89 e5                   mov    ebp,esp
 80480ae:   83 ec 10                sub    esp,0x10
 80480b1:   e8 41 00 00 00          call   0x80480f7
 80480b6:   05 4a 1f 00 00          add    eax,0x1f4a
 80480bb:   c7 45 f4 0a 00 00 00    mov    DWORD PTR [ebp-0xc],0xa
 80480c2:   c7 45 f8 14 00 00 00    mov    DWORD PTR [ebp-0x8],0x14
 80480c9:   c7 45 fc 00 00 00 00    mov    DWORD PTR [ebp-0x4],0x0
 80480d0:   6a 02                   push   0x2
 80480d2:   6a 01                   push   0x1
 80480d4:   e8 bb ff ff ff          call   0x8048094
 80480d9:   83 c4 08                add    esp,0x8
 80480dc:   89 45 fc                mov    DWORD PTR [ebp-0x4],eax
 80480df:   ff 75 f8                push   DWORD PTR [ebp-0x8]
 80480e2:   ff 75 f4                push   DWORD PTR [ebp-0xc]
 80480e5:   e8 aa ff ff ff          call   0x8048094
 80480ea:   83 c4 08                add    esp,0x8
 80480ed:   89 45 fc                mov    DWORD PTR [ebp-0x4],eax
 80480f0:   b8 00 00 00 00          mov    eax,0x0
 80480f5:   c9                      leave  
 80480f6:   c3                      ret    
 80480f7:   8b 04 24                mov    eax,DWORD PTR [esp]
 80480fa:   c3                      ret    

图片说明

通过分析该汇编代码可知
地址 0x08048094 处对应 C 语言源代码中的 add() 函数
地址 0x080480ab 处对应 C 语言源码中的 main() 函数
但是地址 0x080480f7 处是一个未知函数,且它在(汇编版) add() 函数中被调用了,可是
通过分析发现该函数没有任何意义,不知此处为什么要调用这样一个函数?

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-07-31 22:08
    关注

    反汇编的代码并不完全能说明作者编写的意图。
    实际上由于编译器优化的存在,jmp和call其实是混淆的,因此有时候反汇编程序报告的“函数”往往并不是真正的函数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序