但是不建议那些加解密刚入门调试个普通软件Software都费劲朋友来脱壳至少要等你有定调试技能再来学脱壳也就是说必须掌握这篇文章所讲东西:
第课PE格式
要想学脱壳第步就得掌握PE格式PE是PortableExecutableFileFormat(可移植执行体)简写它是目前Windows平台上主流可执行文件格式 MicrosoftVisualC提供WINNT.H里有PE数据结构完整定义
学习PE格式思路方法是自己先准备个十 6进制工具如HexWorkshopWinHex用这些工具打开个EXE文件对照着学强烈推荐你用
Stud_PEv.2.2.0.5这款工具辅助学习PE格式PE格式学习重点是在输入表(ImportTable)这块
Stud_PE工具界面:
PE结构图:
第 2课SEH技术
结构化异常处理(StructuredExceptionHandlingSEH)是Windows操作系统处理或异常技术SEH是Windows操作系统种系统机制和特定设计语言无关
外壳里大量地使用了SEH如果不了解SEH将会使你跟踪十分困难
由于Ollydbg 对SEH处理异常灵活因此脱壳用Ollydbg会大大提高效率
附CONTEXT结构环境:
代码:typedefstruct_CONTEXT{
/*000*/DWORD ContextFlags;
/*004*/DWORD Dr0;
/*008*/DWORD Dr1;
/*00C*/DWORD Dr2;
/*010*/DWORD Dr3;
/*014*/DWORD Dr6;
/*018*/DWORD Dr7;
/*01C*/FLOATING_SAVE_AREAFloatSave;
/*08C*/DWORD SegGs;
/*090*/DWORD SegFs;
/*094*/DWORD SegEs;
/*098*/DWORD SegDs;
/*09C*/DWORD Edi;
/*0A0*/DWORD Esi;
/*0A4*/DWORD Ebx;
/*0A8*/DWORD Edx;
/*0AC*/DWORD Ecx;
/*0B0*/DWORD Eax;
/*0B4*/DWORD Ebp;
/*0B8*/DWORD Eip;
/*0BC*/DWORD SegCs;
/*0C0*/DWORD EFlags;
/*0C4*/DWORD Esp;
/*0C8*/DWORD SegSs;
/*0CC*/ BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
/*2CC*/}CONTEXT;
第 3课认识壳1.什么是壳?
在些计算机软件Software里也有段专门负责保护软件Software不被非法修改或反编译它们般都是先于运行拿到控制权然后完成它们保护软件Software任务由于这段和自然界壳在功能上有很多相同地方基于命名规则就把这样称为“壳”了
描述壳示意图:
2.壳加载过程
这里谈加壳工具不是WinZIP、WinRAR等数据压缩工具而是谈压缩可执行文件EXE或DLL工具加壳过EXE文件是可执行文件它可以同正常EXE文件样执行用户执行实际上是外壳这个外壳负责把用户原来在内存中解压缩并把控制权交还给解开后真正这切工作都是在内存中运行整个过程对用户是透明
壳和病毒在某些方面比较类似都需要比原代码更早获得控制权壳修改了原执行文件组织结构从而能够比原代码提前获得控制权并且不会影响原正常运行
这里简单说说般壳装载过程(参考了Ljtt以前写过篇文章)
1)获取壳自己所需要使用API地址
如果用PE编辑工具查看加壳后文件会发现未加壳文件和加壳后文件输入表不样加壳后输入表般所引入DLL和API很少甚至只有Kernel32.dll以及GetProcAddress这个API
壳实际上还需要其他API来完成它工作为了隐藏这些API它般只在壳代码中用显式链接方式动态加载这些API:3个脱壳相关重要介绍
2)解密原各个区块(Section)数据
壳出于保护原代码和数据目般都会加密原文件各个区块在执行时外壳将会对这些区块数据解密以让能正常运行壳般按区块加密那么在解密时也按区块解密并且把解密区块数据按照区块定义放在合适内存位置
如果加壳时用到了压缩技术那么在解密的前还有道工序当然是解压缩这也是些壳特色的比如说原来文件未加壳时1~2M大小加壳后反而只有几百K
3)重定位
文件执行时将被映像到指定内存地址中这个内存地址称为基地址(ImageBase)当然这只是文件中声明运行时能够保证系统定满足其要求吗?
对于EXE文件来说Windows系统会尽量满足例如某EXE文件基地址为0x400000而运行时Windows系统提供给基地址也同样是0x400000在这种情况下就不需要进行地址“重定位”了由于不需要对EXE文件进行“重定位”所以加壳软件Software把原文件中用于保存重定位信息区块干脆也删除了这样使得加壳后文件更加小巧有些工具提供“WipeReloc”功能其实就是这个作用
不过对于DLL动态链接库文件来说Windows系统没有办法保证每次DLL运行时提供相同基地址这样“重定位”就很重要了此时壳中也需要提供进行“重定位”代码否则原中代码是无法正常运行起来从这点来说加壳DLL比加壳EXE更难修正
4)HOOK-API
文件中输入表作用是让Windows系统在运行时提供API实际地址给使用在第行代码执行的前Windows系统就完成了这个工作
壳般都修改了原文件输入表然后自己模仿Windows系统工作来填充输入表中相关数据在填充过程中外壳就可填充HOOK-API代码地址这样就可间接地获得控制权
5)跳转到原入口点(OEP)
从这个时候起壳就把控制权交还给原了般壳在这里会有明显个“分界线”但现在猛壳己没这界限了壳里有肉肉里有壳
3.压缩引擎
各类加壳软件Software其压缩算法般不是自己实现大多是其他压缩引擎目前压缩引擎种类比较多区别压缩引擎有区别特点如些对图像压缩效果好些对数据压缩效果好而加壳软件Software选择压缩引擎有个特点在保证压缩比条件下压缩速度慢些关系不是太大但解压速度定要快这样加了壳EXE文件运行起来速度才不会受太大影响例如下面几个压缩引擎就能满足这要求:
1.aPLib压缩引擎http://www.ibsensoftware.com/这个库对于低于64K文件压缩效果较好速度较快
2.JCALG1压缩引擎相对于aPlibJCALG1对于大文件效果好些
3.LZMA压缩引擎http://www.7-zip.org/zh-cn/sdk.htmlLZMA是7-Zip中7z格式默认压缩算法压缩率很高
第 4课常见压缩壳和加密壳
加壳软件Software按照其加壳目和作用可分为两类:是压缩(Packers) 2是保护(Protectors)压缩这类壳主要目是减小体积如ASPacK、UPX和PECompact等另类是保护用上了各种反跟踪技术保护不被调试、脱壳等其加壳后体积大小不是其考虑主要原因如ASProtect、Armadillo、EXECryptor等随着加壳技术发展这两类软件Software的间界线越来越模糊很多加壳软件Software除具有较强压缩性能同时也有了较强保护性能
1.ASPacK
主页:http://www.aspack.com/
ASPack是款Win32可执行文件压缩软件Software可压缩Windows32位可执行文件(.exe)以及库文件(.dll、.ocx)文件压缩比率高达40%~70%
2.UPX
主页:http://upx.sourceforge.net/
UPX是个以命令行方式操作可执行文件经典免费压缩压缩算法自己实现速度极快压缩比极高(开源)
3.PECompact
主页:http://www.bitsum.com/
PECompact同样也是款能压缩可执行文件工具(支持EXE、DLL、SCR、OCX等文件)相比同类软件SoftwarePECompact提供了多种压缩项目选择用户可以根据需要确定哪些内部资源需要压缩处理同时该软件Software还提供了加解密插件接口功能
4.ASProtect
主页:http://www.aspack.com/
ASProtect是款非常强大Windows32位保护工具这4、5年来其直在更新进步其开发者是俄国人AlexeySolodovnikov它拥有压缩、加密、反跟踪代码、反-反汇编代码、CRC校验和花指令等保护措施它使用Blowfish、Twofish、TEA等强劲加密算法还用RSA1024作为注册密钥生成器它还通过API钩子(APIhooks包括Importhooks(GPAhook)和Exporthooks)和加壳进行通信甚至用到了多态变形引擎(PolymorphicEngine)反Apihook代码(Anti-ApihookCode)和BPE32多态变形引擎(BPE32PolymorphicEngine)并且ASProtect为软件Software开发人员提供SDK实现加密内外结合
第 5课文件类型分析
拿到个壳第步就是用相关工具分析下是什么壳然后就可心中有数地跟踪分析文件分析工具有PEIDFileInfo等
1.PEiD
PEiDGUI界面操作非常方便直观它原理是利用查特征串搜索来完成识别工作各种开发语言都有固定启动代码部分利用这点就可识别出是何种语言编编译同样区别壳也有其特征码利用这点就可识别是被何种壳所加密PEiD提供了个扩展接口文件userdb.txt用户可以自定义些特征码这样就可识别出新文件类型
有些外壳为了欺骗PEiD等文件识别软件Software会伪造启动代码部分例如将入口代码改成和VisualC6.0所编程入口处类似代码即可达到欺骗目所以文件识别工具所给出结果只是个参考文件是否被加壳处理过还得跟踪分析代码才可得知可参考这个文档了解如何伪装:让侦测工具把壳识别为VC7.0源代码 目前Hying壳PE-Armor伪装能力是最强:
PEiD分析不出类型文件就报告是“Nothingfound*”如出现这情况般都是未知壳或新版壳
下面PEiD识别出这个软件Software是用Asprotect1.2x加壳
2.FileInfo
FileInfo(简称Fi)另款不错文件检测工具Fi运行时是DOS界面在DOS窗口中运行相当不便建议采用下面窍门技巧:
1.用鼠标将文件拖到Fi主文件上
2.将Fi快捷方放进WindowsSendTo文件夹里.以后要分析某文件只需右击“发送到”功能就可打开Fi
FileInfo升级慢其识别库不能自定义而PEiD升级比较频繁用户也可自定义特征码因此PEiD用比较普遍
有时FileInfo和PEID会报“PEWinGUI”WinGUI就是Windows图形用户界面统称表明可能没加壳但不排除也有加壳可能性下图是个ExeCryptor2.2x壳FileInfo报“*PEWinGUI*section*??”其不能识别出来识别信息中带了个问号表明FI对给出结果不是太肯定
第 6课寻找OEP
般压缩壳如Aspack等都有专用脱壳机 而加密壳(如ASProtect,Armadillo)般很少有脱壳机必须手工脱壳手工脱壳般情况是分 3步:是查找真正入口点(OEP); 2是抓取内存映像文件; 3是输入表重建(当然现在加密壳复杂些要考虑更多东西)
OEP是OriginalEntryPo缩写即加壳前真正入口点
外壳化现场环境(各寄存器值)和原现场环境是相同加壳化时保存各寄存器值外壳执行完毕会恢复各寄存器内容其代码形式般如下:
PUSHFD ;将标志寄存器入栈保存
PUSHAD ;pusheax,ecx,edx,ebx,esp,ebp,esi,edi
…… ;外壳代码部分
POPAD ;popedi,esi,ebp,esp,ebx,edx,ecx,eax
POPFD ;恢复标志寄存器
JMPOEP ;
OEP:…… ;解压后原代码
为了讲述方便本节用UPX加壳Win98记事本来演示首先用PEid查看加壳前记事本:PEid显示Notepad.exe是用MicrosoftVisualC6.0编译接下来用UPX来加壳思路方法是开个DOS窗口用命令upxnotepad.exe如下图所示:
这时再用PEid查看加壳文件PEid会给出如下信息:UPX0.89.6-1.02/1.05-1.24->Markus&Laszlo
UPX壳可以用UPX.exe自身来脱命令是:upx-d文件名些变种UPX壳用UPX.EXE自身脱不了这时可以试试UPXShellEx这款工具
本节例子下载:notepad.upx.rar
脱壳前建议用PE工具LordPE打开目标文件查看下区块以尽可能地多了解些信息对脱壳有帮助如下图:
1.根据跨段指令寻找OEP
推荐用Ollydbg来调试脱壳比SoftICE和TRW2000方便多了运行Ollydbg点击菜单“选项/调试设置”将第次暂停设在WinMain上再用Ollydbg打开例子notepad.upx.exe就可中断在外壳入口点处了:
上图相关代码如下:
0040E8C0> 60 pushad //开始Ollydbg就会中断这行这个就是外壳入口点,注意这个pushad指令
绝大多数加壳在被加密中加上个或多个段所以依据跨段转移指令(JMP)就可找到真正入口点此时就会有POPAD/POPFD指令出现UPX用了次跨段转移指令(JMP)在跳到OEP处会看到虚拟地址值有个突变此时就能确定OEP了
UPX壳比较简单大家不必要跟踪去找这个跨段转移指令中断WinMain后只需要在Ollydbg里往下翻屏就会发现这个跨段转移指令:
上图相关代码如下:
0040EA0E 61 popad //注意这里popad指令和开始pushad对应
0040EA0F -E9B826FFFF jmp 004010CC //这里跳到OEP,将光标移到这按F4执行到这行
这句0040EA0F jmp 004010CC就是跳到OEP指令执行到这UPX外壳己将解压完毕并模拟Windows加载器将原始加载到内存004010CC就是映射到内存目标入口点此时就可抓取内存映像文件了
2.根据堆栈平衡原理找OEP
这个堆栈平衡原理其找OEP原理这篇文档描述比较详细:寻找真正入口(OEP)--广义ESP定律作者:Lenus
操作思路方法:多数壳在运行到OEP时候ESP=0012FFC4这就是说第句是对0012FFC0进行写入操作只要在0012FFC0下硬件写入断点(命令行里键入HW12FFC0)我们就能停在OEP第 2句处
用OllyDBG重新加载例子notepad.upx.exe在命令行下硬件写断点:
按F9执行就会中断在OEP第 2行:
此时如果将光标向上移会发现第句代码变乱了:
004010C7 000D0A000055 add [5500000A],cl
004010CD 8BEC mov ebp,esp
这是Ollydbg将数据当汇编代码来分析了你可以按Ctrl+ALT+向上光标键将当前显示代码向上滚动个字节就可看到正确汇编代码了:004010CC 55 push ebp
004010CD 8BEC mov ebp,esp //中断在这行
004010CF 83EC44 sub esp,44
004010D2 56 push esi
004010D3 FF15E4634000 call [4063E4] ;kernel32.GetCommandLineA
中断后别忘点击菜单“调试/硬件断点/”打开硬件断点面板将刚才硬件断点删除
最新评论