反汇编奇怪代码,利用指令地址定位全局变量
来源:互联网 发布:手机维修软件 编辑:程序博客网 时间: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
- 反汇编奇怪代码,利用指令地址定位全局变量
- 反汇编定位代码崩溃位置_1
- 反汇编定位代码崩溃位置_2
- 反汇编定位代码崩溃位置_3
- 反汇编定位代码崩溃位置_4
- 反汇编---异常定位
- 反汇编异常定位
- dex 指令反汇编
- 静态 局部 全局变量 反汇编
- 反汇编----全局变量如何赋值
- 反汇编CALL地址
- 反汇编常见代码
- 反汇编代码
- 反汇编代码对照
- 查看反汇编代码
- 反汇编代码分析
- 反汇编代码格式
- 反汇编代码分析
- 未处理 System.InvalidCastExceptionMessage="无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 CO
- 新手适用Android开发的10大技巧
- 航空母舰为什么会取代战列舰
- Objective-c的block(块)
- sql中处理下划线、百分号等转义字符
- 反汇编奇怪代码,利用指令地址定位全局变量
- 如何在Tableau Desktop中创建自定义调色板 - 优阅达
- IntelliJ IDEA 11.1.3创建Maven Web项目
- .net多层架构
- 协议森林06 瑞士军刀 (ICMP协议)
- MT7620原生SDK支持HUAWEI 4G dongle
- jquery生成地图的插件JVectorMap初体验
- 安装lamp进行一些修改
- CardView属性的解释