电脑入门的基础知识:脱壳基础知识入门

  现在加解密发展己形成2个分支了个就是传统算法个就是加密壳越来越多软件Software采用了密码学相关算法现在要做出个软件Software注册机己不象前几年那么容易这就要求解密者必须要有数学功底和密码学知识而这些在短时间内是不容易掌握除了密码学应用越来越多软件Software加壳了因此要求解密者必须掌握些脱壳技术这就使得壳成了解密必须迈过个门槛壳发展到今天强度越来越高了将许多人挡在门外使得大家望壳兴叹另外论坛现在两极分化比较严重高手讨论脱壳技术新手看不懂很多人想学脱壳但看到壳这么难只好放弃了造成新手和高手间个断档为了鼓励更多新人加入脱壳行列很有必要将壳有关知识整理总结www.pediy.com主页提供教学确实有点过时了己到非更新不可了为此整理这篇脱壳入门指导文章方便脱壳新手们学习相对于密码学算法脱壳并不难只要肯花时间短期内还是比较容易取得成绩

  但是不建议那些加解密刚入门调试个普通软件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.2xFileInfo报“*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
  中断后别忘点击菜单“调试/硬件断点/”打开硬件断点面板将刚才硬件断点删除

Tags:  脱壳工具 电脑基础知识入门 计算机基础知识入门 电脑入门的基础知识

延伸阅读

最新评论

发表评论