软件加壳脱壳技术教程

软件加壳脱壳技术教程

ID:16544362

大小:304.50 KB

页数:39页

时间:2018-08-22

上传者:U-3183
软件加壳脱壳技术教程_第1页
软件加壳脱壳技术教程_第2页
软件加壳脱壳技术教程_第3页
软件加壳脱壳技术教程_第4页
软件加壳脱壳技术教程_第5页
资源描述:

《软件加壳脱壳技术教程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

一切从“壳”开始首先大家应该先明白“壳”的概念。在自然界中,大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。  最早提出“壳”这个概念的,据我所知,应该是当年推出脱壳软件RCOPY3的作者熊焰先生。在几年前的DOS时代,“壳”一般都是指磁盘加密软件的段加密程序,可能是那时侯的加密软件还刚起步不久吧,所以大多数的加密软件(加壳软件)所生成的“成品”在“壳”和需要加密的程序之间总有一条比较明显的“分界线”。有经验的人可以在跟踪软件的运行以后找出这条分界线来,至于这样有什么用这个问题,就不用我多说了。但毕竟在当时,甚至现在这样的人也不是很多,所以当RCOPY3这个可以很容易就找出“分界线”,并可以方便的去掉“壳”的软件推出以后,立即就受到了很多人的注意。老实说,这个我当年在《电脑》杂志看到广告,在广州电脑城看到标着999元的软件,在当时来说,的确是有很多全新的构思,单内存生成EXE可执行文件这项,就应该是世界首创了。但它的思路在程序的表现上我认为还有很多可以改进的地方(虽然后来出现了可以加强其功力的RO97),这个想法也在后来和作者的面谈中得到了证实。在这以后,同类型的软件想雨后春笋一般冒出来,记得住名字的就有:UNKEY、MSCOPY、UNALL....等等,但很多的软件都把磁盘解密当成了主攻方向,忽略了其它方面,当然这也为以后的“密界克星”“解密机器”等软件打下了基础,这另外的分支就不多祥谈了,相信机龄大一点的朋友都应该看过当时的广告了。  解密(脱壳)技术的进步促进、推动了当时的加密(加壳)技术的发展。LOCK95和BITLOK等所谓的“壳中带籽”加密程序纷纷出笼,真是各出奇谋,把小小的软盘也折腾的够辛苦的了。正在国内的加壳软件和脱壳软件较量得正火红的时候,国外的“壳”类软件早已经发展到像LZEXE之类的压缩壳了。这类软件说穿了其实就是一个标准的加壳软件,它把EXE文件压缩了以后,再在文件上加上一层在软件被执行的时候自动把文件解压缩的“壳”来达到压缩EXE文件的目的。接着,这类软件也越来越多,PKEXE、AINEXE、UCEXE和后来被很多人认识的WWPACK都属于这类软件,但奇怪的是,当时我看不到一个国产的同类软件。  过了一段时间,可能是国外淘汰了磁盘加密转向使用软件序列号的加密方法吧,保护EXE文件不被动态跟踪和静态反编译就显得非常重要了。所以专门实现这样功能的加壳程序便诞生了。MESS、CRACKSTOP、HACKSTOP、TRAP、UPS等等都是比较有名气的本类软件代表,当然,还有到现在还是数一数二的,由台湾同胞所写的FSE。其实以我的观点来看,这样的软件才能算是正宗的加壳软件。  在以上这些加壳软件的不断升级较劲中,很多软件都把比较“极端”技术用了上去,因为在这个时候DOS已经可以说是给众高手们玩弄在股掌之间了,什么保护模式、反SICE、逆指令等等。相对来说,在那段时间里发表的很多国外脱壳程序,根本就不能对付这么多的加壳大军,什么UPC、TEU等等都纷纷成为必防的对象,成绩比较理想的就只有CUP386了,反观国内,这段时间里也没了这方面的“矛盾斗争”。加壳软件门挥军直捣各处要岗重地,直到在我国遇到了TR这个铜墙铁壁以后,才纷纷败下阵来各谋对策,但这已经是一年多以后的事情了。我常想,如果TR能早两年“出生”的话,成就肯定比现在大得多,甚至盖过SICE也有可能。TR发表的时候WIN95的流行已经成为事实,DOS还有多少的空间,大家心里都清楚。但话又说回来,TR的确是个好软件,比起当年的RCOPY3有过之而无不及,同时也证明了我们中国的CRACK 实力(虽然有点过时)。这个时候,前面提到过的FSE凭着强劲的实力也渐渐的浮出了水面,独领风骚。其时已经是1997年年底了,我也走完了学生“旅程”。工作后在CFIDO的CRACK区认识了Ding-Boy,不久CRACK区关了,我从此迷上了INTERNET,并于98年6月建起了一个专门介绍“壳”的站台:http://topage.126.com;,放上了我所收集的所有“壳”类软件。在这段时间里,各种“壳”类软件也在不段的升级换代,但都没什么太大的进展,差不多就是TR和众加壳软件的版本数字之争而已。1998年8月,一个名为UNSEC(揭秘)的脱壳软件发表了,它号称可以脱掉98年8月以前发表的所有壳。我测试之后,觉得并没传闻中的那么厉害,特别是兼容性更是令我不想再碰它。Ding-Boy给这个软件的作者提了很多建议,但寄去的EMIAL有如泥牛入海,可能是一怒之下吧,不久Ding-Boy的BW(冲击波)就诞生了。这个使用内存一次定位生成EXE文件(后来放弃了)的脱壳软件,在我的站台公开后,得到了很多朋友们的肯定。要知道,从RCOPY3开始,绝大部分的脱壳软件都是要两次运行目标程序来确定EXE的重定位数据的。BW的这一特点虽然有兼容性的问题,但也树立了自己的风格、特色。经过几个月的改善,BW升级到了2.0版本,这个版本的推出可以说是BW的转折点,因为它已经是一个成熟、稳定脱壳软件了,它可以对付当时(现在)大多数的壳,包括当时最新的FSE0.6等。更重要的是这个版本把选择壳的和软件“分界线”这个最令新手头疼的步骤简化到不能再简化的地步,使更多的朋友接受了它。另外,能加强BW功力的CI模式也是其它脱壳软件没有的东西。最近,BW发表了最新的2.5BETA2版本,增强了一些方面的功能,因它竟然可以脱掉号称最厉害的磁盘加密工具LOCKKING2.0的加密壳,因而进一步奠定了它在“脱壳界”的地位。说到最新,就不能不提GTR、LTR、EDUMP、ADUMP、UPS、UPX、APACK这几个国外的好软件了,它们每个都有自己的特色,可以说都是当今各类“壳”中的最新代表了。(这些软件和详细介绍请到我的主页查阅) 由于WINDOWS3.1只是基于DOS下的一个图形外壳,所以在这个平台下的“壳”类软件很少,见过的就只有像PACKWIN等几个有限的压缩工具,终难成气候。  可能是MICROSOFT保留了WIN95的很多技术上的秘密吧,所以即便是WIN95已经推出了3年多的时间,也没见过在其上面运行的“壳”类软件。直到98年的中期,这样的软件才迟迟的出现,而这个时候WIN98也发表了有一段日子了。应该是有DOS下的经验吧,这类的软件不发表由自可,一发表就一大批地的冲了出来。先是加壳类的软件如:BJFNT、PELOCKNT等,它们的出现,使暴露了3年多的WIN95下的PE格式EXE文件得到了很好的保护。大家都应该知道现在很多WIN95下的软件都是用注册码的方法来区分、确定合法与非法用户的吧,有了这类加壳软件,这种注册方法的安全性提高了不少,如果大家也有自己编的WIN95程序,就一定要多留意一下本类软件了。接着出现的就是压缩软件了,因为WIN95下运行的EXE文件“体积”一般都比较大,所以它的实用价值比起DOS下的压缩软件要大很多,这类的软件也很多,早些时候的VBOX、PEPACK、PETITE和最近才发表的ASPACK、UPX都是其中的佼佼者。在DOS下很流行的压缩软件WWPACK的作者也推出了对应WIN95版本的WWPACK32,由于性能并不是十分的突出,所以用的人也不太多。由于压缩软件其实也是间接给软件加了壳,所以用它们来处理EXE也是很多软件作者喜欢做的事情,最近新发表的很多软件里都可以看到这些加壳、加压缩软件的名字了。有加壳就一定会有脱壳的,在WIN95下当然也不例外,但由于编这类软件比编加壳软件要难得多,所以到目前为止,我认为就只有PROCDUMP这个软件能称为通用脱壳软件了,它可以对付现在大多数的加壳、压缩软件所加的壳,的确是一个难得的精品。其它的脱壳软件多是专门针对某某加壳软件而编,虽然针对性强、效果好,但收集麻烦,而且这样的脱壳软件也不多。前些时候TR作者也顺应潮流发表了TR的WIN95版本:TRW,由现在的版本来看可以对付的壳还不多,有待改进。   BW的作者Ding-Boy最新发表了一个WIN95的EXE加壳软件DBPE。虽然它还不太成熟,但它可以为软件加上使用日期限制这个功能是其它加壳软件所没有的,或者以后的加壳软件真的会是像他说的那样可以:加壳和压缩并重、并施;随意加使用日期;加上注册码;加软件狗(磁盘)保护;加硬件序列号判别;加...。附加一点内容一.壳的概念作者编好软件后,编译成exe可执行文件1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名等2.需要把程序搞的小一点,从而方便使用于是,需要用到一些软件,他们能将exe可执行文件压缩,实现上述两个功能,这些软件称为加壳软件或压缩软件.它不同于一般的winzip,winrar等压缩软件.它是压缩exe可执行文件的,压缩后的文件可以直接运行.二.加壳软件最常见的加壳软件ASPACK,UPX,PEcompact不常用的加壳软件WWPACK32;PE-PACK;PETITE;NEOLITE三.侦测壳和软件所用编写语言的软件1.侦测壳的软件fileinfo.exe简称fi.exe(侦测壳的能力极强)使用方法:第一种:待侦测壳的软件(如aa.exe)和fi.exe位于同一目录下,执行windows起始菜单的运行,键入fiaa第二种:待侦测壳的软件(如aa.exe)和fi.exe位于同一目录下,将aa的图标拖到fi的图标上2.侦测壳和软件所用编写语言的软件language.exe(两个功能合为一体,很棒) 推荐language2000中文版,我的主页可下载傻瓜式软件,运行后选取待侦测壳的软件即可(open)脱壳教程2:手动脱壳入门第一篇【使用工具】Ollydbg1.10b,ImportREC1.6F【破解平台】Win2000/XP前言,作者写这篇文章只是举个例子,希望读者能够举一反三,看清思路.本论坛中破解高手很多,不会手动脱壳者人数仍然不少。有人会说,我有Unaspack,Caspr,ProcDump等众多脱壳工具,不会手动脱壳用工具脱就可以了。但有部分壳如Asprotect1.23Rc4,本论坛高手仙剑(将自己加密壳伪装成C++),有漏洞,用Peid查壳,Ep区段写有Xj,用Od载入提示有壳,更有甚一些软件如大嘴日语加了四层壳,这些都是工具无法脱壳的。随着加密壳的不断出现,基本壳都不会,高版本的加密壳以后脱壳盲根本无从入手。所以,手动脱壳Crack必修。 手动脱壳的主要步骤是:寻找入口点,转储(dump)程序,修复引入函数表(ImportTable)现在的壳分压缩壳,和加密壳。压缩壳目的是使文件大小变小,便于在网上传播。并有一定的保护作用,你无法反汇编加壳程序。加密壳目的是用各种手段保护软件不被脱壳,跟踪,文件大小不是它的目的,有的甚至变大。判断加密壳压缩壳和普通程序分别很容易,用Ollydbg载入程序。没加壳软件无任何提示。加密壳有些Od载入时会提示压缩,基本上F9运行后,OD提示程序异常。普通加壳Od载入时一般都会发现,提示软件被加壳,是否继续分析。还有些是脱壳没有脱干净,Od载入时也提示加壳。更猛的壳用Od载入就异常,如Acprotect。关于壳的知识不是一两篇文章就能说清,要经过大量的各种壳的脱壳经验,参考文章。好,我们先从一个基本的Upx壳入手。本地下载首先必须的工具要准备好,查壳工具Peid0.91,Fileinfo,Language2000,FileScanner等。查入口工具。Peid0.91首推,冲击波(9X)系统专用,Asloader,自己的感觉,程序跨段跳跃点。脱壳工具。Ollydbg首选,LoadPe,PEditor,ProcDump等,够用了。修复引入函数表(ImportTable)工具。Imprec,FileScanner,PEditor,LoadPe,ProcDump,Revirgin等,够用了。以上的工具都有当然最好,至少得有。Peid0.91,Fileinfo,PEditor,LoadPe,Imprec,Asloader。 工具准备好,开始小试验牛刀。附件中壳为Fi测壳为Upx1.01,Peid这里测不出Upx的压缩版本。手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。用OD载入程序后。Od提示程序加壳,选不继续分析。0046AC00>60PUSHAD停在这里,我们先记住UPX壳的加壳入口第一句是PUSHAD出口暂时不清楚,为的是今后碰到多层壳有准备。0046AC01BE00104400MOVESI,ex1.004410000046AC068DBE0000FCFFLEAEDI,DWORDPTRDS:[ESI+FFFC0000]0046AC0CC787D0940500D>MOVDWORDPTRDS:[EDI+594D0],10A125D80046AC1657PUSHEDI0046AC1783CDFFOREBP,FFFFFFFF0046AC1AEB0EJMPSHORTex1.0046AC2A跳走0046AC1C90NOP0046AC1D90NOP0046AC1E90NOP0046AC1F90NOP0046AC208A06MOVAL,BYTEPTRDS:[ESI]0046AC2246INCESI0046AC238807MOVBYTEPTRDS:[EDI],AL0046AC2547INCEDI0046AC2601DBADDEBX,EBX0046AC287507JNZSHORTex1.0046AC310046AC2A8B1EMOVEBX,DWORDPTRDS:[ESI]到这里。0046AC2C83EEFCSUBESI,-40046AC2F11DBADCEBX,EBX0046AC31^72EDJBSHORTex1.0046AC20这里注意,往回跳。脱壳时记住只能让程序往前运行0046AC33B801000000MOVEAX,1在这里点一下,F4运行到这句继续。0046AC3801DBADDEBX,EBX0046AC3A7507JNZSHORTex1.0046AC43跳0046AC3C8B1EMOVEBX,DWORDPTRDS:[ESI]0046AC3E83EEFCSUBESI,-40046AC4111DBADCEBX,EBX0046AC4311C0ADCEAX,EAX0046AC4501DBADDEBX,EBX0046AC47^73EFJNBSHORTex1.0046AC38 0046AC497509JNZSHORTex1.0046AC54跳0046AC4B8B1EMOVEBX,DWORDPTRDS:[ESI]0046AC4D83EEFCSUBESI,-40046AC5011DBADCEBX,EBX0046AC52^73E4JNBSHORTex1.0046AC380046AC5431C9XORECX,ECX0046AC5683E803SUBEAX,30046AC59720DJBSHORTex1.0046AC68跳0046AC5BC1E008SHLEAX,80046AC5E8A06MOVAL,BYTEPTRDS:[ESI]0046AC6046INCESI0046AC6183F0FFXOREAX,FFFFFFFF0046AC647474JESHORTex1.0046ACDA0046AC6689C5MOVEBP,EAX0046AC6801DBADDEBX,EBX0046AC6A7507JNZSHORTex1.0046AC73跳0046AC6C8B1EMOVEBX,DWORDPTRDS:[ESI]0046AC6E83EEFCSUBESI,-40046AC7111DBADCEBX,EBX0046AC7311C9ADCECX,ECX0046AC7501DBADDEBX,EBX0046AC777507JNZSHORTex1.0046AC80跳0046AC798B1EMOVEBX,DWORDPTRDS:[ESI]0046AC7B83EEFCSUBESI,-40046AC7E11DBADCEBX,EBX0046AC8011C9ADCECX,ECX0046AC827520JNZSHORTex1.0046ACA4跳0046AC8441INCECX0046AC8501DBADDEBX,EBX0046AC877507JNZSHORTex1.0046AC900046AC898B1EMOVEBX,DWORDPTRDS:[ESI]0046AC8B83EEFCSUBESI,-40046AC8E11DBADCEBX,EBX0046AC9011C9ADCECX,ECX0046AC9201DBADDEBX,EBX0046AC94^73EFJNBSHORTex1.0046AC850046AC967509JNZSHORTex1.0046ACA10046AC988B1EMOVEBX,DWORDPTRDS:[ESI]0046AC9A83EEFCSUBESI,-40046AC9D11DBADCEBX,EBX0046AC9F^73E4JNBSHORTex1.0046AC850046ACA183C102ADDECX,20046ACA481FD00F3FFFFCMPEBP,-0D000046ACAA83D101ADCECX,10046ACAD8D142FLEAEDX,DWORDPTRDS:[EDI+EBP]0046ACB083FDFCCMPEBP,-4 0046ACB3760FJBESHORTex1.0046ACC4这一句可以跳出这个循环。0046ACB58A02MOVAL,BYTEPTRDS:[EDX]0046ACB742INCEDX0046ACB88807MOVBYTEPTRDS:[EDI],AL0046ACBA47INCEDI0046ACBB49DECECX0046ACBC^75F7JNZSHORTex1.0046ACB5注意,往回跳。0046ACBE^E963FFFFFFJMPex1.0046AC26这里也往回跳。0046ACC390NOP0046ACC48B02MOVEAX,DWORDPTRDS:[EDX]呵,在这里点一下,F4到这里。0046ACC683C204ADDEDX,40046ACC98907MOVDWORDPTRDS:[EDI],EAX0046ACCB83C704ADDEDI,40046ACCE83E904SUBECX,40046ACD1^77F1JASHORTex1.0046ACC4往回跳。0046ACD301CFADDEDI,ECX0046ACD5^E94CFFFFFFJMPex1.0046AC26这里也往回跳0046ACDA5EPOPESI呵,在这里点一下,F4到这里。0046ACDB89F7MOVEDI,ESI0046ACDDB9C8230000MOVECX,23C80046ACE28A07MOVAL,BYTEPTRDS:[EDI]0046ACE447INCEDI0046ACE52CE8SUBAL,0E80046ACE73C01CMPAL,10046ACE9^77F7JASHORTex1.0046ACE2往回跳。0046ACEB803F0DCMPBYTEPTRDS:[EDI],0D在这里点一下,F4到这里。0046ACEE^75F2JNZSHORTex1.0046ACE20046ACF08B07MOVEAX,DWORDPTRDS:[EDI]0046ACF28A5F04MOVBL,BYTEPTRDS:[EDI+4]0046ACF566:C1E808SHRAX,80046ACF9C1C010ROLEAX,100046ACFC86C4XCHGAH,AL0046ACFE29F8SUBEAX,EDI0046AD0080EBE8SUBBL,0E80046AD0301F0ADDEAX,ESI0046AD058907MOVDWORDPTRDS:[EDI],EAX0046AD0783C705ADDEDI,50046AD0A89D8MOVEAX,EBX0046AD0C^E2D9LOOPDSHORTex1.0046ACE7这是个循环,往回跳。0046AD0E8DBE00700600LEAEDI,DWORDPTRDS:[ESI+67000]在这里点一下,F4到这里。0046AD148B07MOVEAX,DWORDPTRDS:[EDI]0046AD1609C0OREAX,EAX0046AD18743CJESHORTex1.0046AD560046AD1A8B5F04MOVEBX,DWORDPTRDS:[EDI+4]0046AD1D8D8430BCA90600LEAEAX,DWORDPTRDS:[EAX+ESI+6A9BC] 0046AD2401F3ADDEBX,ESI0046AD2650PUSHEAX0046AD2783C708ADDEDI,80046AD2AFF965CAA0600CALLDWORDPTRDS:[ESI+6AA5C]到这里我们看到信息框中写有0046AD2AFF965CAA0>calldwordptrds:[esi+6AA5C]KERNEL32.LoadLibraryA如果我们直接下断点BpLoadLibraryA,F9运行程序,Ctrl+F9返回到这句不就省很多事,这里大家以后会明白的,脱大量的壳后,我们先有一个概念。0046AD3095XCHGEAX,EBP0046AD318A07MOVAL,BYTEPTRDS:[EDI]0046AD3347INCEDI0046AD3408C0ORAL,AL0046AD36^74DCJESHORTex1.0046AD140046AD3889F9MOVECX,EDI0046AD3A57PUSHEDI0046AD3B48DECEAX0046AD3CF2:AEREPNESCASBYTEPTRES:[EDI]0046AD3E55PUSHEBP0046AD3FFF9660AA0600CALLDWORDPTRDS:[ESI+6AA60]到这里我们看到信息框中写有,GetProcAddress这里也是好断点啊。0046AD3FFF9660AA0>calldwordptrds:[esi+6AA60];KERNEL32.GetProcAddress0046AD4509C0OREAX,EAX0046AD477407JESHORTex1.0046AD500046AD498903MOVDWORDPTRDS:[EBX],EAX0046AD4B83C304ADDEBX,40046AD4E^EBE1JMPSHORTex1.0046AD31往回跳。0046AD50FF9664AA0600CALLDWORDPTRDS:[ESI+6AA64]0046AD5661POPAD关键点,入口就在附近。和PUSHAD对应。在这里点一下,F4到这里。0046AD57^E998CBFEFFJMPex1.004578F4跳到入口。程序跨段跳跃。0046AD5C^74ADJESHORTex1.0046AD0B0046AD5E46INCESI.................................................程序加壳段地址一直在0046XXXX突然跳转到0045XXXX段,跨段跳跃时,一般都是在内存中脱壳完毕,准备运行程序,手动脱壳就是要在入口将程序Dump出来。转到入口时一般都有Popad语句和开始的PUSHAD对应。.................................................004578F455PUSHEBP我们再这里用Od的Dump插件直接脱壳。 见截图.004578F58BECMOVEBP,ESP004578F783C4F4ADDESP,-0C004578FAB8AC774500MOVEAX,ex1.004577AC004578FFE82CE6FAFFCALLex1.00405F3000457904A140954500MOVEAX,DWORDPTRDS:[459540]004579098B00MOVEAX,DWORDPTRDS:[EAX]0045790BE878A1FEFFCALLex1.00441A88004579108B0D10964500MOVECX,DWORDPTRDS:[459610];ex1.0045A82000457916A140954500MOVEAX,DWORDPTRDS:[459540]0045791B8B00MOVEAX,DWORDPTRDS:[EAX]0045791D8B1524744500MOVEDX,DWORDPTRDS:[457424];ex1.0045747000457923E878A1FEFFCALLex1.00441AA000457928A140954500MOVEAX,DWORDPTRDS:[459540]0045792D8B00MOVEAX,DWORDPTRDS:[EAX]0045792FE8ECA1FEFFCALLex1.00441B2000457934E88BBEFAFFCALLex1.004037C4004579398D4000LEAEAX,DWORDPTRDS:[EAX]总结:Upx壳直接Ctrl+F找Popad,向下一个jmp跳到入口,命令行下断点bpGetProcAddressF9运行,Ctrl+F9返回到程序,向下到Popad处的jmp跳到入口.在入口处Dump程序.UPX脱壳断点bpLoadLibraryAbpGetProcAddressUPX加壳入口第一句是PUSHAD出口关键字POPAD 一般经过JMP跨段跳跃到入口处.我们以后每手动脱一个壳就总结一次.脱壳后发现程序不能运行,这时需要用Imprec修复引入函数表(ImportTable)在Oep处填000578F4,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,正常运行,这里不用备份,Imprec自动帮你做了.见截图.期待这是引你初学者入脱壳大门的第一步."手动脱壳入门第一篇"脱壳动画脱壳教程3:手动脱壳入门第二篇脱壳教程3:手动脱壳入门第二篇【使用工具】Fi,Peid,Ollydbg【脱壳平台】Win2K/XP【软件名称】chap702【软件简介】UPXV1.08加壳的一个Win98的记事本【软件大小】15.9KB【加壳方式】UPX0.89.6-1.02/1.05-1.24->Markus&Laszlo【保护方式】UPX普通壳【脱壳声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:脱壳内容UPX脱壳第一篇总结内容如下:UPX脱壳断点bpLoadLibraryA经过两个很关键的脱壳相关函数,很快到入口点,前面有PopadbpGetProcAddress这个优先下断点,可省略很多循环,我们在第一篇已看清UPX手动脱壳流程.UPX加壳入口第一句是PUSHAD出口关键字POPAD一般经过JMP跨段跳跃到入口处.有了手动脱壳第一片的总结,脱UPX壳很容易.好,我们看第二个Upx壳。 本地下载首先必须的工具要准备好,附件中壳为Fi测壳为Upx1.08,Peid这里测不出Upx的压缩版本。手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。用OD载入程序后。Od提示程序加壳,选不继续分析。0040E8C0>60PUSHADUPX壳的加壳入口第一句是PUSHAD0040E8C1BE15B04000MOVESI,chap702.0040B0150040E8C68DBEEB5FFFFFLEAEDI,DWORDPTRDS:[ESI+FFFF5FEB]0040E8CC57PUSHEDI0040E8CD83CDFFOREBP,FFFFFFFF0040E8D0EB10JMPSHORTchap702.0040E8E20040E8D290NOP0040E8D390NOP0040E8D490NOP...................................我们这一次不单步跟踪,我们再命令行下断点BpGetProcAddress入口前必经之函数.见截图.F9运行中断在77E7564B>55PUSHEBP断在这里,注意这里是系统领空;KERNEL32.77E60000F2取消断点.Ctrl+F9返回.77E7564C8BECMOVEBP,ESP77E7564E51PUSHECX77E7564F51PUSHECX77E7565053PUSHEBX77E7565157PUSHEDI77E756528B7D0CMOVEDI,DWORDPTRSS:[EBP+C]77E75655BBFFFF0000MOVEBX,0FFFF77E7565A3BFBCMPEDI,EBX77E756A8C20800RETN8到这里,F877E756AB-FF252013E677JMPDWORDPTRDS:[<&NTDLL.LdrGetProcedur>;ntdll.LdrGetProcedureAddress77E756B185FFTESTEDI,EDI77E756B30F85AD620000JNZKERNEL32.77E7B96677E756B98B45FCMOVEAX,DWORDPTRSS:[EBP-4]77E756BC8B4004MOVEAX,DWORDPTRDS:[EAX+4]77E756BF0FB7402EMOVZXEAX,WORDPTRDS:[EAX+2E]77E756C3EB0AJMPSHORTKERNEL32.77E756CF77E756C58B45FCMOVEAX,DWORDPTRSS:[EBP-4]77E756C88B4004MOVEAX,DWORDPTRDS:[EAX+4] 77E756CB0FB74012MOVZXEAX,WORDPTRDS:[EAX+12]77E756CF8D0C46LEAECX,DWORDPTRDS:[ESI+EAX*2]0040E9FD09C0OREAX,EAX回到程序领空了.;KERNEL32._lwrite0040E9FF7407JESHORTchap702.0040EA080040EA018903MOVDWORDPTRDS:[EBX],EAX0040EA0383C304ADDEBX,40040EA06^EBE1JMPSHORTchap702.0040E9E9这里想往回跳.0040EA08FF96A8EC0000CALLDWORDPTRDS:[ESI+ECA8]F4到这里.0040EA0E61POPAD关键字,入口就在附近.0040EA0F-E9B826FFFFJMPchap702.004010CC跨段跳跃到入口.004010CC55PUSHEBP我们再这里用Od的Dump插件直接脱壳。004010CD8BECMOVEBP,ESP004010CF83EC44SUBESP,44004010D256PUSHESI004010D3FF15E4634000CALLDWORDPTRDS:[4063E4];KERNEL32.GetCommandLineA004010D98BF0MOVESI,EAX004010DB8A00MOVAL,BYTEPTRDS:[EAX]004010DD3C22CMPAL,22004010DF751BJNZSHORTchap702.004010FC这个程序的输入表没有损坏,可以直接运行.还有更快的方法.UPX加壳入口第一句是PUSHAD出口关键字POPAD一般经过JMP跨段跳跃到入口处.用Od载入程序.0040E8C0>60PUSHADUPX壳的加壳入口第一句是PUSHAD0040E8C1BE15B04000MOVESI,chap702.0040B0150040E8C68DBEEB5FFFFFLEAEDI,DWORDPTRDS:[ESI+FFFF5FEB]0040E8CC57PUSHEDI0040E8CD83CDFFOREBP,FFFFFFFF0040E8D0EB10JMPSHORTchap702.0040E8E20040E8D290NOP0040E8D390NOP0040E8D490NOP0040E8D590NOP0040E8D690NOP..............................................................按Crtl+F向下找PoPad,见截图.0040EA0E61POPAD关键字.F2下断点,F9运行到这里,清除断点. 0040EA0F-E9B826FFFFJMPchap702.004010CC入口点.0040EA140000ADDBYTEPTRDS:[EAX],AL0040EA160000ADDBYTEPTRDS:[EAX],AL0040EA180000ADDBYTEPTRDS:[EAX],AL0040EA1A0000ADDBYTEPTRDS:[EAX],AL0040EA1C0000ADDBYTEPTRDS:[EAX],AL...................................................004010CC55PUSHEBP我们再这里用Od的Dump插件直接脱壳。004010CD8BECMOVEBP,ESP004010CF83EC44SUBESP,44004010D256PUSHESI004010D3FF15E4634000CALLDWORDPTRDS:[4063E4];KERNEL32.GetCommandLineA004010D98BF0MOVESI,EAX004010DB8A00MOVAL,BYTEPTRDS:[EAX]004010DD3C22CMPAL,22004010DF751BJNZSHORTchap702.004010FC这个程序的输入表没有损坏,可以直接运行.第二种方法在软件加了几层壳时很有用,节省大量时间.前提是你必须找到脱壳规律."手动脱壳入门第二篇"脱壳动画!脱壳教程4:手动脱壳入门第三篇脱壳教程4:手动脱壳入门第三篇【使用工具】Fi,Peid,Ollydbg【脱壳平台】Win2K/XP【软件名称】chap703.exe【软件简介】Aspack1.03加壳的一个Win98的记事本【软件大小】21.2KB【加壳方式】ASPack1.08.03->AlexeySolodovnikov【保护方式】Aspack1.03【脱壳声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:脱壳内容好,我们这次脱Aspack的壳看看它的特性。 本地下载首先必须的工具要准备好,附件中壳为Fi测壳为Aspack1.0803手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。用OD载入程序后。Od提示程序加壳,选不继续分析。0040D000>60PUSHAD停在这里,我们先记住Aspack壳的加壳入口第一句是PUSHAD和UPX几乎一样的,但第二句以后完全不同.0040D001E800000000CALLchap703.0040D006这里看清,直接Call下一句,F8走有些系统会跑飞,程序直接运行.我们一般遇到Call,很近的Call用F7走.较远的Call用F8步过,我们以后会体会更深.0040D0065DPOPEBPCall这里.0040D00781ED0A4A4400SUBEBP,444A0A0040D00DBB044A4400MOVEBX,444A040040D01203DDADDEBX,EBP0040D0142B9DB1504400SUBEBX,DWORDPTRSS:[EBP+4450B1]0040D01A83BDAC5044000>CMPDWORDPTRSS:[EBP+4450AC],00040D021899DBB4E4400MOVDWORDPTRSS:[EBP+444EBB],EBX0040D0270F8517050000JNZchap703.0040D5440040D02D8D85D1504400LEAEAX,DWORDPTRSS:[EBP+4450D1]0040D03350PUSHEAX0040D034FF9594514400CALLDWORDPTRSS:[EBP+445194]到这里我们看到信息框中写有GetModuleHandleA0040D034FF9594514400CALLDWORDPTRSS:[EBP+445194];kernel32.GetModuleHandleA0040D03A8985CD504400MOVDWORDPTRSS:[EBP+4450CD],EAX0040D0408BF8MOVEDI,EAX0040D0428D9DDE504400LEAEBX,DWORDPTRSS:[EBP+4450DE]0040D04853PUSHEBX0040D04950PUSHEAX0040D04AFF9590514400CALLDWORDPTRSS:[EBP+445190]到这里我们看到信息框中写有GetProcAddress0040D04AFF9590514400CALLDWORDPTRSS:[EBP+445190];kernel32.GetProcAddress0040D0508985B9504400MOVDWORDPTRSS:[EBP+4450B9],EAX0040D0568D9DEB504400LEAEBX,DWORDPTRSS:[EBP+4450EB]0040D05C53PUSHEBX0040D05D57PUSHEDI0040D05EFF9590514400CALLDWORDPTRSS:[EBP+445190]0040D0648985BD504400MOVDWORDPTRSS:[EBP+4450BD],EAX 0040D06A8B85BB4E4400MOVEAX,DWORDPTRSS:[EBP+444EBB]0040D0708985AC504400MOVDWORDPTRSS:[EBP+4450AC],EAX0040D0766A04PUSH40040D0786800100000PUSH10000040D07D689A040000PUSH49A0040D0826A00PUSH00040D084FF95B9504400CALLDWORDPTRSS:[EBP+4450B9]到这里我们看到信息框中写有VirtualAlloc0040D084FF95B9504400CALLDWORDPTRSS:[EBP+4450B9];kernel32.VirtualAlloc0040D08A8985B5504400MOVDWORDPTRSS:[EBP+4450B5],EAX0040D0908D9DCF4A4400LEAEBX,DWORDPTRSS:[EBP+444ACF]...............................................................0040D0B78B85B5504400MOVEAX,DWORDPTRSS:[EBP+4450B5]0040D0BD6800800000PUSH80000040D0C26A00PUSH00040D0C450PUSHEAX0040D0C5FF95BD504400CALLDWORDPTRSS:[EBP+4450BD]到这里我们看到信息框中写有VirtualFree0040D0C5FF95BD504400CALLDWORDPTRSS:[EBP+4450BD];kernel32.VirtualFree0040D0CB8D85374C4400LEAEAX,DWORDPTRSS:[EBP+444C37]0040D0D150PUSHEAX;chap703.0040D2330040D0D2C3RETN返回0040D2338B9DDF4A4400MOVEBX,DWORDPTRSS:[EBP+444ADF]这里的跨段太小,也无Popad对应出口,肯定不是Oep0040D2390BDBOREBX,EBX0040D23B740AJESHORTchap703.0040D247跳0040D23D8B03MOVEAX,DWORDPTRDS:[EBX]0040D23F8785E34A4400XCHGDWORDPTRSS:[EBP+444AE3],EAX0040D2458903MOVDWORDPTRDS:[EBX],EAX0040D2478DB5F74A4400LEAESI,DWORDPTRSS:[EBP+444AF7]0040D24D833E00CMPDWORDPTRDS:[ESI],00040D2500F840F010000JEchap703.0040D3650040D2568D85D1504400LEAEAX,DWORDPTRSS:[EBP+4450D1]0040D25C50PUSHEAX0040D25DFF9594514400CALLDWORDPTRSS:[EBP+445194]到这里我们看到信息框中写有GetModuleHandleA0040D25DFF9594514400CALLDWORDPTRSS:[EBP+445194];kernel32.GetModuleHandleA0040D2638985CD504400MOVDWORDPTRSS:[EBP+4450CD],EAX 0040D2698BF8MOVEDI,EAX0040D26B8D9DDE504400LEAEBX,DWORDPTRSS:[EBP+4450DE]0040D27153PUSHEBX0040D27250PUSHEAX0040D273FF9590514400CALLDWORDPTRSS:[EBP+445190]到这里我们看到信息框中写有GetProcAddress0040D273FF9590514400CALLDWORDPTRSS:[EBP+445190];kernel32.GetProcAddress0040D2798985B9504400MOVDWORDPTRSS:[EBP+4450B9],EAX0040D27F8D9DEB504400LEAEBX,DWORDPTRSS:[EBP+4450EB]0040D28553PUSHEBX0040D28657PUSHEDI0040D287FF9590514400CALLDWORDPTRSS:[EBP+445190];kernel32.GetProcAddress0040D28D8985BD504400MOVDWORDPTRSS:[EBP+4450BD],EAX0040D2938DB5F74A4400LEAESI,DWORDPTRSS:[EBP+444AF7]0040D2998B4604MOVEAX,DWORDPTRDS:[ESI+4]0040D29C6A04PUSH40040D29E6800100000PUSH10000040D2A350PUSHEAX0040D2A46A00PUSH00040D2A6FF95B9504400CALLDWORDPTRSS:[EBP+4450B9]到这里我们看到信息框中写有VirtualAllo0040D2A6FF95B9504400CALLDWORDPTRSS:[EBP+4450B9];kernel32.VirtualAlloc0040D2AC8985B5504400MOVDWORDPTRSS:[EBP+4450B5],EAX0040D2B256PUSHESI0040D2B38B1EMOVEBX,DWORDPTRDS:[ESI]0040D2B5039DAC504400ADDEBX,DWORDPTRSS:[EBP+4450AC]0040D2BB50PUSHEAX0040D2BC53PUSHEBX0040D2BDE8A3020000CALLchap703.0040D5650040D2C23B4604CMPEAX,DWORDPTRDS:[ESI+4]0040D2C5740BJESHORTchap703.0040D2D2跳0040D2C78D9D5D514400LEAEBX,DWORDPTRSS:[EBP+44515D]0040D2CDE94F010000JMPchap703.0040D4210040D2D280BDB05044000>CMPBYTEPTRSS:[EBP+4450B0],00040D30143INCEBX0040D30249DECECX0040D303^EBEDJMPSHORTchap703.0040D2F2往回跳0040D305291ESUBDWORDPTRDS:[ESI],EBXF4到这里0040D30783C305ADDEBX,50040D30A83C604ADDESI,40040D30D83E905SUBECX,5 0040D310^EBE0JMPSHORTchap703.0040D2F2又往回跳0040D3125BPOPEBXF4到这里0040D3135EPOPESI0040D31459POPECX........................................................0040D3396800800000PUSH80000040D33E6A00PUSH00040D34050PUSHEAX0040D341FF95BD504400CALLDWORDPTRSS:[EBP+4450BD]到这里我们看到信息框中写有VirtualFree0040D341FF95BD504400CALLDWORDPTRSS:[EBP+4450BD];kernel32.VirtualFree0040D34783C608ADDESI,80040D34A833E00CMPDWORDPTRDS:[ESI],00040D34D^0F8546FFFFFFJNZchap703.0040D299又往回跳0040D3538B9DDF4A4400MOVEBX,DWORDPTRSS:[EBP+444ADF]F4到这里0040D3590BDBOREBX,EBX0040D35B7408JESHORTchap703.0040D3650040D35D8B03MOVEAX,DWORDPTRDS:[EBX]..................................................0040D3A9740CJESHORTchap703.0040D3B70040D3AB83FB02CMPEBX,20040D3AE7416JESHORTchap703.0040D3C60040D3B083FB03CMPEBX,30040D3B37420JESHORTchap703.0040D3D50040D3B5EB2CJMPSHORTchap703.0040D3E30040D3B766:8B1EMOVBX,WORDPTRDS:[ESI]0040D3BA81E3FF0F0000ANDEBX,0FFF0040D3C066:01041FADDWORDPTRDS:[EDI+EBX],AX0040D3C4EB1DJMPSHORTchap703.0040D3E30040D3C666:8B1EMOVBX,WORDPTRDS:[ESI]0040D3C981E3FF0F0000ANDEBX,0FFF0040D3CF66:01141FADDWORDPTRDS:[EDI+EBX],DX0040D3D3EB0EJMPSHORTchap703.0040D3E30040D3D566:8B1EMOVBX,WORDPTRDS:[ESI]0040D3D881E3FF0F0000ANDEBX,0FFF0040D3DE01141FADDDWORDPTRDS:[EDI+EBX],EDX0040D3E1EB00JMPSHORTchap703.0040D3E30040D3E366:830EFFORWORDPTRDS:[ESI],0FFFF0040D3E783C602ADDESI,20040D3EA^E2B4LOOPDSHORTchap703.0040D3A00040D3EC^EB9AJMPSHORTchap703.0040D3880040D3EE8BB5EB4A4400MOVESI,DWORDPTRSS:[EBP+444AEB]0040D3F48B95AC504400MOVEDX,DWORDPTRSS:[EBP+4450AC] 0040D3FA03F2ADDESI,EDX0040D3FC8B460CMOVEAX,DWORDPTRDS:[ESI+C]0040D3FF85C0TESTEAX,EAX0040D4010F843D010000JEchap703.0040D5440040D40703C2ADDEAX,EDX0040D4098BD8MOVEBX,EAX0040D40B50PUSHEAX0040D40CFF9594514400CALLDWORDPTRSS:[EBP+445194]到这里我们看到信息框中写有GetModuleHandleA0040D40CFF9594514400CALLDWORDPTRSS:[EBP+445194];kernel32.GetModuleHandleA0040D41285C0TESTEAX,EAX0040D4147567JNZSHORTchap703.0040D47D跳0040D41653PUSHEBX0040D417FF9598514400CALLDWORDPTRSS:[EBP+445198]0040D41D85C0TESTEAX,EAX0040D41F755CJNZSHORTchap703.0040D47D0040D4218D85D1504400LEAEAX,DWORDPTRSS:[EBP+4450D1]0040D42750PUSHEAX0040D428FF9598514400CALLDWORDPTRSS:[EBP+445198]...........................................................0040D4C643INCEBX0040D4C753PUSHEBX0040D4C881E3FFFFFF7FANDEBX,7FFFFFFF0040D4CE53PUSHEBX0040D4CFFFB56E514400PUSHDWORDPTRSS:[EBP+44516E]0040D4D5FF9590514400CALLDWORDPTRSS:[EBP+445190]到这里我们看到信息框中写有GetProcAddress0040D4D5FF9590514400CALLDWORDPTRSS:[EBP+445190];kernel32.GetProcAddress0040D4DB85C0TESTEAX,EAX0040D4DD5BPOPEBX0040D4DE753EJNZSHORTchap703.0040D51E跳走。0040D51E8907MOVDWORDPTRDS:[EDI],EAX到这里.0040D5208385725144000>ADDDWORDPTRSS:[EBP+445172],40040D527^E967FFFFFFJMPchap703.0040D493往回跳。0040D52C33C0XOREAX,EAXF4到这里。0040D52E8906MOVDWORDPTRDS:[ESI],EAX0040D53089460CMOVDWORDPTRDS:[ESI+C],EAX0040D533894610MOVDWORDPTRDS:[ESI+10],EAX0040D53683C614ADDESI,140040D5398B95AC504400MOVEDX,DWORDPTRSS:[EBP+4450AC]0040D53F^E9B8FEFFFFJMPchap703.0040D3FC又往回跳。 0040D5448B85EF4A4400MOVEAX,DWORDPTRSS:[EBP+444AEF]0040D54A50PUSHEAX0040D54B0385AC504400ADDEAX,DWORDPTRSS:[EBP+4450AC]0040D5515BPOPEBX0040D5520BDBOREBX,EBX0040D5548944241CMOVDWORDPTRSS:[ESP+1C],EAX0040D55861POPAD终于看到这个标志,入口就在附近。0040D5597508JNZSHORTchap703.0040D563跳走。0040D55BB801000000MOVEAX,10040D560C20C00RETN0C0040D56350PUSHEAXEAX=004010CC0040D564C3RETN返回入口。004010CC55PUSHEBP程序跨段,并且经过了PoPad关键字。我们再这里用Od的Dump插件直接脱壳。004010CD8BECMOVEBP,ESP004010CF83EC44SUBESP,44004010D256PUSHESI004010D3FF15E4634000CALLDWORDPTRDS:[4063E4];kernel32.GetCommandLineA004010D98BF0MOVESI,EAX004010DB8A00MOVAL,BYTEPTRDS:[EAX]004010DD3C22CMPAL,22004010DF751BJNZSHORTchap703.004010FC004010E156PUSHESI用Od插件脱壳时注意,看截图。此主题相关图片如下:RubuildImPortMethod1Method2重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。脱壳总结:这个壳虽老,里面的循环还真多,新Aspack和它肯定不同,后话。Aspack1.0803加壳脱壳教程6:手动脱壳入门第五篇Aspack2.12【脱文标题】手动脱壳入门第五篇Aspack2.12【使用工具】Peid,Ollydbg 【脱壳平台】Win2K/XP【软件名称】Ascii查询专家【软件简介】Aspack2.12加壳的Ascii查询专家【软件大小】5.35K【加壳方式】ASPack2.12->AlexeySolodovnikov【脱壳声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:好,我们这次脱Aspack2.12的壳看看它的特性。本地下载首先必须的工具要准备好,附件中壳为PEiD查壳为ASPack2.12->AlexeySolodovnikov手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。用OD载入程序后。确定一个入口警告,OD提示软件可能有自解压或自修改功能,当然,因为它加了壳。停在这里00406001>60PUSHAD我们先记住Aspack壳的加壳入口第一句是PUSHAD00406002E803000000CALLex2.0040600A必须F7进入,不然跑飞。很近的Call用F70040600A5DPOPEBP;ex2.004060070040600B45INCEBP0040600C55PUSHEBP0040600DC3RETN00406008/EB04JMPSHORTex2.0040600E跳0040600A|5DPOPEBP0040600B|45INCEBP0040600C|55PUSHEBP0040600D|C3RETN0040600EE801000000CALLex2.00406014一看就应用F7过,变形的Jmp00406013EB5DJMPSHORTex2.00406072004060145DPOPEBP;ex2.0040601300406015BBEDFFFFFFMOVEBX,-130040601A03DDADDEBX,EBP 0040601C81EB00600000SUBEBX,60000040602283BD220400000>CMPDWORDPTRSS:[EBP+422],000406029899D22040000MOVDWORDPTRSS:[EBP+422],EBX0040602F0F8565030000JNZex2.0040639A0040603CFF954D0F0000CALLDWORDPTRSS:[EBP+F4D];kernel32.GetModuleHandleA00406042898526040000MOVDWORDPTRSS:[EBP+426],EAX004060488BF8MOVEDI,EAX0040604A8D5D5ELEAEBX,DWORDPTRSS:[EBP+5E]0040604D53PUSHEBX0040604E50PUSHEAX0040604FFF95490F0000CALLDWORDPTRSS:[EBP+F49];kernel32.GetProcAddress0040605589854D050000MOVDWORDPTRSS:[EBP+54D],EAX0040605B8D5D6BLEAEBX,DWORDPTRSS:[EBP+6B]0040605E53PUSHEBX0040605F57PUSHEDI00406060FF95490F0000CALLDWORDPTRSS:[EBP+F49];kernel32.GetProcAddress00406066898551050000MOVDWORDPTRSS:[EBP+551],EAX0040606C8D4577LEAEAX,DWORDPTRSS:[EBP+77]0040606FFFE0JMPEAX跳走。0040608A8B9D31050000MOVEBX,DWORDPTRSS:[EBP+531]到这里。004060900BDBOREBX,EBX00406092740AJESHORTex2.0040609E跳004060948B03MOVEAX,DWORDPTRDS:[EBX].....................................................004060F9E86E050000CALLex2.0040666C我们手动跟踪时遇到Call一定要正确判断是用F7过,还是F8过,F7决对安全,但容易重复跟踪,F8容易跑飞。这里是远处Call,F8过。004060FEB300MOVBL,00040610080FB00CMPBL,000406103755EJNZSHORTex2.00406163....................................................0040612F/742EJESHORTex2.0040615F00406131|782CJSSHORTex2.0040615F00406133|ACLODSBYTEPTRDS:[ESI]00406134|3CE8CMPAL,0E800406136|740AJESHORTex2.0040614200406138|EB00JMPSHORTex2.0040613A 0040613A|3CE9CMPAL,0E90040613C|7404JESHORTex2.004061420040613E|43INCEBX0040613F|49DECECX00406140^|EBEBJMPSHORTex2.0040612D往回跳.004061428B06MOVEAX,DWORDPTRDS:[ESI]直接F4到这里。00406144EB00JMPSHORTex2.00406146Bt,隔壁也跳。00406146803E01CMPBYTEPTRDS:[ESI],100406149^75F3JNZSHORTex2.0040613E....................................................004061528906MOVDWORDPTRDS:[ESI],EAX0040615483C305ADDEBX,50040615783C604ADDESI,40040615A83E905SUBECX,50040615D^EBCEJMPSHORTex2.0040612D往回跳.0040615F5BPOPEBX直接F4到这里。004061605EPOPESI0040616159POPECX0040616258POPEAX00406163EB08JMPSHORTex2.0040616D跳0040616D8BC8MOVECX,EAX0040616F8B3EMOVEDI,DWORDPTRDS:[ESI]0040617103BD22040000ADDEDI,DWORDPTRSS:[EBP+422]004061778BB552010000MOVESI,DWORDPTRSS:[EBP+152]0040617DC1F902SARECX,200406180F3:A5REPMOVSDWORDPTRES:[EDI],DWORDPTRDS>........................................................00406197FF9551050000CALLDWORDPTRSS:[EBP+551]0040619D83C608ADDESI,8004061A0833E00CMPDWORDPTRDS:[ESI],0004061A3^0F851EFFFFFFJNZex2.004060C7回跳004061A96800800000PUSH8000不能F4到这里,程序跑飞,我上篇Aspack2.11很像。004061AE6A00PUSH0004061B0FFB556010000PUSHDWORDPTRSS:[EBP+156]004061B6FF9551050000CALLDWORDPTRSS:[EBP+551]004060C78B4604MOVEAX,DWORDPTRDS:[ESI+4]只能让它回到这里。004060CA050E010000ADDEAX,10E004060CF6A04PUSH4004060D16800100000PUSH1000004060D650PUSHEAX........................................ 004060F9E86E050000CALLex2.0040666CF8过004060FEB301MOVBL,10040610080FB00CMPBL,000406103755EJNZSHORTex2.00406163这个跳转跳好远。00406163/EB08JMPSHORTex2.0040616D跳00406165|0000ADDBYTEPTRDS:[EAX],AL00406167|0EPUSHCS0040616D8BC8MOVECX,EAX0040616F8B3EMOVEDI,DWORDPTRDS:[ESI]0040617103BD22040000ADDEDI,DWORDPTRSS:[EBP+422].............................................00406265/7411JESHORTex2.0040627800406267|03F2ADDESI,EDX00406269|ADLODSDWORDPTRDS:[ESI]00406278BE34200000MOVESI,20340040627D8B9522040000MOVEDX,DWORDPTRSS:[EBP+422]0040628303F2ADDESI,EDX004062858B460CMOVEAX,DWORDPTRDS:[ESI+C]00406295FF954D0F0000CALLDWORDPTRSS:[EBP+F4D]0040629B85C0TESTEAX,EAX0040629D7507JNZSHORTex2.004062A6..............................................004062FCFF95490F0000CALLDWORDPTRSS:[EBP+F49];kernel32.GetProcAddress0040630285C0TESTEAX,EAX004063045BPOPEBX00406305756FJNZSHORTex2.00406376大跳转。004063768907MOVDWORDPTRDS:[EDI],EAX;msvbvm60.MethCallEngine004063788385490500000>ADDDWORDPTRSS:[EBP+549],40040637F^E932FFFFFFJMPex2.004062B6往回跳。004063848906MOVDWORDPTRDS:[ESI],EAXF4下0040638689460CMOVDWORDPTRDS:[ESI+C],EAX00406389894610MOVDWORDPTRDS:[ESI+10],EAX0040638C83C614ADDESI,140040638F8B9522040000MOVEDX,DWORDPTRSS:[EBP+422] 00406395^E9EBFEFFFFJMPex2.00406285往回跳0040639AB86C100000MOVEAX,106CF4下0040639F50PUSHEAX004063A0038522040000ADDEAX,DWORDPTRSS:[EBP+422]004063A659POPECX004063A70BC9ORECX,ECX004063A98985A8030000MOVDWORDPTRSS:[EBP+3A8],EAX004063AF61POPAD看到这个标志,入口就不远了。004063B0/7508JNZSHORTex2.004063BA跳004063B2|B801000000MOVEAX,1004063B7|C20C00RETN0C004063BA\686C104000PUSHex2.0040106C放入入口值40106C004063BFC3RETN返回。0040106C68DB68程序跨段,并且经过了PoPad关键字。我们再这里用Od的Dump插件直接脱壳。0040106DD8DBD80040106E11DB110040106F40DB40;CHAR'@'0040107000DB0000401071E8DBE800401072F0DBF0重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。一点提示,用Od手动跟综循环,为了看清程序跳转方向,需要对Od进行设置,你设置了没有。在Od-选项-调试设置-Cpu,填如图中设置,这样后程序跳转时会有一道红线提示方向,我们好更容易控制程序。看截图"手动脱壳入门第五篇"脱壳动画![NextPage]脱壳教程7:手动脱壳入门第六篇PECompact1.84【使用工具】Peid,Ollydbg【脱壳平台】Win2K/XP【软件名称】note_aPlib.exe【软件简介】 PECompact是一个能压缩可执行文件的工具,通过压缩代码、数据、相关资源使压缩能达到100%,由于在运行时不需要恢复磁盘上压缩后的数据,所以与没有压缩的程序在运行时没有明显的速度差异,在某种程度上还有所改善。【软件大小】18KB【加壳方式】PECompact1.68-1.84->JeremyCollake【保护方式】PECompact1.84aPlib方式【脱壳声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:软件截图我们看到它有aPLib和JCALG1两种压缩引擎,前者对低于64kb的文件压缩效果较好,速度也较快。后者具有更为强劲的压缩效果,对于大文件的压缩效果较好。并有很丰富的各类选项,对普通用户来说,使用其默认设置即可。原版程序本地下载汉化版本本地下载好现在我们来手动脱一个PECompact1.84以aPlib方式加壳的记事本看看它的特性。本地下载首先必须的工具要准备好附件中壳PEiD测壳为PECompact1.68-1.84->JeremyCollake,只能测试出大致版本,其实都差不多。手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。用OD载入程序后。确定一个入口警告,然后Od提示程序加壳,选不继续分析。停在这里0040C000n>/EB06jmpshortnote_aPl.0040C008开始地点。0040C002|68CC100000push10CC0040C007|C3retn0040C008\9Cpushfd注意PECompactd的壳比UPX,Aspack多了这个指令。0040C00960pushad出口处看到与之对应的语句就应知道入口点就在附近。0040C00AE802000000callnote_aPl.0040C011一看就应用F7过,变形的Jmp0040C00F33C0xoreax,eax0040C0118BC4moveax,espCall这里,很近。0040C01383C004addeax,40040C01693xchgeax,ebx0040C0178BE3movesp,ebx0040C0198B5BFCmovebx,dwordptrds:[ebx-4]0040C01C81EB3F904000subebx,note_aPl.0040903F 0040C02287DDxchgebp,ebx...........................................为节省篇幅,略去一些不重要的代码,今后不再赘述。0040C06C8DB5AC904000leaesi,dwordptrss:[ebp+4090AC>0040C072B940040000movecx,4400040C077F3:A5repmovsdwordptres:[edi],dwor>0040C0798BFBmovedi,ebx0040C07BC3retn返回。0040D17BBDCF400000movebp,40CF到这里。0040D1808BF7movesi,edi0040D18283C654addesi,540040D18581C7FF100000addedi,10FF...........................................0040D19EF3:A5repmovsdwordptres:[edi],dwor>0040D1A003C8addecx,eax0040D1A283E103andecx,30040D1A5F3:A4repmovsbyteptres:[edi],byte>0040D1A7EB26jmpshortnote_aPl.0040D1CF跳走。0040D1CF8BB5E6904000movesi,dwordptrss:[ebp+4090E6>;note_aPl.00400000到这里。0040D1D556pushesi0040D1D603B5EE904000addesi,dwordptrss:[ebp+4090EE>0040D1DC83C614addesi,140040D1DF03B535974000addesi,dwordptrss:[ebp+409735>0040D1E58DBD39974000leaedi,dwordptrss:[ebp+409739>0040D1EBB906000000movecx,60040D1F0F3:A5repmovsdwordptres:[edi],dwor>...........................................0040D2108BB5DE904000movesi,dwordptrss:[ebp+4090DE>0040D21680BD6B9D4000C>cmpbyteptrss:[ebp+409D6B],0C30040D21D742Ejeshortnote_aPl.0040D24D跳走。0040D24D57pushedi0040D24EADlodsdwordptrds:[esi]0040D24F85C0testeax,eax0040D2510F849B000000jenote_aPl.0040D2F2这个跳转很大,但是没跳走,先记住,如果下面的语句有往回跳转无法往后继续走,我们再试试这里。0040D2578BD0movedx,eax0040D2590395E6904000addedx,dwordptrss:[ebp+4090E6>0040D25FADlodsdwordptrds:[esi]0040D26056pushesi0040D2618BC8movecx,eax0040D26357pushedi0040D26452pushedx0040D2658DB56BA14000leaesi,dwordptrss:[ebp+40A16B>0040D26B57pushedi 0040D26C51pushecx0040D26D52pushedx0040D26E6A40push400040D27056pushesi0040D271FFB53D974000pushdwordptrss:[ebp+40973D]0040D277FFB539974000pushdwordptrss:[ebp+409739]0040D27DE8B8090000callnote_aPl.0040DC3A...........................................0040D2AA/7407jeshortnote_aPl.0040D2B30040D2AC|8BC8movecx,eax0040D2AE|5Epopesi0040D2AF|5Fpopedi0040D2B0^|EB9Bjmpshortnote_aPl.0040D24D果然往回跳转。0040D2B2B9E8000000movecx,0E8F4无法到达这句,程序运行了。0040D2B7005D81addbyteptrss:[ebp-7F],bl0040D2BAEDineax,dxCtrl+F2重新加载程序,重新来到我们刚才发现的0040D251处,回车。0040D2F25Fpopedi到这里,F2下断点,F9运行跳出循环到这里后再F2取消断点。0040D2F38BB5E2904000movesi,dwordptrss:[ebp+4090E2>0040D2F9ADlodsdwordptrds:[esi]0040D2FA83F8FFcmpeax,-10040D2FD7474jeshortnote_aPl.0040D373这个跳转很大,但是没跳走,先记住,如果下面的语句有往回跳转无法往后继续走,我们再试试这里。0040D2FF0385E6904000addeax,dwordptrss:[ebp+4090E6>0040D3058BD8movebx,eax0040D307ADlodsdwordptrds:[esi]0040D3080385E6904000addeax,dwordptrss:[ebp+4090E6>...........................................0040D3618BD1movedx,ecx0040D363C1F902sarecx,20040D366F3:ABrepstosdwordptres:[edi]0040D36803CAaddecx,edx0040D36A83E103andecx,30040D36DF3:AArepstosbyteptres:[edi]0040D36F5Fpopedi0040D370^EB87jmpshortnote_aPl.0040D2F9果然往回跳转。0040D3720F6800punpckhbwmm0,qwordptrds:[eax]F4无法到达这句,程序运行了。0040D37540inceax0040D3760000addbyteptrds:[eax],al...........................................Ctrl+F2重新加载程序,重新来到我们刚才发现的0040D2FD处,回车。0040D3736800400000push4000到这里,F2下断点,F9运行跳出循环到这里后再F2取消断点。 0040D3786A00push00040D37A57pushedi0040D37BFF9545974000calldwordptrss:[ebp+409745]0040D3818BBD3C964000movedi,dwordptrss:[ebp+40963C>0040D38703BDE6904000addedi,dwordptrss:[ebp+4090E6>0040D38D8B8D40964000movecx,dwordptrss:[ebp+409640>0040D39351pushecx0040D39457pushedi0040D39533D2xoredx,edx0040D39733DBxorebx,ebx0040D39933F6xoresi,esi0040D39B03FEaddedi,esi0040D39D03DEaddebx,esi0040D39F49dececx0040D3A07472jeshortnote_aPl.0040D414可跳出循环。0040D3A27870jsshortnote_aPl.0040D414...........................................0040D3B5/750Ajnzshortnote_aPl.0040D3C1跳走。0040D3B7|80FC80cmpah,800040D3BA|7205jbshortnote_aPl.0040D3C10040D3BC|80FC8Fcmpah,8F0040D3BF|7605jbeshortnote_aPl.0040D3C60040D3C1\47incedi0040D3C243incebx0040D3C3^EBDAjmpshortnote_aPl.0040D39F往回跳转。看到0040D3A0可跳出循环。我们在0040D3A0处点一下,然后回车。0040D4145FpopediF2下断点,F9运行跳出循环到这里后再F2取消断点0040D41559popecx0040D41633C0xoreax,eax0040D41885C9testecx,ecx0040D41A743Bjeshortnote_aPl.0040D4570040D41C8BF7movesi,edi0040D41E33C0xoreax,eax0040D42083F904cmpecx,4...........................................0040D42F8B1Emovebx,dwordptrds:[esi]0040D43103C3addeax,ebx0040D433D1E3shlebx,10040D43583D301adcebx,10040D43833C3xoreax,ebx0040D43A83C604addesi,40040D43D83E904subecx,40040D4407415jeshortnote_aPl.0040D4570040D44283F904cmpecx,40040D445^73E8jnbshortnote_aPl.0040D42F往回跳转 0040D447BA04000000movedx,4F4到这里。0040D44C2BD1subedx,ecx0040D44E2BF2subesi,edx0040D450B904000000movecx,40040D455^EBD8jmpshortnote_aPl.0040D42F又往回跳转0040D4573B8567974000cmpeax,dwordptrss:[ebp+409767>F4到这里。0040D45D744Djeshortnote_aPl.0040D4AC跳走。0040D45F^E94FFEFFFFjmpnote_aPl.0040D2B30040D4ACE8A1010000callnote_aPl.0040D652到这里。Call的距离较远,F8过。0040D4B1E8A3000000callnote_aPl.0040D559Call的距离较远,F8过。0040D4B6736Bjnbshortnote_aPl.0040D523跳走。0040D52380BD6B9F4000C>cmpbyteptrss:[ebp+409F6B],0C30040D52A7422jeshortnote_aPl.0040D54E跳。0040D52C8D956BA14000leaedx,dwordptrss:[ebp+40A16B>0040D5326A40push400040D53452pushedx0040D535FFB53D974000pushdwordptrss:[ebp+40973D]0040D53BFFB539974000pushdwordptrss:[ebp+409739]0040D541E8F40A0000callnote_aPl.0040E03A0040D54685C0testeax,eax0040D548^0F859DFDFFFFjnznote_aPl.0040D2EB0040D54E61popad看到这两个与开始处对应的标志了。0040D54F9Dpopfd入口点就在附近。0040D55050pusheax0040D55168CC104000pushnote_aPl.004010CC0040D556C20400retn4准备返回到程序入口点,跨段。004010CC55pushebp入口点,跨段来到这里并且经过了PoPad和popfd两个关键字,我们在这里用Od的Dump插件直接脱壳。004010CD8BECmovebp,esp004010CF83EC44subesp,44004010D256pushesi004010D3FF15E4634000calldwordptrds:[4063E4];kernel32.GetCommandLineA004010D98BF0movesi,eax 004010DB8A00moval,byteptrds:[eax]004010DD3C22cmpal,22004010DF751Bjnzshortnote_aPl.004010FC004010E156pushesi004010E2FF15F4644000calldwordptrds:[4064F4];USER32.CharNextA重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。总结:PECompac加壳程序入口关键字有两个。pushfd注意PECompactd的壳比UPX,Aspack多了这个指令。pushad出口关键字POPADpopfd和入口关键字对应,过了这两个关键字,要注意程序oep就在附近。通过Ret返回到程序Oep经过实践,发现PECompac1.4X-1.8X加壳的程序手动脱壳流程基本相同,这里就不一一列出,大家碰到后请自行参考本文进行练习。附参考教学。作者:lordor[BCG]来源:看雪论坛加入时间:2003-6-2 对象:五笔打字通5.0作者:lordor[BCG]声明:属技术交流,无其它目的,请不要任意散布或用作商业用途。初学破解,如有不对的地方欢迎批评指出。工具:ollydbg1.09B,插件ollyDumpV2.11.108基本操作:F8-单步执行,遇到call不进入。F7-单步执行,遇到call进入。F4-执行到光标所在行。F2-设断手动脱壳要把握两点:1、单步往前走,不要回头。2、观察。注意poshad、poshfd,popad、popfd等,注意地址发生大的变化。程序用PECompactV1.40-45加的壳,没见过的,在这里只好手动脱壳。0054DC00>/EB06JMPSHORTwb86.0054DC080054DC02|6884370000PUSH37840054DC07|C3RETN 0054DC08\9CPUSHFD0054DC0960PUSHAD0054DC0AE802000000CALLwb86.0054DC11=>单步走到这里,F8过的话程序就运行,所以要F7跟入-------------------------------------------------------------------------------0054DC118BC4MOVEAX,ESP    =>F7后来到这,继续单步运行0054DC1383C004ADDEAX,40054DC1693XCHGEAX,EBX0054DC178BE3MOVESP,EBX0054DC198B5BFCMOVEBX,DWORDPTRDS:[EBX-4]0054DC1C81EB0FA04000SUBEBX,wb86.0040A00F0054DC2287DDXCHGEBP,EBX0054DC248B85A6A04000MOVEAX,DWORDPTRSS:[EBP+40A0A6]0054DC2A018503A04000ADDDWORDPTRSS:[EBP+40A003],EAX0054DC3066:C78500A0400>MOVWORDPTRSS:[EBP+40A000],90900054DC3901859EA04000ADDDWORDPTRSS:[EBP+40A09E],EAX0054DC3FBBC3110000MOVEBX,11C30054DC44039DAAA04000ADDEBX,DWORDPTRSS:[EBP+40A0AA]0054DC4A039DA6A04000ADDEBX,DWORDPTRSS:[EBP+40A0A6]0054DC5053PUSHEBX0054DC5153PUSHEBX...............(一直往前走,省略).....................0054F25E57PUSHEDI0054F25FADLODSDWORDPTRDS:[ESI]0054F2600BC0OREAX,EAX0054F262746CJESHORTwb86.0054F2D00054F2648BD0MOVEDX,EAX0054F2660395A6A04000ADDEDX,DWORDPTRSS:[EBP+40A0A6]0054F26CADLODSDWORDPTRDS:[ESI]0054F26D56PUSHESI0054F26E8BC8MOVECX,EAX0054F27057PUSHEDI0054F27152PUSHEDX0054F2728BF2MOVESI,EDX0054F2748B8515A64000MOVEAX,DWORDPTRSS:[EBP+40A615]0054F27A8B9D19A64000MOVEBX,DWORDPTRSS:[EBP+40A619]0054F280E8910A0000CALLwb86.0054FD160054F2855APOPEDX0054F2865FPOPEDI 0054F28752PUSHEDX0054F28857PUSHEDI0054F289FF959EA04000CALLDWORDPTRSS:[EBP+40A09E]0054F28F0BC0OREAX,EAX0054F2917407JESHORTwb86.0054F29A0054F2938BC8MOVECX,EAX0054F2955EPOPESI0054F2965FPOPEDI0054F297^EBC5JMPSHORTwb86.0054F25E  ==>走到这里会跳到前面,把光标移动到下一行,F4跳过时程序会直接运行,所以还得单步运行,走到上面的0054F262处会跳到后面去了0054F299B98D9D97A5MOVECX,A5979D8D0054F29E40INCEAX0054F29F0053FFADDBYTEPTRDS:[EBX-1],DL0054F2A295XCHGEAX,EBP0054F2A315A640008DADCEAX,8D0040A60054F2A89DPOPFD...............(一直往前走,省略).....................0054F2CF2458ANDAL,58  ==>从上面跳到这,继续单步走0054F2D18DB5C3A64000LEAESI,DWORDPTRSS:[EBP+40A6C3]0054F2D7ADLODSDWORDPTRDS:[ESI]0054F2D80BC0OREAX,EAX0054F2DA7474JESHORTwb86.0054F3500054F2DC0385A6A04000ADDEAX,DWORDPTRSS:[EBP+40A0A6]...............(一直往前走,省略).....................0054F36D49DECECX0054F36E7472JESHORTwb86.0054F3E20054F3707870JSSHORTwb86.0054F3E20054F37266:8B07MOVAX,WORDPTRDS:[EDI]0054F3752CE8SUBAL,0E80054F3773C01CMPAL,10054F3797638JBESHORTwb86.0054F3B30054F37B66:3D1725CMPAX,25170054F37F7451JESHORTwb86.0054F3D20054F3813C27CMPAL,270054F383750AJNZSHORTwb86.0054F38F0054F38580FC80CMPAH,800054F3887205JBSHORTwb86.0054F38F0054F38A80FC8FCMPAH,8F0054F38D7605JBESHORTwb86.0054F3940054F38F47INCEDI0054F39043INCEBX0054F391^EBDAJMPSHORTwb86.0054F 36D ==>这里又跳到前面,看一下前面那一句会跳到后面的,是JESHORT0054F3E2,JSSHORT0054F3E2,JBESHORTwb86.0054F3B3,JESHORT0054F3D2,依次在其跳往的地方设断。F9运行,会在设断的地方停,最后确定0054F3E2才是正确的设断地方0054F393B88B47023CMOVEAX,3C02478B...............(一直往前走,省略).....................0054F4768BB515A64000MOVESI,DWORDPTRSS:[EBP+40A615]0054F47C8BBD19A64000MOVEDI,DWORDPTRSS:[EBP+40A619]0054F482E88F0C0000CALLwb86.005501160054F48761POPAD==>看到希望了,继续单步走0054F4889DPOPFD0054F48950PUSHEAX0054F48A6884374000PUSHwb86.004037840054F48FC20400RETN4 ==>走过这里,地址会有很大变化,可以确定,壳已脱完了。0054F4928BB537A64000MOVESI,DWORDPTRSS:[EBP+40A637]0040378100DB0000403782>0000ADDBYTEPTRDS:[EAX],AL00403784.6894FF4300PUSHwb86.0043FF94  ===>由0054F48F处跳来,在这里运行ollyDump把程序dump下来。到此手动脱壳结束。00403789E8DBE80040378AEEDBEE0040378BFFDBFF0040378CFFDBFF0040378DFFDBFF0040378E00DB000040378F00DB000040379000DB000040379100DB000040379200DB00脱完后可以用侦壳工具看,是用VB写的。其它壳(如Aspack等)都可以用此法配合OLLYDUMP来手动脱壳."手动脱壳入门第六篇"脱壳动画!脱壳教程8:手动脱壳入门第七篇EZIP1.0加壳的一个Win98的记事本【使用工具】Peid,Ollydbg,Loadpe,ImportREC【脱壳平台】Win2K/XP 【软件名称】Notepad.exe【软件简介】EZIP1.0加壳的一个Win98的记事本【软件大小】33.8KB【加壳方式】EZIP1.0->JonathanClark[Overlay]【保护方式】EZIP【脱壳声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:软件截图本地下载好现在我们来手动脱一个EZIP1.0加壳的记事本看看它的特性。本地下载我们看到加壳后文件大小79.3k,原Win98下的记事本52K,看来这个程序不是已压缩文件大小为目的,只是个简单保护程序不被反汇编的简单加壳程序。首先必须的工具要准备好附件中壳为Peid测壳为EZIP1.0->JonathanClark[重叠]手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。用OD载入程序后。这次没有任何提示,应为这个壳是增肥壳,所以Od无压缩提示。停在这里0040D0BEN>/E919320000jmpNotepad.004102DC开始地点,和我们平时看到的Pushad等不同。怎样找Oep呢,只能在程序跨段跳跃时,地址变化很大时寻找Oep,一般通过Jmp,Ret等语句跨段。0040D0C3.|E97C2A0000jmpNotepad.0040FB440040D0C8|E919240000jmpNotepad.0040F4E60040D0CD|E9FF230000jmpNotepad.0040F4D10040D0D2.|E91E2E0000jmpNotepad.0040FEF50040D0D7|E9882E0000jmpNotepad.0040FF640040D0DC|E92C250000jmpNotepad.0040F60D0040D0E1|E9AE150000jmpNotepad.0040E6940040D0E6|E9772B0000jmpNotepad.0040FC620040D0EB|E987020000jmpNotepad.0040D3770040D0F0|E9702E0000jmpNotepad.0040FF65 如无特别提示,单步跟踪脱壳均用F8键步过。004102DC/>\55pushebp跳到这里。004102DD|.8BECmovebp,esp004102DF|.81EC28040000subesp,428004102E5|.53pushebx004102E6|.56pushesi004102E7|.57pushedi004102E8|.8D8594FCFFFFleaeax,dwordptrss:[ebp-36C]004102EE|.50pusheax004102EF|.E8FCCDFFFFcallNotepad.0040D0F0远程Call用F8过。004102F4|.59popecx004102F5|.85C0testeax,eax004102F7|.7505jnzshortNotepad.004102FE跳004102F9|.E98C030000jmpNotepad.0041068A004102FE|>\6800800000push8000到这里。00410303|.6A00push000410305|.FF95DCFCFFFFcalldwordptrss:[ebp-324];kernel32.GlobalAlloc0041030B|.89853CFCFFFFmovdwordptrss:[ebp-3C4],eax...................................................0041033A|.6800304100pushNotepad.00413000;ASCII"1.1.3"0041033F|.8D8544FCFFFFleaeax,dwordptrss:[ebp-3BC]00410345|.50pusheax00410346|.E8E7CCFFFFcallNotepad.0040D032远程Call用F8过。...................................................004103C3|.8D85ECFBFFFFleaeax,dwordptrss:[ebp-414]004103C9|.50pusheax004103CA|.8D853CFCFFFFleaeax,dwordptrss:[ebp-3C4]004103D0|.50pusheax004103D1|.8D8594FCFFFFleaeax,dwordptrss:[ebp-36C]004103D7|.50pusheax004103D8|.E828CCFFFFcallNotepad.0040D005远程Call用F8过。...................................................004103F0|.8D8594FCFFFFleaeax,dwordptrss:[ebp-36C]004103F6|.50pusheax004103F7|.E809CCFFFFcallNotepad.0040D005004103FC|.83C410addesp,10004103FF|.68E0000000push0E000410404|.8D8508FDFFFFleaeax,dwordptrss:[ebp-2F8]0041040A|.50pusheax0041040B|.8D853CFCFFFFleaeax,dwordptrss:[ebp-3C4]00410411|.50pusheax00410412|.8D8594FCFFFFleaeax,dwordptrss:[ebp-36C]00410418|.50pusheax 00410419|.E8E7CBFFFFcallNotepad.0040D005远程Call用F8过。...................................................0041042B|./750CjnzshortNotepad.00410439小跳转,没什么值得注意。0041042D|.|0FBE85EDFBFF>movsxeax,byteptrss:[ebp-413]00410434|.|83F85Acmpeax,5A00410437|.|7414jeshortNotepad.0041044D00410439|>|6A00push00041043B|.|68644B4100pushNotepad.00414B6400410440|.|68184A4100pushNotepad.00414A18;ASCII"badDosHeader"00410445|.|6A00push000410447|.|FF9504FDFFFFcalldwordptrss:[ebp-2FC]0041044D|>\6A40push40...................................................004104BE|.E8BFCBFFFFcallNotepad.0040D082远程Call用F8过。004104C3|.83C40Caddesp,0C004104C6|.8B85DCFBFFFFmoveax,dwordptrss:[ebp-424]004104CC|.8B8DDCFBFFFFmovecx,dwordptrss:[ebp-424]004104D2|.03483Caddecx,dwordptrds:[eax+3C]004104D5|.898DE4FBFFFFmovdwordptrss:[ebp-41C],ecx004104DB|.8B85E4FBFFFFmoveax,dwordptrss:[ebp-41C]004104E1|.83C018addeax,18004104E4|.89852CFCFFFFmovdwordptrss:[ebp-3D4],eax004104EA|.8B852CFCFFFFmoveax,dwordptrss:[ebp-3D4]...................................................0041050A|.E873CBFFFFcallNotepad.0040D082远程Call用F8过。0041050F|.83C40Caddesp,0C00410512|.68E0000000push0E000410517|.8D8508FDFFFFleaeax,dwordptrss:[ebp-2F8]0041051D|.50pusheax0041051E|.FFB52CFCFFFFpushdwordptrss:[ebp-3D4]00410524|.E859CBFFFFcallNotepad.0040D082远程Call用F8过。00410529|.83C40Caddesp,0C0041052C|.8B85E4FBFFFFmoveax,dwordptrss:[ebp-41C]00410532|.0FB74006movzxeax,wordptrds:[eax+6]...................................................0041054E|.E8B2CAFFFFcallNotepad.0040D005远程Call用F8过。00410553|.83C410addesp,1000410556|.83A534FCFFFF>anddwordptrss:[ebp-3CC],00041055D|.EB0DjmpshortNotepad.0041056C跳走。0041056C|>\8B85E4FBFFFFmoveax,dwordptrss:[ebp-41C];Notepad.0040008000410572|.0FB74006|movzxeax,wordptrds:[eax+6]00410576|.398534FCFFFF|cmpdwordptrss:[ebp-3CC],eax0041057C|.0F839D000000|jnbNotepad.0041061F 看这个跳转很大,估计是循环出口。这里没跳走,因为脱壳的过程是外壳程序程序在内存中解压程序,我们看到的解压过程就是一些循环,解压完毕后就要转到程序入口点,准备运行程序,这个时候就是我们手动脱壳的时机。...................................................004105E0|.8B85ECFDFFFF|moveax,dwordptrss:[ebp-214]004105E6|.FF7010|pushdwordptrds:[eax+10]004105E9|.FFB5D8FBFFFF|pushdwordptrss:[ebp-428]004105EF|.FFB5E8FDFFFF|pushdwordptrss:[ebp-218]004105F5|.8D853CFCFFFF|leaeax,dwordptrss:[ebp-3C4]004105FB|.50|pusheax004105FC|.8D8594FCFFFF|leaeax,dwordptrss:[ebp-36C]00410602|.50|pusheax00410603|.E848CAFFFF|callNotepad.0040D05000410608|.83C418|addesp,180041060B|.8B85ECFDFFFF|moveax,dwordptrss:[ebp-214]00410611|.83C028|addeax,2800410614|.8985ECFDFFFF|movdwordptrss:[ebp-214],eax0041061A|.^E940FFFFFF\jmpNotepad.0041055F跳到0041055F,直到在内存中解压完毕从0041057C跳出。我们点一下0041057C这行,然后回车。0041057C|.0F839D000000|jnbNotepad.0041061F回车0041061F|>\FFB5E8FDFFFFpushdwordptrss:[ebp-218]F2在这句下断点,F9执行到这里F2取消断点。00410625|.FF95D4FCFFFFcalldwordptrss:[ebp-32C];kernel32.CloseHandle0041062B|.8D8594FCFFFFleaeax,dwordptrss:[ebp-36C]00410631|.50pusheax00410632|.8B852CFCFFFFmoveax,dwordptrss:[ebp-3D4]00410638|.8B8DE0FBFFFFmovecx,dwordptrss:[ebp-420]0041063E|.2B481Csubecx,dwordptrds:[eax+1C]00410641|.51pushecx00410642|.FFB52CFCFFFFpushdwordptrss:[ebp-3D4]00410648|.E86CCAFFFFcallNotepad.0040D0B90041064D|.83C40Caddesp,0C00410650|.8D8594FCFFFFleaeax,dwordptrss:[ebp-36C]00410656|.50pusheax00410657|.FFB52CFCFFFFpushdwordptrss:[ebp-3D4]...................................................00410648|.E86CCAFFFFcallNotepad.0040D0B9远程Call用F8过。0041064D|.83C40Caddesp,0C00410650|.8D8594FCFFFFleaeax,dwordptrss:[ebp-36C]00410656|.50pusheax00410657|.FFB52CFCFFFFpushdwordptrss:[ebp-3D4]0041065D|.E8F3C9FFFFcallNotepad.0040D055远程Call用F8过。 00410662|.59popecx00410663|.59popecx00410664|.8B852CFCFFFFmoveax,dwordptrss:[ebp-3D4]0041066A|.8B4010moveax,dwordptrds:[eax+10]0041066D|.8B8D2CFCFFFFmovecx,dwordptrss:[ebp-3D4]00410673|.03411Caddeax,dwordptrds:[ecx+1C]00410676|.898538FCFFFFmovdwordptrss:[ebp-3C8],eax0041067C|.8B8538FCFFFFmoveax,dwordptrss:[ebp-3C8]00410682|.5Fpopedi00410683|.5Epopesi00410684|.5Bpopebx00410685|.8BE5movesp,ebp00410687|.5Dpopebp00410688|.-FFE0jmpeax;Notepad.004010CC呵,解压完毕,准备跳到入口点了。410688和4010CC多么明显的跨段004010CC55pushebp入口点。注意,因为这个壳会修改PE头,只好用LordPE脱壳。用Od的插件脱壳并修复也不能运行。Loadpe脱壳时,在进程列表中找到Notepad.exe这个进程,点右键完整脱壳,保存即可。截图004010CD8BECmovebp,esp004010CF83EC44subesp,44004010D256pushesi004010D3FF15E4634000calldwordptrds:[4063E4];kernel32.GetCommandLineA004010D98BF0movesi,eax004010DB8A00moval,byteptrds:[eax]004010DD3C22cmpal,22004010DF751BjnzshortNotepad.004010FC004010E156pushesi004010E2FF15F4644000calldwordptrds:[4064F4];USER32.CharNextA004010E88BF0movesi,eax脱壳后的入口点不正确,手动改麻烦,我们用ImportREC这个专业级的工具修复,如果输入表坏的也可一并修复,还可以跨平台运行。Imprec修复过程。在Oep处填000010cc,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,正常运行,这里不用备份,Imprec自动帮你做了.大家一定会问:为什么我发了一篇关于汇编的文章,现在有发呢?不是重复吗?因为汇编对于破解来讲太重要了,希望大家一定认真记熟下面的语句以及公式!告戒初学者:知识不要贪多,最重要的是学杂实! 软件破解常用汇编指令  cmp  a,b    //  比较a与b  mov  a,b    //  把b值送给a值,使a=b  ret        //  返回主程序  nop        //  无作用,英文(nooperation)简写,意思“donothing”(机器码90)                  (ultraedit打开编辑exe文件看到90相当汇编语句的nop)  call        //  调用子程序,子程序以ret结尾  je或jz      //  相等则跳(机器码是74或84)  jne或jnz    //  不相等则跳(机器码是75或85)  jmp        //  无条件跳(机器码是EB)  jb        //  若小于则跳  ja        //  若大于则跳  jg        //  若大于则跳  jge        //  若大于等于则跳  jl        //  若小于则跳  popxxx      //  xxx出栈  pushxxx    //  xxx压栈                  爆破无敌口诀            一条(跳)就死,九筒(90)就胡              (对应上面的2--修改为nop)            一条(跳)就胡,一饼(EB)伺候              (对应上面的1--修改为jmp)                  妻死(74)便妻无(75)                  爸死(84)便爸无(85)  大家不懂不要紧,一定要先牢记,以后慢慢的理解。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭