脱壳基础知识入门
(完整版)常见几种脱壳方法

----------------<小A分>----------------一、概论壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳(强壳)两种"UPX" "ASPCAK" "TELOCK" "PELITE" "NSPACK(北斗)" ... "ARMADILLO" "ASPROTECT" "ACPROTECT" "EPE(王)" "SVKP" ...顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。
当然加密壳的保护能力要强得多!-----------<小A分割线>-------------二、工具的认识OllyDBG ring3 shell层级别的动态编译工具、PEid、ImportREC、LordPE、softIce ring0级别调试工具-------------<小A分割>-------------------三、常见手动脱壳方法预备知识1.PUSHAD (入栈/压栈)代表程序的入口点,2.POPAD (弹栈/出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。
------------<小A分割线>--------------------方法一:单步跟踪法1.用OD载入,点“不分析代码!”2.单步向下跟踪F8,实现向下的跳。
也就是说向上的跳不让其实现!(通过F4)3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN 的一般很快就会到程序的OEP。
脱壳

常见脱壳知识:1.PUSHAD (压栈)代表程序的入口点2.POPAD (出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP 就在附近拉!3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP),只要我们找到程序真正的OEP,就可以立刻脱壳。
开始正式介绍方法啦!!方法一:1.用OD载入,不分析代码!2.单步向下跟踪F8,是向下跳的让它实现3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。
方法二:ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)1.开始就点F8,注意观察OD右上角的寄存器中ESP有没出现。
2.在命令行下:dd 0012FFA4(指在当前代码中的ESP地址),按回车!3.选种下断的地址,下硬件访问WORD断点。
4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP,脱壳方法三:内存跟踪:1:用OD打开软件!2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!3:按ALT+M,DA打开内存镜象,找到第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,DA打开内存镜象,找到.RSRC上面的CODE,按F2下断点!然后按SHIFT+F9,直接到达程序OEP,脱壳!方法四:一步到达OEP(前辈们总结的经验)1.开始按Ctrl+F,输入:popad(只适合少数壳,包括ASPACK壳),然后按下F2,F9运行到此处2.来到大跳转处,点下F8,脱壳之!方法五:1:用OD打开软件!2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序!3:一开是程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按F9到程序运行的次数!4:CTRL+F2重载程序,按SHIFT+F9(次数为程序运行的次数-1次5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址!6:按F2下断点!然后按SHIFT+F9来到断点处!7:去掉断点,按F8慢慢向下走!8:到达程序的OEP,脱壳!前言细细回忆,学习Crack技术已经快2个月了,期间我学会的东西远比我以前任何一年内学的东西都多(专指计算机程序及系统了解情况)说到学脱壳也是最近一个月的时间,开始总是到处询问学习脱壳的方法,大多的答案就是看雪老大的书,谁也没有正面回答过.于是就自己摸索,略有一点思路,老大们估计是认为理所当然,对于我们小菜来说还是说白了比较合适.在这里我就班门弄斧一回,其实主要也是帮助一些朋友能更快的摸到门,不至于对只会照猫画虎,这些也是我当初我想问的那些问题的答案,都是些很基础的东西,说得不好还请高手指正.在此感谢看雪老大提供了如此之好论坛供大家学习交流,还写了一本很好的书指导像我这样的菜鸟,也感谢网上众多高手贡献出自己的脱壳手记,特别感谢heXer老大对本菜鸟的细心指点!顺便说一句,脱壳特别需要的是兴趣和耐心,如果没有耐心就......;)废话了一堆,我们下面进入正题:)结合娃娃Wom的新KG说说一般面对一个壳的简单分析方法一、找OEP脱壳的一般流程是:查壳->寻找OEP->Dump->修复查壳没什么好说的,FI和PEiD,不幸的是FI和PEiD都不能识别出这个壳:)我找OEP的一般思路如下:先看壳是加密壳还是压缩壳,压缩壳相对来说容易些,一般是没有异常,找到对应的popad后就能到入口,跳到入口的方式一般为1、jmp OEP2、push OEPret3、call OEP当然也有其他的,如je OEP等等,一般都是段之间的大跳转,OD的反汇编窗口里都是同一个段的内容,所以更好区别是否是段间跳转『这里我说说关于F8(Step Over)和F7(Step in)的一般方法,粗跟的时候一般都是常用F8走,但是有些call是变形的Jmp,此时就需要F7代过,区别是否是变形Jmp的一个简单方法是比较call的目标地址和当前地址,如果两者离的很近,一般就是变形Jmp了,用F7走』对于加密壳,我的方法一般是用OD载入,钩掉所有异常(不忽略任何异常,有时由于异常过多可以适当忽略一些异常),运行,数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,而对于这个壳可知是加密壳,Shift+F9 16次后运行,重来,Shift+F1 15次后到这0042CBD3 ^\73 DC jnb short kill_luj.0042CBB10042CBD5 CD 20 int 200042CBD7 64:67:8F06 0000 pop dword ptr fs:[0] <---这里一般的处理方法是找到pop fs:[0]处下断点或者是[esp+4]处下断点,如果学习一下SEH 的处理会更好些0012FF58 0012FFE0 Pointer to next SEH record0012FF5C 0042CBB7 SE handler <---这里一般包含Anti-Debug的代码0012FF60 0042CB8A RETURN to kill_luj.0042CB8A from kill_luj.0042CB90我首选第一种,在0042CBD7处下断之后,耐心的用F7走,因为变形call太多了...,关键注意一下往回跳的跳转,寻找合适的位置跳出循环,有耐心的话你就能这样走到OEP了;) 当然你也可以用另一个好东西——Trace,在Command里来个tc eip<42b000 (42b000是当前段的起始位置,滚动条拖到最上面就能看到了,一般程序编译的基地址为400000),OK,稍等一会我们就会停在这了(如果是ASPr可能要几分钟了)00419F68 55 push ebp <----停在这00419F69 8BEC mov ebp, esp00419F6B 83C4 F0 add esp, -10呵呵,OEP找到了;)当然,这个用PEiD就能找到OEP,比较一下,是不是一样:D,对于用PEiD找到的OEP 可以直接G到OEP此时就可以Dump了,用LordPE来Dump吧,由于有Anti-Dump,所以要先Correct Imagesize一下再Dump二、修复IAT由于加密壳对输入表进行了重定位,所以现在的文件还不能正常使用,我们的目标就是恢复它,先用ImportREC,填入正确的OEP, IA T AutoSearch, Get Import,无效的不少,Show Invalid, 右键->Trace Level1(Disasm),失败!!看来是只有自己恢复了。
第26课 asprotect脱壳系列

第26课asprotect脱壳系列[例 1]chap707 asprotect0.94b加壳用脱壳最基本的方法――esp硬件断点法很快来到这里push eax eax=442B98retn由retn返回即来到入口点oep,oep等于442B98。
用ollydump插件dump转储程序,注意“重建输入表”选项不要打对勾,因为asprotect这个壳比较复杂,我们需要用import reconstructor重建输入表。
注意:oep输入42b98,点IAT AutoSearch按钮;然后,点Get Imports按钮,再点右上方的show invalid按钮。
如图:231个指针没有认出来,不要惊慌,莫要害怕。
如图,右键选取1级修复。
修复后结果如下:接着,show invalid,选取2级、3级修复,可是很郁闷,这一个还是没有解决掉,还是1个。
关于asprotect的插件还很多,我们逐个试吧。
asprotect#1无效果,asprotect#2亦无效。
所有的均无效。
于是,只能猜函数了:如上图:这之间的出名的函数不多,我们最容易想到的就是跟壳密切相关的一个著名函数GetProcAddress,双击指针,如下图,在弹出的窗口中选取GetProcAddress,点ok即可至此,全部指针修复成功。
点Fix Dump按钮,选中刚才dump的文件即可。
脱壳成功![例 2]unpackme asprotect1.23RC1加壳Olly载入目标程序,“调试选项”中,忽略内存异常打上勾,其余全部不打勾。
如图:F9运行,出现异常,shift+F9 16次后程序运行。
故重新载入程序,F9运行,出现异常,shift+F9 16-1=15次后来到这里。
00E22CD1 3100 xor dword ptr ds:[eax],eax 00E22CD3 64:8F05 00000000 pop dword ptr fs:[0]00E22CDA 58 pop eax00E22CDB 833D 7C6DE200 00 cmp dword ptr ds:[E26D7C],0 00E22CE2 74 14 je short 00E22CF800E22CE4 6A 0C push 0C00E22CE6 B9 7C6DE200 mov ecx,0E26D7C00E22CEB 8D45 F8 lea eax,dword ptr ss:[ebp-8] 00E22CEE BA 04000000 mov edx,400E22CF3 E8 54E1FFFF call 00E20E4C00E22CF8 FF75 FC push dword ptr ss:[ebp-4]00E22CFB FF75 F8 push dword ptr ss:[ebp-8]00E22CFE 8B45 F4 mov eax,dword ptr ss:[ebp-C] 00E22D01 8338 00 cmp dword ptr ds:[eax],000E22D04 74 02 je short 00E22D0800E22D06 FF30 push dword ptr ds:[eax]00E22D08 FF75 F0 push dword ptr ss:[ebp-10] 00E22D0B FF75 EC push dword ptr ss:[ebp-14] 00E22D0E C3 retn以上红色所示的都是标志性的语句。
脱壳笔记——精选推荐

【脱壳一般流程】查壳(PEID、FI、PE-SCAN)--->寻找OEP(OD)--->脱壳/Dump(LordPE、PeDumper、OD自带的脱壳插件、PETools)--->修复(Import REConstructor)【工具介绍】1、查壳PEID--功能强大的侦壳工具,自带脱壳插件(但是,效果不怎么样)工作原理:核心是userdb.txt(大家看看就完全明白了)[通过壳的入口特征码进行辨认]使用方法:可以拖放、也可以把PEID添加到右键菜单里面去FI--功能强大的侦壳工具,DOS界面。
使用方法:可以拖放、可以使用DO S命令行2、寻找OEPollydbg的四个区域左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Ef lag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示.cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态.左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息.右下角的是当前堆栈情况,还有注释啊.几个经常使用的快捷键F2:在需要的地方下断点(INT3型断点)F3:选择打开程序F4:运行到所选择的那一行F7:单步进入F8:单步跟踪F9:执行程序(运行程序)其中要特别讲一下3个F9的区别和作用:根据Ollydbg.hlp的中文翻译Shif t+F9 -与F9相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
Ctrl+F9 - 执行直到返回,跟踪程序直到遇到返回,在此期间不进入子函数也不更新CPU数据。
因为程序是一条一条命令执行的,所以速度可能会慢一些。
按Esc键,可以停止跟踪。
Alt+F9 - 执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU 数据。
脱壳基本知识

脱壳基本知识在一些计算机软件里有一段专门负责保护软件不被非法修改或反编译的程序。
它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
以下是由店铺整理关于脱壳知识的内容,希望大家喜欢!壳的概念从技术的角度出发,壳是一段执行于原始程序前的代码。
原始程序的代码在加壳[1] 的过程中可能被压缩、加密……。
当加壳后的文件执行时,壳-这段代码先于原始程序运行,他把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。
软件的壳分为加密壳、压缩壳、伪装壳、多层壳等类,目的都是为了隐藏程序真正的OEP(入口点,防止被破解)。
作者编好软件后,编译成exe可执行文件。
1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。
2.需要把程序搞的小一点,从而方便使用。
于是,需要用到一些软件,它们能将exe可执行文件压缩,3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。
实现上述功能,这些软件称为加壳软件。
脱壳软件加壳一般属于软件加密,越来越多的软件经过压缩处理,给汉化带来许多不便,软件汉化爱好者也不得不学习掌握这种技能。
脱壳一般分手动和自动两种,手动就是用TRW2000、TR、SOFTICE等调试工具对付,对脱壳者有一定水平要求,涉及到很多汇编语言和软件调试方面的知识。
而自动就是用专门的脱壳工具来脱,最常用某种压缩软件都有他人写的反压缩工具对应,有些压缩工具自身能解压,如UPX;有些不提供这功能,如:ASPACK,就需要UNASPACK对付,好处是简单,缺点是版本更新了就没用了。
另外脱壳就是用专门的脱壳工具来对付,最流行的是PROCDUMP v1.62 ,可对付各种压缩软件的压缩档。
在这里介绍的是一些通用的方法和工具,希望对大家有帮助。
我们知道文件的加密方式,就可以使用不同的工具、不同的方法进行脱壳。
下面是我们常常会碰到的加壳方式及简单的脱壳措施,供大家参考:脱壳的基本原则就是单步跟踪,只能往前,不能往后。
脱壳基础知识入门之Dump内存映像

外壳程序解压还原后就会跳到OEP处执行,此时内存映像文件是己解压的程序。
这时就可抓取内存映像文件了(该过程称为Dump)。
当然不一定非要在程序原入口点抓取,只要能保证内存映像文件是己还原的就行了。
继续上一个实例notepad.upx.exe,到OEP后就可以Dump取内存映像文件:
004010CC55push ebp
004010CD8BEC mov ebp,esp
004010CF83EC44sub esp,44
运行LordPE.EXE,点击Options,默认选项如下:
默认选上“Fulldump:pasteheaderfromdisk”,PE头的信息直接从磁盘文件获得。
设置好后,在LordPE的进程窗口选择notepad.upx.exe,点击右键,执行“dumpfull”菜单命令。
如图:
将内存抓取的文件另存为dumped.exe,此时程序还不能运行,接下来就是重建输入表。
怎样使用脱壳软件

怎样使用脱壳软件使用脱壳软件是指将一个已经加壳和加密的程序进行去壳操作,以便分析其内部机制和功能。
脱壳操作可以帮助安全研究人员和逆向工程师了解加壳程序的运行方式,分析其潜在的恶意行为和风险,并可能发现潜在的漏洞和安全问题。
下面将介绍一般的脱壳过程和常用的脱壳软件。
一、脱壳软件使用的一般过程:2. 选择适合的脱壳软件:根据目标程序的特征和加壳方式选择合适的脱壳工具。
常见的脱壳软件有OllyDbg、x64dbg、IDA Pro等。
3.加载加壳程序到脱壳软件中:将获取到的加壳程序文件加载到所选的脱壳软件中,通常通过点击软件的“打开”或“载入”按钮来实现。
4.设置断点:在脱壳软件中设置断点,断点可以是程序入口点、解密函数等位置,以便在程序执行过程中暂停执行,并进行相应的分析。
5.运行加壳程序:运行被加载的加壳程序,让其开始执行。
通常,加壳程序在运行时会进行解密、反调试等处理,因此需要在适当的时机暂停执行。
6.分析解密过程:当加壳程序暂停时,可以通过逆向工程和调试工具分析解密过程。
可以查看内存中解密后的内容以及解密算法的具体实现,并将其保存下来。
7.脱壳并验证:经过分析和调试,获取到解密后的内容后,可以将其保存并进行验证。
验证过程可以是检查解密后的内容和原程序的差异、运行解密后的程序以验证其功能等。
8.分析被脱壳程序:对脱壳的程序进行进一步分析,可能需要使用其他反汇编工具、动态分析工具和调试工具等进行代码阅读、数据流分析、函数调用跟踪等操作。
9.编写报告和总结:根据脱壳过程和分析结果,编写报告和总结,记录分析过程中发现的问题、风险和建议。
二、常用的脱壳软件:1. OllyDbg:这是一款非常流行的反汇编和调试工具,适用于Windows系统,可用于脱壳加壳的程序、病毒、逆向等操作。
2. x64dbg:这是一款免费的32位和64位反汇编和调试工具,提供了易于使用的界面和强大的功能,适用于Windows系统。
3. IDA Pro:这是一款高级的静态反汇编工具,可用于对加密代码进行分析和逆向工程,支持多种CPU架构和文件格式。
使用OllyDbg从零开始Cracking 第三十一章-脱壳简介

第三十一章-脱壳简介原定本章是要介绍P-CODE的Part3,然后再介绍脱壳的。
但是很多朋友跟我说P-CODE,WKT的教程有很多,并且现在P-CODE的应用程序已经很少了,没有必要过多的介绍P-CODE,希望我能够多讲讲壳,提高大家脱壳的能力。
所以说本章我们开始讨论壳,首先要给大家明确一点,壳的种类繁多(PS:这里说种类繁多,并不准确,种类也就那么几种,压缩壳,加密壳,虚拟机壳,所以说应该是数量多,之前发过一篇帖子收集了T4社区的各种脱壳脚本,充斥着各种各样的壳,大家可以看看),所以接下来的章节,我不会介绍所有的壳,只会给大家介绍壳的基本概念以及原理,还有几个具体壳的实例,大家不要指望看完本教程将能搞定所有壳,本教程的目的在于帮助大家理解壳的原理,锻炼大家解决未知壳的能力,大家要学会举一反三,触类旁通。
本章我们将介绍壳的基本概念,这对我们后面脱壳是大有裨益的,大家不要因为简单,就忽视它,后面章节,我们会介绍一些手工脱壳的实例。
首先大家可能会问为什么要给程序加壳?(PS:其实地球人都知道,嘿嘿)我们知道一个未加壳或者脱过壳的程序修改起来很方便,但是如果一个加过壳或者自修改的程序,要想修改它就比较困难了,我们在入口点(PS:这里指的入口点是壳的入口点)处修改程序是不起作用的,只有当壳把原程序区段解密完成后修改才能起作用。
加过壳的程序,原程序代码段通常是被加密过的,我们想修改它就不那么容易了。
加壳程序给目标程序加壳的原理通常是加密/压缩原程序各个区段,并且给目标程序添加一个或者多个区段作为原程序的引导代码(壳代码),然后将原程序入口点修改为外壳程序的入口点。
如果我们将加过壳的程序用OllyDbg加载的话,OllyDbg会停在壳的解密例程的入口点处,由此开始执行。
壳的解密例程(外壳程序)首先会定位加密/压缩过的原程序的各个区段,将其解密/解压,然后跳转至OEP(程序未加壳时的入口点)处开始执行。
现在我们来看一个最简单的壳,UPX壳,大家可以去下面网址中下载一个GUI版,名称为GUiPeX_Setup。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
脱壳基础知识入门现在加解密发展己形成2个分支了,一个就是传统的算法,另一个就是加密壳。
越来越多的软件采用了密码学相关算法,现在要做出一个软件注册机己不象前几年那么容易,这就要求解密者必须要有一定的数学功底和密码学知识,而这些在短时间内是不容易掌握的。
除了密码学的应用,越来越多的软件加壳了,因此要求解密者必须掌握一些脱壳技术,这就使得壳成了解密必须迈过的一个门槛。
壳发展到今天,强度越来越高了,将许多人挡在门外,使得大家望壳兴叹。
另外,论坛现在两极分化比较严重,高手讨论的脱壳技术新手看不懂,很多人想学脱壳,但看到壳这么难,只好放弃了,造成新手与高手间一个断档,为了鼓励更多新人加入脱壳的行列,很有必要将壳有关知识总结一下。
主页提供的教学确实有点过时了,己到非更新不可了。
相对于密码学算法,脱壳并不难,只要肯花时间,短期内还是比较容易取得成绩的。
第一课PE格式要想学脱壳,第一步就得掌握PE格式,PE是Portable Executable File Format(可移植的执行体)简写,它是目前Windows平台上的主流可执行文件格式。
Microsoft Visual C++提供的WINNT.H里有PE数据结构的完整定义。
推荐文档:ah007翻译的“PE文件格式”1.9版qduwg翻译的PE文件格式Iczelion's的PE文件格式PE结构各字段偏移参考学习PE格式的方法是自己先准备一个十六进制工具,如HexWorkshop,WinHex,用这些工具打开一个EXE文件对照着学。
强烈推荐你用Stud_PE v.2.2.0.5这款工具辅助学习PE格式。
PE格式学习的重点是在输入表(Import Table)这块。
Stud_PE工具界面:PE结构图:第二课SEH技术结构化异常处理(Structured Exception Handling,SEH)是Windows操作系统处理程序错误或异常的技术。
SEH是Windows操作系统的一种系统机制,与特定的程序设计语言无关。
外壳程序里大量地使用了SEH,如果不了解SEH,将会使你跟踪十分困难。
SEH in ASM研究(一)by humeSEH in ASM研究(二)by humeStructured Exception Handling加密与解密二版菜鸟学习笔记(2)-SEH结构化异常处理by ytcswb由于Ollydbg对SEH处理异常灵活,因此脱壳用Ollydbg会大大提高效率。
附CONTEXT结构环境:代码:typedef struct_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_AREA FloatSave;/*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;第三课认识壳1.什么是壳?在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。
它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。
推荐文档:一切从“壳”开始描述壳的示意图: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 文件进行“重定位”,所以加壳软件把原程序文件中用于保存重定位信息的区块干脆也删除了,这样使得加壳后的文件更加小巧。
有些工具提供“Wipe Reloc”的功能,其实就是这个作用。
不过对于DLL的动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时提供相同的基地址。
这样“重定位”就很重要了,此时壳中也需要提供进行“重定位”的代码,否则原程序中的代码是无法正常运行起来的。
从这点来说,加壳的DLL比加壳的EXE更难修正。
4)HOOK-API程序文件中的输入表的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。
在程序的第一行代码执行之前,Windows系统就完成了这个工作。
壳一般都修改了原程序文件的输入表,然后自己模仿Windows系统的工作来填充输入表中相关的数据。
在填充过程中,外壳就可填充HOOK-API的代码的地址,这样就可间接地获得程序的控制权。
5)跳转到程序原入口点(OEP)从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。
但现在的猛壳己没这界限了,壳里有肉,肉里有壳。
3.压缩引擎各类加壳软件,其压缩算法一般不是自己实现的,大多是调用其他的压缩引擎。
目前压缩引擎种类比较多,不同的压缩引擎有不同特点,如一些对图像压缩效果好,一些对数据压缩效果好。
而加壳软件选择压缩引擎有一个特点,在保证压缩比的条件下,压缩速度慢些关系不是太大,但解压速度一定要快,这样加了壳的EXE文件运行起来速度才不会受太大的影响。
例如下面几个压缩引擎就能满足这要求:1.aPLib压缩引擎/,这个库对于低于64K的文件压缩效果较好,速度较快。
2.JCALG1压缩引擎,相对于aPlib,JCALG1对于大文件效果好些。
3.LZMA压缩引擎/zh-cn/sdk.html,LZMA是7-Zip程序中7z格式的默认压缩算法,压缩率很高。
第四课常见压缩壳与加密壳加壳软件按照其加壳目的和作用,可分为两类:一是压缩(Packers),二是保护(Protectors)。
压缩这类壳主要目的是减小程序体积,如ASPacK、UPX和PECompact等。
另一类是保护程序,用上了各种反跟踪技术保护程序不被调试、脱壳等,其加壳后的体积大小不是其考虑的主要因素,如ASProtect、Armadillo、EXECryptor 等。
随着加壳技术的发展,这两类软件之间的界线越来越模糊,很多加壳软件除具有较强的压缩性能,同时也有了较强的保护性能。
1.ASPacK主页:/ASPack是款Win32可执行文件压缩软件,可压缩Windows32位可执行文件(.exe)以及库文件(.dll、.ocx),文件压缩比率高达40%~70%。
2.UPX主页:/UPX是一个以命令行方式操作的可执行文件经典免费压缩程序,压缩算法自己实现,速度极快,压缩比极高。
(开源)3.PECompact主页:/PECompact同样也是一款能压缩可执行文件的工具(支持EXE、DLL、SCR、OCX等文件)。
相比同类软件,PECompact 提供了多种压缩项目的选择,用户可以根据需要确定哪些内部资源需要压缩处理。
同时,该软件还提供了加解密的插件接口功能。
4.ASProtect主页:/ASProtect是一款非常强大的Windows32位保护工具,这4、5年来,其一直在更新进步。
其开发者是俄国人Alexey Solodovnikov。
它拥有压缩、加密、反跟踪代码、反-反汇编代码、CRC校验和花指令等保护措施。
它使用Blowfish、Twofish、TEA等强劲的加密算法,还用RSA1024作为注册密钥生成器。
它还通过API钩子(API hooks,包括Import hooks(GPA hook)和Export hooks)与加壳的程序进行通信。
甚至用到了多态变形引擎(Polymorphic Engine)。
反Apihook代码(Anti-Apihook Code)和BPE32的多态变形引擎(BPE32的Polymorphic Engine)。
并且ASProtect为软件开发人员提供SDK,实现加密程序内外结合。
更多与壳有关的描述参考:纵横间谁能相抗—论壳与加壳技术作者:forgot常见加密壳官方站点ASProtect /ACProtect /Armadillo /srt-news.shtmlEXECryptor /cgi-bin/anon-www.cgi//Obsidium http://www.obsidium.de/PESpin http://pespin.w.interia.pl/VMProtect http://www.polytech.ural.ru/Xtreme-Protector /xprotector/Themida/WinLicense /downloads.php第五课文件类型分析拿到一个壳,第一步就是用相关工具分析一下是什么壳,然后就可心中有数地跟踪分析。