手脱UPX壳方法介绍

脱壳技术详解
本文详细介绍六种脱壳方法,包括单步跟踪、ESP定律法、2次内存镜像法等,帮助读者理解如何通过不同技术定位OEP,实现脱壳。文章深入探讨了OllyDump插件和LordPE工具的使用,以及脱壳脚本的应用。
方法1:单步跟踪

F8单步跟踪,向上不能让他跳,有loopd循环也一样(跳转的下一行按F4:运行到选定位置,循环loopd在call下一句F4执行)

只允许向下跳,如单步跟踪CALL处程序运行,则需要重载程序,再CALL处F7跟进(近CALL F7,远CALL F8)

pushad 入栈 
popad:出栈 出栈就离OEP不远了
看基址如有大的跳转则为调到OEP,到达OEP后就壳脱壳
 
005791EE    61              popad
005791EF  - E9 98E1EFFF     jmp rmvbfix.0047738C
 
0047738C    55              push ebp
0047738D    8BEC            mov ebp,esp
0047738F    83C4 F0         add esp,-0x10
00477392    B8 2C714700     mov eax,rmvbfix.0047712C                 ; UNICODE "K"
找到OEP后下来就是脱壳,两种方法
1)OD插件OllyDump,
2)LordPE:选择进程->修正镜像大小并完整保存->运行ImportREC输入表重建程序,找进程,OEP改为找到的OPE基址,取后5位,然后自动查找IAT,获取输入表,修复转存文件
注:如遇到SRV病毒,需要脱壳后在导入OD分析,如下位SRV病毒OEP特点
00579080    60              pushad
00579081    BE 00104F00     mov esi,rmvbfix.004F1000
00579086    8DBE 0000F1FF   lea edi,dword ptr ds:[esi-0xF0000]
0057908C    57              push edi
0057908D    83CD FF         or ebp,-0x1
00579090    EB 10           jmp short rmvbfix.005790A2
方法2:ESP定律法
F8单步一下进入下一行,寄存器窗口ESP显示红色,ESP右键 数据窗口中跟随或命令 dd或hr ESP基址来到大跳转->在第一行数值 右键 断点-硬件访问断点 word->F9运行->删除硬件断点,单步直达OEP
dd XXXXX-->ESP地址
hr XXXXX-->ESP地址
 
方法3:2次内存镜像法
m:在区段的程序段.rsrc(第一个.rsrc)下断点,运行,然后在进入m在00401000在下断点运行,F8单步到popad->oep
注意:如在第一个程序区段无.rsrc,则直接在00401000(code)处下断点
 
方法4:一步直达法
不是什么壳都适用。绝大多数UPX和ASPACK
查找popad(取消勾选整个区块),单步到大跳转OEP,可多次查找popad
方法5.最后一次异常法
1.调试选项忽略所有异常

 

载入程序shift+F9运行知道程序运行跑飞,记下次数比如5次,则重新载入按5-1=4次,然后找到如下SE句柄,转到表达式,然后下断点并运行,取消断点然后单步跟踪

 


 

方法6.脱壳脚本

插件-》OdbgScript-运行脚本 打开脱壳脚本,直达OEP(不一定准确,不准时需继续单步)

<think> 我们正在讨论如何手动UPXUPX是一种常见的可执行文件压缩工具,加后的程序在运行时会在内存中解压缩原始代码并执行。脱壳的目标是恢复原始程序的代码(即到达OEP,原始入口点),以便进行进一步的分析或修改。 根据引用内容,UPX的常见方法有: 1. 硬件断点法(利用PUSHAD/POPAD) 2. 单步跟踪法(F8单步步过,注意跳转方向) 3. 内存镜像法(在内存中设置断点) 4. ESP定律法(利用堆栈平衡) 下面我将详细介绍这些方法,并整合引用中的信息: ### 1. 硬件断点法(快速方法) - 原理:UPX在开始解压前会保存所有通用寄存器(PUSHAD指令),在解压完成后恢复(POPAD指令)。我们可以在压入寄存器的栈地址设置硬件断点,当执行POPAD时触发断点,从而快速到达跳向OEP的指令附近。 - 步骤: a. 用调试器(如OllyDbg, x64dbg)加载加程序,停在入口点(EP)。 b. 单步执行到`PUSHAD`(将所有寄存器压入堆栈),此时在堆栈窗口中可以看到压入的寄存器值。 c. 在堆栈中找到任意一个寄存器的存储地址(例如EAX对应的地址),在该地址上设置硬件写入断点(因为POPAD时会写入该地址)。 d. 运行程序(F9),程序会在POPAD之后中断。 e. 此时附近会有一个大的跳转(JMP)指令,执行该跳转就会到达OEP。 ### 2. 单步跟踪法(传统方法) - 步骤: a. 加载程序,停在EP。 b. 一直按F8(单步步过),注意观察跳转指令。 c. 如果遇到向上的跳转(通常是循环),则在该跳转指令的下一行按F4(运行到指定位置),避免进入循环。 d. 保持程序执行方向向下,直到遇到一个较大的跳转(如长跳转JMP或RET),跳转后通常能看到`POPAD`指令,然后到达OEP。 ### 3. 内存镜像法 - 原理:在程序解压代码到原始节区(如UPX0)时,通过在该节区设置内存访问断点,当代码解压完成并执行到原始代码时触发断点。 - 步骤: a. 加载程序,停在EP。 b. 在内存映射窗口中找到UPX0节区(通常是第一个节区,具有内存读写权限但磁盘大小为0)。 c. 在UPX0节区上设置内存访问断点(执行断点)。 d. 运行程序,当解压代码写入UPX0并开始执行原始代码时,调试器会中断在OEP附近。 ### 4. ESP定律法 - 原理:利用堆栈指针(ESP)在PUSHAD后的变化,在堆栈地址设置硬件访问断点。 - 步骤: a. 在EP执行PUSHAD后,观察ESP的值(堆栈指针会减少0x20,32位程序)。 b. 在ESP指向的地址设置硬件访问断点(写或读,通常设置写断点)。 c. 运行程序,当程序修改堆栈(如执行POPAD)时,断点触发。 d. 然后单步跟踪到跳向OEP的指令。 ### 注意事项 - 脱壳后,使用Scylla、OllyDump等插件将内存中的程序转储到文件,并修复导入表(IAT)。 - UPX通常不会加密,所以脱壳相对简单。但要注意版本差异,不同版本的UPX可能有细微差别。 ### 脱壳步骤总结 1. 找到OEP(使用上述方法之一)。 2. 转储进程内存(Dump)。 3. 修复导入表(因为加程序会修改导入表,使其指向的加载函数,需要修复为原始API地址)。 4. 重建PE文件(可选,有些工具在转储时会自动重建)。 ### 示例(硬件断点法) 以引用[2]为例: - 入口点:`PUSHAD` - 堆栈窗口:找到压入的寄存器,例如EAX的地址(0x000DFF64)。 - 在该地址设置硬件写入断点。 - 运行(F9),程序中断在`POPAD`之后。 - 执行后面的`JMP`指令,到达OEP。 §§相关问题§§ 1. 如何修复脱壳后的程序导入表? 2. 如何识别不同版本的UPX? 3. 脱壳后转储进程内存的工具有哪些? 4. 如何应对UPX的变种或修改版? </think>### 手动UPX方法总结 根据引用内容,UPX是常见压缩脱壳核心是找到原始入口点(OEP)。以下是四种主流方法: #### 1. **硬件断点法(推荐)** [^2] - **原理**:利用`PUSHAD`保存寄存器和`POPAD`恢复寄存器的特性 - **步骤**: 1. 在入口点执行到`PUSHAD`后暂停 2. 在堆栈窗口找到压入的寄存器地址(如EAX地址) 3. 对该地址**设置硬件写入断点** 4. 运行程序(F9),中断在`POPAD`指令后 5. 执行紧随其后的`JMP`指令即到达OEP - **优势**:快速准确,适用于大多数UPX版本 #### 2. **单步跟踪法** [^3][^4] - **步骤**: 1. OD加载程序,选择"否"跳过压缩代码分析 2. 持续按`F8`单步步过 3. 遇到**向上跳转**(红色箭)时: - 在跳转指令下一行按`F4`(运行到光标) - 避免进入解压循环 4. 最终定位到`POPAD`后的大跳转(JMP/RET) - **特征**: - 需经过多次解压循环(通常3-4轮) - 最后一轮解压后出现跨段跳转 #### 3. **ESP定律法** - **原理**:利用堆栈指针平衡特性 - **步骤**: 1. 入口点执行`PUSHAD`后 2. 寄存器窗口右键ESP值 -> **HW breakpoint [Write]** 3. 运行程序(F9)中断后 4. 单步跟踪到OEP跳转 #### 4. **内存断点法** - **步骤**: 1. 加载程序后,在内存映射窗口 2. 定位UPX0节区(磁盘大小=0的节) 3. 右键设置**Memory on access**断点 4. 运行后中断在解压代码写入位置 5. 单步跟踪至OEP ### 关键特征识别 1. **入口点特征**: ```assembly PUSHAD ; 保存所有寄存器 MOV ESI, <压缩数据地址> LEA EDI, [ESI-<偏移值>] ``` 2. **解压循环**: - 多轮循环结构(常见4轮) - 包含`LODSB`/`STOSB`等串操作指令 3. **OEP跳转标志**: ```assembly POPAD ; 恢复寄存器 JMP <OEP地址> ; 跨段长跳转(通常0x0040xxxx) ``` ### 工具推荐 - Windows:OllyDbg(OD) + Scylla插件 - Linux:GDB配合脚本 - 自动化:UPX -d(仅适用于未修改版本)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值