关闭

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

标签: 反汇编
348人阅读 评论(0) 收藏 举报
分类:

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

首先看一个函数:

.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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7073次
    • 积分:135
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类