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

原创 2015年11月20日 17:39:26

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

首先看一个函数:

.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



C++反汇编九(全局变量与局部变量)

00401020 push ebp 00401021 mov ebp,esp 00401023 sub esp,44h 00401026 ...

IOS开发-自定义全局变量方法来定位界面元素的方法

假期的时候在写demo的时候遇到一个IOS界面元素定位的问题,今天跟同事交流这个问题,同事的思路是使用自定义全局变量、方法,或者可以叫定制全局变量和方法来实现界面元素的查找,思路如下: 1.在引入头...
  • lxp1021
  • lxp1021
  • 2015年02月27日 12:16
  • 1649

WinCE-Bootloader全局变量重定位及KernelRelocate函数

总觉得自己不是搞技术的料,所以都不敢到这一方地发表点什么,最近发现年纪大了,记性太差,故留点字迹备日后查询 第一篇文章还是选择转载别人的吧   转自:http://blog.csdn.net/kath...

全局变量重定位和KernelRelocate函数

1 为什么要对全局变量重定位 首先研究为什么要对Bootloader的全局变量执行重新定位的问题。在Bootloader的源代码中不可避免的要定义一些全局变量,这些全局变量被放置在编译得到的可执行二...
  • bdc995
  • bdc995
  • 2011年10月19日 10:46
  • 479

linux 反汇编分析变量地址并用gdb修改运行中的程序内存变量实验

准备样本文件: a.c #include #include unsigned int a=0xFFFFFFFF; unsigned int b=0xEEEEEEEE; void main...

黑马程序员——c语言的全局变量和局部变量,static和extern,预处理指令

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、全局变量和局部变量 根据变量的作用域,可以分为:局部变量、全局变量  1.局部变量...
  • jerome3
  • jerome3
  • 2015年04月13日 14:20
  • 400

罗云彬win32汇编教程笔记 Win32汇编的全局变量与局部变量

Win32汇编的全局变量与局部变量 变量的值在程序运行中是需要改变的,所以它必须定义在可写的段内,如 .data和 .data?,或者在堆栈内。 按照定义的位置不同,MASM中的变量也分为全局变量...
  • cay22
  • cay22
  • 2012年03月12日 17:14
  • 3559

读写全局变量

  • 2013年09月29日 11:46
  • 8KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反汇编奇怪代码,利用指令地址定位全局变量
举报原因:
原因补充:

(最多只允许输入30个字)