反汇编奇怪代码,利用指令地址定位全局变量

来源:互联网 发布:手机维修软件 编辑:程序博客网 时间:2024/05/21 10:10

全局变量的地址是已知的,所以我们一般就直接用全局变量的地址对其访问,或许为了阻碍反汇编,今天就遇到了这样一个例子。

首先看一个函数:

.text:00077464 sub_77464       proc near              .text:00077464                 nop.text:00077465                 nop.text:00077466                 nop.text:00077467                 nop.text:00077468                 nop.text:00077469                 nop.text:0007746A                 nop.text:0007746B                 nop.text:0007746C                 mov     ebx, [esp+0].text:0007746F                 retn.text:0007746F sub_77464       endp

nop指令是空指令,不用管他。

当某一函数A调用(call)这个sub_77464时,栈顶保存的是函数A中call指令的下一条指令的地址。所以mov ebx, [esp+0](+0似乎也是为了妨碍反编译)就取得了指令地址。

函数A中就可以利用ebx来定位全局变量了,比如:

.text:002E5250                 push    ebp.text:002E5251                 push    edi.text:002E5252                 push    esi.text:002E5253                 push    ebx.text:002E5254                 call    sub_77464       ; [esp] -> ebx.text:002E5254                                         ; 用EIP(下一指令地址)来定位全局变量.text:002E5259                 add     ebx, 452D9Bh    ; E.text:002E525F                 lea     esp, [esp-52Ch].text:002E5266                 mov     eax, [esp+53Ch+arg_18].text:002E526D                 mov     edx, [esp+53Ch+arg_0].text:002E5274                 mov     [esp+53Ch+var_510], eax.text:002E5278                 mov     eax, [esp+53Ch+arg_30].text:002E527F                 mov     [ebx+0EA4h], eax ; A.text:002E5285                 mov     eax, [ebx-898h] ; B.text:002E528B                 mov     [ebx+99654h], edx ; C.text:002E5291                 mov     eax, [eax].text:002E5293                 test    al, 2.text:002E5295                 mov     [esp+53Ch+var_51C], eax.text:002E5299                 jz      loc_2E540A.text:002E529F                 lea     eax, [ebx-22E509h] ; D.text:002E52A5                 mov     [esp+53Ch+name], eax ; name.text:002E52A8                 call    _opendir.text:002E52AD                 xor     esi, esi.text:002E52AF                 test    eax, eax.text:002E52B1                 mov     ebp, eax.text:002E52B3                 jnz     loc_2E53BE.text:002E52B9                 jmp     loc_2E53FE

A、B、C、D、E处就用ebx来得到全局变量的地址。特别是E处,似乎也能起到阻碍反编译的效果。后面的大数字会被误认为是地址,然后其所指的目标就会被认为是数据,若一不小心是代码,那么就无法正确生成函数了。


可惜道高一尺,魔高一丈,IDA已经看破了这一招,一下是IDA整理出的代码:

.text:002E5250                 push    ebp.text:002E5251                 push    edi.text:002E5252                 push    esi.text:002E5253                 push    ebx.text:002E5254                 call    sub_77464       ; [esp] -> ebx.text:002E5254                                         ; 用EIP(下一指令地址)来定位全局变量.text:002E5259                 add     ebx, (offset loc_452D9A+1).text:002E525F                 lea     esp, [esp-52Ch].text:002E5266                 mov     eax, [esp+53Ch+arg_18].text:002E526D                 mov     edx, [esp+53Ch+arg_0].text:002E5274                 mov     [esp+53Ch+var_510], eax.text:002E5278                 mov     eax, [esp+53Ch+arg_30].text:002E527F                 mov     (dword_738E98 - 737FF4h)[ebx], eax.text:002E5285                 mov     eax, ds:(off_73775C - 737FF4h)[ebx].text:002E528B                 mov     ds:(dword_7D1648 - 737FF4h)[ebx], edx.text:002E5291                 mov     eax, [eax].text:002E5293                 test    al, 2.text:002E5295                 mov     [esp+53Ch+var_51C], eax.text:002E5299                 jz      loc_2E540A.text:002E529F                 lea     eax, (aProc - 737FF4h)[ebx] ; "/proc".text:002E52A5                 mov     [esp+53Ch+name], eax ; name.text:002E52A8                 call    _opendir.text:002E52AD                 xor     esi, esi.text:002E52AF                 test    eax, eax.text:002E52B1                 mov     ebp, eax.text:002E52B3                 jnz     loc_2E53BE.text:002E52B9                 jmp     loc_2E53FE



0 0
原创粉丝点击