IDA Pro生成的这段代码是什么意思?

逆向工程 艾达 拆卸 部件 反汇编者 纳姆
2021-06-28 16:22:53

测试平台为Linux 32位。

我使用 IDA Pro 从由 gcc 4.6.3 编译的 coreutils 8.5 中反汇编 basename

这是 IDA Pro 生成的代码片段

           call    _i686_get_pc_thunk_bx                                 
           add     ebx, 292Eh
           sub     esp, 18h
           mov     eax, ds:(__dso_handle_ptr - 804DFF4h[ebx]
           test    eax, eax
           jz      short loc_804B6F8
           mov     eax, [eax]

     loc_804B6DB:
           mov     [esp+1Ch+var_14], eax
           mov     eax, [esp+1Ch+arg_0]
           mov     dword [esp+1Ch+var_18], 0
           mov     [esp+1Ch+var_1C], eax
           call    __cxa_atexit
           add     esp, 18h
           pop     ebx
           retn

     loc_804B6F8:
           xor     eax, eax
           jmp     short loc_804B6DB

我不明白这一行:

mov     eax, ds:(__dso_handle_ptr - 804DFF4h[ebx]

搜索代码后,我只能找到这个:

        __dso_handle    dd 0

在 .data 部分。

所以我的问题是:

  1. 这行是什么意思..?它就像一个版本检查的东西..?
  2. 我可以在不影响代码功能的情况下安全地删除这一行吗?
1个回答

您正在查看编译为与位置无关的代码的二进制文件。call _i686_get_pc_thunk_bx与下面除了ebx这一点的节目。如果你看一下反汇编,你会看到add ebx, 292Eh加0x292E的地址会导致GOT的首地址。这就是为什么在下一行中,_dso_handle_ptr 以如此“有趣”的方式被解决。

然而,IDA 足以在反汇编中向您展示这一点,因为您通常只会看到 0xSOMEADDR[ebx]。

就第二个问题而言:该行检索一个全局变量,将其放入eax然后检查它是否为零。所以,你不应该只是“删除”那条线,因为它test eax, eax会使用一些旧的值eax(我相信你不会那么喜欢)。