脱壳教程第1-4篇
脱壳教程1:认识脱壳一切从“壳”开始
首先大家应该先明白“壳”的概念。在自然界中,大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。
最早提出“壳”这个概念的,据我所知,应该是当年推出脱壳软件 RCOPY 3 的作者熊焰先生。在几年前的 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 文件(后来放弃了)的脱壳软件,在我的站台公开后,得到了很多朋友们的肯定。要知道,从RCOPY 3 开始,绝大部分的脱壳软件都是要两次运行目标程序来确定 EXE 的重定位数据的。BW 的这一特点虽然有兼容性的问题,但也树立了自己的风格、特色。经过几个月的改善, BW 升级到了 2.0 版本,这个版本的推出可以说是 BW 的转折点,因为它已经是一个成熟、稳定脱壳软件了,它可以对付当时(现在)大多数的壳,包括当时最新的 FSE 0.6 等。更重要的是这个版本把选择壳的和软件“分界线”这个最令新手头疼的步骤简化到不能再简化的地步,使更多的朋友接受了它。另外,能加强 BW 功力的 CI 模式也是其它脱壳软件没有的东西。最近,BW 发表了最新的 2.5 BETA2 版本,增强了一些方面的功能,因它竟然可以脱掉号称最厉害的磁盘加密工具 LOCKKING 2.0 的加密壳,因而进一步奠定了它在“脱壳界”的地位。说到最新,就不能不提 GTR、LTR、EDUMP、ADUMP、UPS、UPX、APACK 这几个国外的好软件了,它们每个都有自己的特色,可以说都是当今各类“壳”中的最新代表了。(这些软件和详细介绍请到我的主页查阅) 由于 WINDOWS 3.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起始菜单的运行,键入
fi aa
第二种:待侦测壳的软件(如aa.exe)和fi.exe位于同一目录下,将aa的图标拖到fi的图标上
2.侦测壳和软件所用编写语言的软件language.exe(两个功能
合为一体,很棒) 推荐language2000中文版,我的主页可下载
傻瓜式软件,运行后选取待侦测壳的软件即可(open)
脱壳教程2:手动脱壳入门第一篇 脱壳教程2:手动脱壳入门第一篇
【使用工具】 Ollydbg1.10b,ImportREC1.6F
【破解平台】 Win2000/XP
前言,作者写这篇文章只是举个例子,希望读者能够举一反三,看清思路.
本论坛中破解高手很多,不会手动脱壳者人数仍然不少。有人会说,我有Unaspack,Caspr,ProcDump等众多脱壳工具,不会手动脱壳用工具脱就可以了。但有部分壳如Asprotect1.23Rc4,本论坛高手仙剑(将自己加密壳伪装成C++),有漏洞,用Peid查壳,Ep区段写有Xj,用Od载入提示有壳,更有甚一些软件如大嘴日语加了四层壳,这些都是工具无法脱壳的。随着加密壳的不断出现,基本壳都不会,高版本的加密壳以后脱壳盲根本无从入手。所以,手动脱壳Crack必修。
手动脱壳的主要步骤是:寻找入口点,转储(dump)程序,修复引入函数表(Import Table)
现在的壳分压缩壳,和加密壳。压缩壳目的是使文件大小变小,便于在网上传播。并有一定的保护作用,你无法反汇编加壳程序。加密壳目的是用各种手段保护软件不被脱壳,跟踪,文件大小不是它的目的,有的甚至变大。
判断加密壳压缩壳和普通程序分别很容易,用Ollydbg载入程序。
没加壳软件无任何提示。
加密壳有些Od载入时会提示压缩,基本上F9运行后,OD提示程序异常。
普通加壳Od载入时一般都会发现,提示软件被加壳,是否继续分析。
还有些是脱壳没有脱干净,Od载入时也提示加壳。
更猛的壳用Od载入就异常,如Acprotect。
关于壳的知识不是一两篇文章就能说清,要经过大量的各种壳的脱壳经验,参考文章。
好,我们先从一个基本的Upx壳入手。
本地下载
首先必须的工具要准备好,
查壳工具
Peid0.91,Fileinfo,Language2000,File Scanner等。
查入口工具。
Peid0.91首推,冲击波(9X)系统专用,Asloader,自己的感觉,程序跨段跳跃点。
脱壳工具。
Ollydbg首选,LoadPe,PEditor,ProcDump等,够用了。
修复引入函数表(Import Table)工具。
Imprec,File Scanner,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 > 60 PUSHAD 停在这里,我们先记住UPX壳的加壳入口第一句是PUSHAD
出口暂时不清楚,为的是今后碰到多层壳有准备。
0046AC01 BE 00104400 MOV ESI,ex1.00441000
0046AC06 8DBE 0000FCFF LEA EDI,DWORD PTR DS:
0046AC0C C787 D0940500 D>MOV DWORD PTR DS:,10A125D8
0046AC16 57 PUSH EDI
0046AC17 83CD FF OR EBP,FFFFFFFF
0046AC1A EB 0E JMP SHORT ex1.0046AC2A 跳走
0046AC1C 90 NOP
0046AC1D 90 NOP
0046AC1E 90 NOP
0046AC1F 90 NOP
0046AC20 8A06 MOV AL,BYTE PTR DS:
0046AC22 46 INC ESI
0046AC23 8807 MOV BYTE PTR DS:,AL
0046AC25 47 INC EDI
0046AC26 01DB ADD EBX,EBX
0046AC28 75 07 JNZ SHORT ex1.0046AC31
0046AC2A 8B1E MOV EBX,DWORD PTR DS: 到这里。
0046AC2C 83EE FC SUB ESI,-4
0046AC2F 11DB ADC EBX,EBX
0046AC31 ^ 72 ED JB SHORT ex1.0046AC20 这里注意,往回跳。脱壳时记住只能让程序往前运行
0046AC33 B8 01000000 MOV EAX,1 在这里点一下,F4运行到这句继续。
0046AC38 01DB ADD EBX,EBX
0046AC3A 75 07 JNZ SHORT ex1.0046AC43 跳 0046AC3C 8B1E MOV EBX,DWORD PTR DS:
0046AC3E 83EE FC SUB ESI,-4
0046AC41 11DB ADC EBX,EBX
0046AC43 11C0 ADC EAX,EAX
0046AC45 01DB ADD EBX,EBX
0046AC47 ^ 73 EF JNB SHORT ex1.0046AC38
0046AC49 75 09 JNZ SHORT ex1.0046AC54 跳
0046AC4B 8B1E MOV EBX,DWORD PTR DS:
0046AC4D 83EE FC SUB ESI,-4
0046AC50 11DB ADC EBX,EBX
0046AC52 ^ 73 E4 JNB SHORT ex1.0046AC38
0046AC54 31C9 XOR ECX,ECX
0046AC56 83E8 03 SUB EAX,3
0046AC59 72 0D JB SHORT ex1.0046AC68 跳
0046AC5B C1E0 08 SHL EAX,8
0046AC5E 8A06 MOV AL,BYTE PTR DS:
0046AC60 46 INC ESI
0046AC61 83F0 FF XOR EAX,FFFFFFFF
0046AC64 74 74 JE SHORT ex1.0046ACDA
0046AC66 89C5 MOV EBP,EAX
0046AC68 01DB ADD EBX,EBX
0046AC6A 75 07 JNZ SHORT ex1.0046AC73 跳
0046AC6C 8B1E MOV EBX,DWORD PTR DS:
0046AC6E 83EE FC SUB ESI,-4
0046AC71 11DB ADC EBX,EBX
0046AC73 11C9 ADC ECX,ECX
0046AC75 01DB ADD EBX,EBX
0046AC77 75 07 JNZ SHORT ex1.0046AC80 跳
0046AC79 8B1E MOV EBX,DWORD PTR DS:
0046AC7B 83EE FC SUB ESI,-4
0046AC7E 11DB ADC EBX,EBX
0046AC80 11C9 ADC ECX,ECX
0046AC82 75 20 JNZ SHORT ex1.0046ACA4 跳
0046AC84 41 INC ECX
0046AC85 01DB ADD EBX,EBX
0046AC87 75 07 JNZ SHORT ex1.0046AC90
0046AC89 8B1E MOV EBX,DWORD PTR DS:
0046AC8B 83EE FC SUB ESI,-4
0046AC8E 11DB ADC EBX,EBX
0046AC90 11C9 ADC ECX,ECX
0046AC92 01DB ADD EBX,EBX
0046AC94 ^ 73 EF JNB SHORT ex1.0046AC85
0046AC96 75 09 JNZ SHORT ex1.0046ACA1
0046AC98 8B1E MOV EBX,DWORD PTR DS:
0046AC9A 83EE FC SUB ESI,-4
0046AC9D 11DB ADC EBX,EBX
0046AC9F ^ 73 E4 JNB SHORT ex1.0046AC85
0046ACA1 83C1 02 ADD ECX,2
0046ACA4 81FD 00F3FFFF CMP EBP,-0D00
0046ACAA 83D1 01 ADC ECX,1
0046ACAD 8D142F LEA EDX,DWORD PTR DS:
0046ACB0 83FD FC CMP EBP,-4
0046ACB3 76 0F JBE SHORT ex1.0046ACC4 这一句可以跳出这个循环。 0046ACB5 8A02 MOV AL,BYTE PTR DS:
0046ACB7 42 INC EDX
0046ACB8 8807 MOV BYTE PTR DS:,AL
0046ACBA 47 INC EDI
0046ACBB 49 DEC ECX
0046ACBC ^ 75 F7 JNZ SHORT ex1.0046ACB5 注意,往回跳。
0046ACBE ^ E9 63FFFFFF JMP ex1.0046AC26 这里也往回跳。
0046ACC3 90 NOP
0046ACC4 8B02 MOV EAX,DWORD PTR DS: 呵,在这里点一下,F4到这里。
0046ACC6 83C2 04 ADD EDX,4
0046ACC9 8907 MOV DWORD PTR DS:,EAX
0046ACCB 83C7 04 ADD EDI,4
0046ACCE 83E9 04 SUB ECX,4
0046ACD1 ^ 77 F1 JA SHORT ex1.0046ACC4 往回跳。
0046ACD3 01CF ADD EDI,ECX
0046ACD5 ^ E9 4CFFFFFF JMP ex1.0046AC26 这里也往回跳
0046ACDA 5E POP ESI 呵,在这里点一下,F4到这里。
0046ACDB 89F7 MOV EDI,ESI
0046ACDD B9 C8230000 MOV ECX,23C8
0046ACE2 8A07 MOV AL,BYTE PTR DS:
0046ACE4 47 INC EDI
0046ACE5 2C E8 SUB AL,0E8
0046ACE7 3C 01 CMP AL,1
0046ACE9 ^ 77 F7 JA SHORT ex1.0046ACE2 往回跳。
0046ACEB 803F 0D CMP BYTE PTR DS:,0D在这里点一下,F4到这里。
0046ACEE ^ 75 F2 JNZ SHORT ex1.0046ACE2
0046ACF0 8B07 MOV EAX,DWORD PTR DS:
0046ACF2 8A5F 04 MOV BL,BYTE PTR DS:
0046ACF5 66:C1E8 08 SHR AX,8
0046ACF9 C1C0 10 ROL EAX,10
0046ACFC 86C4 XCHG AH,AL
0046ACFE 29F8 SUB EAX,EDI
0046AD00 80EB E8 SUB BL,0E8
0046AD03 01F0 ADD EAX,ESI
0046AD05 8907 MOV DWORD PTR DS:,EAX
0046AD07 83C7 05 ADD EDI,5
0046AD0A 89D8 MOV EAX,EBX
0046AD0C ^ E2 D9 LOOPD SHORT ex1.0046ACE7 这是个循环,往回跳。
0046AD0E 8DBE 00700600 LEA EDI,DWORD PTR DS:在这里点一下,F4到这里。
0046AD14 8B07 MOV EAX,DWORD PTR DS:
0046AD16 09C0 OR EAX,EAX
0046AD18 74 3C JE SHORT ex1.0046AD56
0046AD1A 8B5F 04 MOV EBX,DWORD PTR DS:
0046AD1D 8D8430 BCA90600 LEA EAX,DWORD PTR DS:
0046AD24 01F3 ADD EBX,ESI
0046AD26 50 PUSH EAX
0046AD27 83C7 08 ADD EDI,8
0046AD2A FF96 5CAA0600 CALL DWORD PTR DS:
到这里我们看到信息框中写有
0046AD2A FF96 5CAA0>call dword ptr ds: KERNEL32.LoadLibraryA 如果我们直接下断点Bp LoadLibraryA,F9运行程序,Ctrl+F9返回到这句不就省很多事,这里大家以后会明白的,脱大量的壳后,我们先有一个概念。
0046AD30 95 XCHG EAX,EBP
0046AD31 8A07 MOV AL,BYTE PTR DS:
0046AD33 47 INC EDI
0046AD34 08C0 OR AL,AL
0046AD36 ^ 74 DC JE SHORT ex1.0046AD14
0046AD38 89F9 MOV ECX,EDI
0046AD3A 57 PUSH EDI
0046AD3B 48 DEC EAX
0046AD3C F2:AE REPNE SCAS BYTE PTR ES:
0046AD3E 55 PUSH EBP
0046AD3F FF96 60AA0600 CALL DWORD PTR DS:
到这里我们看到信息框中写有,GetProcAddress这里也是好断点啊。
0046AD3F FF96 60AA0>call dword ptr ds: ; KERNEL32.GetProcAddress
0046AD45 09C0 OR EAX,EAX
0046AD47 74 07 JE SHORT ex1.0046AD50
0046AD49 8903 MOV DWORD PTR DS:,EAX
0046AD4B 83C3 04 ADD EBX,4
0046AD4E ^ EB E1 JMP SHORT ex1.0046AD31 往回跳。
0046AD50 FF96 64AA0600 CALL DWORD PTR DS:
0046AD56 61 POPAD 关键点,入口就在附近。 和PUSHAD对应。在这里点一下,F4到这里。
0046AD57 ^ E9 98CBFEFF JMP ex1.004578F4 跳到入口。程序跨段跳跃。
0046AD5C ^ 74 AD JE SHORT ex1.0046AD0B
0046AD5E 46 INC ESI
.................................................
程序加壳段地址一直在0046XXXX突然跳转到0045XXXX段,跨段跳跃时,一般都是在内存中脱壳完毕,准备运行程序,手动脱壳就是要在入口将程序Dump出来。转到入口时一般都有Popad语句和开始的PUSHAD对应。
.................................................
004578F4 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。
见截图.
004578F5 8BEC MOV EBP,ESP004578F7 83C4 F4 ADD ESP,-0C
004578FA B8 AC774500 MOV EAX,ex1.004577AC
004578FF E8 2CE6FAFF CALL ex1.00405F30
00457904 A1 40954500 MOV EAX,DWORD PTR DS:
00457909 8B00 MOV EAX,DWORD PTR DS:
0045790B E8 78A1FEFF CALL ex1.00441A88
00457910 8B0D 10964500 MOV ECX,DWORD PTR DS: ; ex1.0045A820
00457916 A1 40954500 MOV EAX,DWORD PTR DS:
0045791B 8B00 MOV EAX,DWORD PTR DS:
0045791D 8B15 24744500 MOV EDX,DWORD PTR DS: ; ex1.00457470
00457923 E8 78A1FEFF CALL ex1.00441AA0
00457928 A1 40954500 MOV EAX,DWORD PTR DS:
0045792D 8B00 MOV EAX,DWORD PTR DS:
0045792F E8 ECA1FEFF CALL ex1.00441B20 00457934 E8 8BBEFAFF CALL ex1.004037C4
00457939 8D40 00 LEA EAX,DWORD PTR DS:
总结:
Upx壳直接Ctrl+F找Popad,向下一个jmp跳到入口,
命令行下断点 bp GetProcAddress
F9运行,Ctrl+F9返回到程序,向下到Popad处的jmp跳到入口.
在入口处Dump程序.
UPX脱壳断点
bp LoadLibraryA
bp GetProcAddress
UPX加壳入口第一句是PUSHAD
出口关键字
POPAD
一般经过JMP跨段跳跃到入口处.
我们以后每手动脱一个壳就总结一次.
脱壳后发现程序不能运行,这时需要用Imprec修复引入函数表(Import Table)
在Oep处填000578F4,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,正常运行,这里不用备份,Imprec自动帮你做了.见截图.
期待这是引你初学者入脱壳大门的第一步.
"手动脱壳入门第一篇"脱壳动画
脱壳教程3:手动脱壳入门第二篇
脱壳教程3:手动脱壳入门第二篇
【使用工具】 Fi,Peid,Ollydbg
【脱壳平台】 Win2K/XP
【软件名称】 chap702
【软件简介】 UPX V1.08加壳的一个Win98的记事本
【软件大小】 15.9KB
【加壳方式】 UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
【保护方式】 UPX普通壳
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:
脱壳内容
UPX脱壳第一篇总结内容如下:
UPX脱壳断点
bp LoadLibraryA 经过两个很关键的脱壳相关函数,很快到入口点,前面有Popad
bp GetProcAddress 这个优先下断点,可省略很多循环,我们在第一篇已看清UPX手动脱壳流程.
UPX加壳入口第一句是PUSHAD
出口关键字
POPAD
一般经过JMP跨段跳跃到入口处.
有了手动脱壳第一片的总结,脱UPX壳很容易.
好,我们看第二个Upx壳。
本地下载
首先必须的工具要准备好,
附件中壳为Fi测壳为Upx1.08,Peid这里测不出Upx的压缩版本。
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
用OD载入程序后。
Od提示程序加壳,选不继续分析。
0040E8C0 > 60 PUSHAD UPX壳的加壳入口第一句是PUSHAD
0040E8C1 BE 15B04000 MOV ESI,chap702.0040B015
0040E8C6 8DBE EB5FFFFF LEA EDI,DWORD PTR DS:
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
0040E8D0 EB 10 JMP SHORT chap702.0040E8E2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
...................................
我们这一次不单步跟踪,我们再命令行下断点
Bp GetProcAddress
入口前必经之函数.
见截图.
F9运行中断在
77E7564B > 55 PUSH EBP 断在这里 ,注意这里是系统领空 ; KERNEL32.77E60000 F2取消断点.Ctrl+F9返回.
77E7564C 8BEC MOV EBP,ESP
77E7564E 51 PUSH ECX
77E7564F 51 PUSH ECX
77E75650 53 PUSH EBX
77E75651 57 PUSH EDI
77E75652 8B7D 0C MOV EDI,DWORD PTR SS:
77E75655 BB FFFF0000 MOV EBX,0FFFF
77E7565A 3BFB CMP EDI,EBX
77E756A8 C2 0800 RETN 8 到这里,F8
77E756AB - FF25 2013E677 JMP DWORD PTR DS:[<&NTDLL.LdrGetProcedur>; ntdll.LdrGetProcedureAddress 77E756B1 85FF TEST EDI,EDI
77E756B3 0F85 AD620000 JNZ KERNEL32.77E7B966
77E756B9 8B45 FC MOV EAX,DWORD PTR SS:
77E756BC 8B40 04 MOV EAX,DWORD PTR DS:
77E756BF 0FB740 2E MOVZX EAX,WORD PTR DS:
77E756C3 EB 0A JMP SHORT KERNEL32.77E756CF
77E756C5 8B45 FC MOV EAX,DWORD PTR SS:
77E756C8 8B40 04 MOV EAX,DWORD PTR DS:
77E756CB 0FB740 12 MOVZX EAX,WORD PTR DS:
77E756CF 8D0C46 LEA ECX,DWORD PTR DS:
0040E9FD 09C0 OR EAX,EAX 回到程序领空了. ; KERNEL32._lwrite
0040E9FF 74 07 JE SHORT chap702.0040EA08
0040EA01 8903 MOV DWORD PTR DS:,EAX
0040EA03 83C3 04 ADD EBX,4
0040EA06 ^ EB E1 JMP SHORT chap702.0040E9E9 这里想往回跳.
0040EA08 FF96 A8EC0000 CALL DWORD PTR DS: F4到这里.
0040EA0E 61 POPAD 关键字,入口就在附近.
0040EA0F - E9 B826FFFF JMP chap702.004010CC 跨段跳跃到入口.
004010CC 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS: ; KERNEL32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT chap702.004010FC
这个程序的输入表没有损坏,可以直接运行.
还有更快的方法.
UPX加壳入口第一句是PUSHAD
出口关键字
POPAD
一般经过JMP跨段跳跃到入口处.
用Od载入程序.
0040E8C0 > 60 PUSHAD UPX壳的加壳入口第一句是PUSHAD
0040E8C1 BE 15B04000 MOV ESI,chap702.0040B015
0040E8C6 8DBE EB5FFFFF LEA EDI,DWORD PTR DS:
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
0040E8D0 EB 10 JMP SHORT chap702.0040E8E2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
0040E8D5 90 NOP
0040E8D6 90 NOP
..............................................................
按Crtl+F向下找PoPad,
见截图.
0040EA0E 61 POPAD 关键字. F2下断点,F9运行到这里,清除断点.
0040EA0F - E9 B826FFFF JMP chap702.004010CC 入口点.
0040EA14 0000 ADD BYTE PTR DS:,AL
0040EA16 0000 ADD BYTE PTR DS:,AL
0040EA18 0000 ADD BYTE PTR DS:,AL 0040EA1A 0000 ADD BYTE PTR DS:,AL
0040EA1C 0000 ADD BYTE PTR DS:,AL
...................................................
004010CC 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS: ; KERNEL32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT chap702.004010FC
这个程序的输入表没有损坏,可以直接运行.第二种方法在软件加了几层壳时很有用,节省大量时间.前提是你必须找到脱壳规律.
"手动脱壳入门第二篇"脱壳动画!
脱壳教程4:手动脱壳入门第三篇
脱壳教程4:手动脱壳入门第三篇
【使用工具】 Fi,Peid,Ollydbg
【脱壳平台】 Win2K/XP
【软件名称】 chap703.exe
【软件简介】 Aspack 1.03加壳的一个Win98的记事本
【软件大小】 21.2KB
【加壳方式】 ASPack 1.08.03 -> Alexey Solodovnikov
【保护方式】 Aspack 1.03
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:
脱壳内容
好,我们这次脱Aspack的壳看看它的特性。
本地下载
首先必须的工具要准备好,
附件中壳为Fi测壳为Aspack1.0803
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。
用OD载入程序后。
Od提示程序加壳,选不继续分析。
0040D000 > 60 PUSHAD 停在这里,我们先记住Aspack壳的加壳入口第一句是PUSHAD
和UPX几乎一样的,但第二句以后完全不同.
0040D001 E8 00000000 CALL chap703.0040D006 这里看清,直接Call下一句,F8走有些系统会跑飞,程序直接运行.我们一般遇到Call,很近的Call用F7走.较远的Call用F8步过,我们以后会体会更深.
0040D006 5D POP EBP Call这里.
0040D007 81ED 0A4A4400 SUB EBP,444A0A
0040D00D BB 044A4400 MOV EBX,444A04
0040D012 03DD ADD EBX,EBP
0040D014 2B9D B1504400 SUB EBX,DWORD PTR SS:
0040D01A 83BD AC504400 0>CMP DWORD PTR SS:,0
0040D021 899D BB4E4400 MOV DWORD PTR SS:,EBX
0040D027 0F85 17050000 JNZ chap703.0040D544
0040D02D 8D85 D1504400 LEA EAX,DWORD PTR SS:
0040D033 50 PUSH EAX
0040D034 FF95 94514400 CALL DWORD PTR SS:
到这里我们看到信息框中写有GetModuleHandleA
0040D034 FF95 94514400 CALL DWORD PTR SS: ; kernel32.GetModuleHandleA
0040D03A 8985 CD504400 MOV DWORD PTR SS:,EAX
0040D040 8BF8 MOV EDI,EAX 0040D042 8D9D DE504400 LEA EBX,DWORD PTR SS:
0040D048 53 PUSH EBX
0040D049 50 PUSH EAX
0040D04A FF95 90514400 CALL DWORD PTR SS:
到这里我们看到信息框中写有GetProcAddress
0040D04A FF95 90514400 CALL DWORD PTR SS: ; kernel32.GetProcAddress
0040D050 8985 B9504400 MOV DWORD PTR SS:,EAX
0040D056 8D9D EB504400 LEA EBX,DWORD PTR SS:
0040D05C 53 PUSH EBX
0040D05D 57 PUSH EDI
0040D05E FF95 90514400 CALL DWORD PTR SS:
0040D064 8985 BD504400 MOV DWORD PTR SS:,EAX
0040D06A 8B85 BB4E4400 MOV EAX,DWORD PTR SS:
0040D070 8985 AC504400 MOV DWORD PTR SS:,EAX
0040D076 6A 04 PUSH 4
0040D078 68 00100000 PUSH 1000
0040D07D 68 9A040000 PUSH 49A
0040D082 6A 00 PUSH 0
0040D084 FF95 B9504400 CALL DWORD PTR SS:
到这里我们看到信息框中写有VirtualAlloc
0040D084 FF95 B9504400 CALL DWORD PTR SS: ; kernel32.VirtualAlloc
0040D08A 8985 B5504400 MOV DWORD PTR SS:,EAX
0040D090 8D9D CF4A4400 LEA EBX,DWORD PTR SS:
...............................................................
0040D0B7 8B85 B5504400 MOV EAX,DWORD PTR SS:
0040D0BD 68 00800000 PUSH 8000
0040D0C2 6A 00 PUSH 0
0040D0C4 50 PUSH EAX
0040D0C5 FF95 BD504400 CALL DWORD PTR SS:
到这里我们看到信息框中写有 VirtualFree
0040D0C5 FF95 BD504400 CALL DWORD PTR SS: ; kernel32.VirtualFree
0040D0CB 8D85 374C4400 LEA EAX,DWORD PTR SS:
0040D0D1 50 PUSH EAX ; chap703.0040D233
0040D0D2 C3 RETN 返回
0040D233 8B9D DF4A4400 MOV EBX,DWORD PTR SS: 这里的跨段太小,也无Popad对应出口,肯定不是Oep
0040D239 0BDB OR EBX,EBX
0040D23B 74 0A JE SHORT chap703.0040D247 跳
0040D23D 8B03 MOV EAX,DWORD PTR DS:
0040D23F 8785 E34A4400 XCHG DWORD PTR SS:,EAX
0040D245 8903 MOV DWORD PTR DS:,EAX
0040D247 8DB5 F74A4400 LEA ESI,DWORD PTR SS:
0040D24D 833E 00 CMP DWORD PTR DS:,0