LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

软件加壳脱壳技术教程

admin
2025年2月3日 1:18 本文热度 167

    首先大家应该先明白“壳”的概念。在自然界中,大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。

     最早提出“壳”这个概念的,据我所知,应该是当年推出脱壳软件 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:手动脱壳入门第一篇

【使用工具】 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:[ESI+FFFC0000]

0046AC0C C787 D0940500 D>MOV DWORD PTR DS:[EDI+594D0],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:[ESI]

0046AC22 46 INC ESI

0046AC23 8807 MOV BYTE PTR DS:[EDI],AL

0046AC25 47 INC EDI

0046AC26 01DB ADD EBX,EBX    

0046AC28 75 07 JNZ SHORT ex1.0046AC31

0046AC2A 8B1E MOV EBX,DWORD PTR DS:[ESI] 到这里。

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:[ESI]

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:[ESI]

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:[ESI]

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:[ESI]

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:[ESI]

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:[ESI]

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:[ESI]

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:[EDI+EBP]

0046ACB0 83FD FC CMP EBP,-4

0046ACB3 76 0F JBE SHORT ex1.0046ACC4 这一句可以跳出这个循环。           

0046ACB5 8A02 MOV AL,BYTE PTR DS:[EDX]

0046ACB7 42 INC EDX

0046ACB8 8807 MOV BYTE PTR DS:[EDI],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:[EDX] 呵,在这里点一下,F4到这里。

0046ACC6 83C2 04 ADD EDX,4

0046ACC9 8907 MOV DWORD PTR DS:[EDI],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:[EDI]

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:[EDI],0D在这里点一下,F4到这里。

0046ACEE ^ 75 F2 JNZ SHORT ex1.0046ACE2

0046ACF0 8B07 MOV EAX,DWORD PTR DS:[EDI]

0046ACF2 8A5F 04 MOV BL,BYTE PTR DS:[EDI+4]

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:[EDI],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:[ESI+67000]在这里点一下,F4到这里。

0046AD14 8B07 MOV EAX,DWORD PTR DS:[EDI]

0046AD16 09C0 OR EAX,EAX

0046AD18 74 3C JE SHORT ex1.0046AD56

0046AD1A 8B5F 04 MOV EBX,DWORD PTR DS:[EDI+4]

0046AD1D 8D8430 BCA90600 LEA EAX,DWORD PTR DS:[EAX+ESI+6A9BC]

0046AD24 01F3 ADD EBX,ESI

0046AD26 50 PUSH EAX

0046AD27 83C7 08 ADD EDI,8

0046AD2A FF96 5CAA0600 CALL DWORD PTR DS:[ESI+6AA5C]           

到这里我们看到信息框中写有           

0046AD2A FF96 5CAA0>call dword ptr ds:[esi+6AA5C] KERNEL32.LoadLibraryA                 

如果我们直接下断点Bp LoadLibraryA,F9运行程序,Ctrl+F9返回到这句不就省很多事,这里大家以后会明白的,脱大量的壳后,我们先有一个概念。           

0046AD30 95 XCHG EAX,EBP

0046AD31 8A07 MOV AL,BYTE PTR DS:[EDI]

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:[EDI]

0046AD3E 55 PUSH EBP

0046AD3F FF96 60AA0600 CALL DWORD PTR DS:[ESI+6AA60]           

到这里我们看到信息框中写有,GetProcAddress这里也是好断点啊。           

0046AD3F FF96 60AA0>call dword ptr ds:[esi+6AA60] ; KERNEL32.GetProcAddress           

0046AD45 09C0 OR EAX,EAX

0046AD47 74 07 JE SHORT ex1.0046AD50

0046AD49 8903 MOV DWORD PTR DS:[EBX],EAX

0046AD4B 83C3 04 ADD EBX,4

0046AD4E ^ EB E1 JMP SHORT ex1.0046AD31 往回跳。

0046AD50 FF96 64AA0600 CALL DWORD PTR DS:[ESI+6AA64]

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:[459540]

00457909 8B00 MOV EAX,DWORD PTR DS:[EAX]

0045790B E8 78A1FEFF CALL ex1.00441A88

00457910 8B0D 10964500 MOV ECX,DWORD PTR DS:[459610] ; ex1.0045A820

00457916 A1 40954500 MOV EAX,DWORD PTR DS:[459540]

0045791B 8B00 MOV EAX,DWORD PTR DS:[EAX]

0045791D 8B15 24744500 MOV EDX,DWORD PTR DS:[457424] ; ex1.00457470

00457923 E8 78A1FEFF CALL ex1.00441AA0

00457928 A1 40954500 MOV EAX,DWORD PTR DS:[459540]

0045792D 8B00 MOV EAX,DWORD PTR DS:[EAX]

0045792F E8 ECA1FEFF CALL ex1.00441B20           

00457934 E8 8BBEFAFF CALL ex1.004037C4

00457939 8D40 00 LEA EAX,DWORD PTR DS:[EAX]           

总结:           

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:[ESI+FFFF5FEB]

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:[EBP+C]

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:[EBP-4]

77E756BC 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]

77E756BF 0FB740 2E MOVZX EAX,WORD PTR DS:[EAX+2E]

77E756C3 EB 0A JMP SHORT KERNEL32.77E756CF

77E756C5 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

77E756C8 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]

77E756CB 0FB740 12 MOVZX EAX,WORD PTR DS:[EAX+12]

77E756CF 8D0C46 LEA ECX,DWORD PTR DS:[ESI+EAX*2]           

0040E9FD 09C0 OR EAX,EAX 回到程序领空了. ; KERNEL32._lwrite

0040E9FF 74 07 JE SHORT chap702.0040EA08

0040EA01 8903 MOV DWORD PTR DS:[EBX],EAX

0040EA03 83C3 04 ADD EBX,4

0040EA06 ^ EB E1 JMP SHORT chap702.0040E9E9 这里想往回跳.

0040EA08 FF96 A8EC0000 CALL DWORD PTR DS:[ESI+ECA8] 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:[4063E4] ; KERNEL32.GetCommandLineA

004010D9 8BF0 MOV ESI,EAX

004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]

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:[ESI+FFFF5FEB]

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:[EAX],AL

0040EA16 0000 ADD BYTE PTR DS:[EAX],AL

0040EA18 0000 ADD BYTE PTR DS:[EAX],AL           

0040EA1A 0000 ADD BYTE PTR DS:[EAX],AL

0040EA1C 0000 ADD BYTE PTR DS:[EAX],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:[4063E4] ; KERNEL32.GetCommandLineA

004010D9 8BF0 MOV ESI,EAX

004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]

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:[EBP+4450B1]

0040D01A 83BD AC504400 0>CMP DWORD PTR SS:[EBP+4450AC],0

0040D021 899D BB4E4400 MOV DWORD PTR SS:[EBP+444EBB],EBX

0040D027 0F85 17050000 JNZ chap703.0040D544

0040D02D 8D85 D1504400 LEA EAX,DWORD PTR SS:[EBP+4450D1]

0040D033 50 PUSH EAX

0040D034 FF95 94514400 CALL DWORD PTR SS:[EBP+445194]           

到这里我们看到信息框中写有GetModuleHandleA           

0040D034 FF95 94514400 CALL DWORD PTR SS:[EBP+445194] ; kernel32.GetModuleHandleA

0040D03A 8985 CD504400 MOV DWORD PTR SS:[EBP+4450CD],EAX

0040D040 8BF8 MOV EDI,EAX           

0040D042 8D9D DE504400 LEA EBX,DWORD PTR SS:[EBP+4450DE]

0040D048 53 PUSH EBX

0040D049 50 PUSH EAX

0040D04A FF95 90514400 CALL DWORD PTR SS:[EBP+445190]               

到这里我们看到信息框中写有GetProcAddress           

0040D04A FF95 90514400 CALL DWORD PTR SS:[EBP+445190] ; kernel32.GetProcAddress

0040D050 8985 B9504400 MOV DWORD PTR SS:[EBP+4450B9],EAX

0040D056 8D9D EB504400 LEA EBX,DWORD PTR SS:[EBP+4450EB]

0040D05C 53 PUSH EBX

0040D05D 57 PUSH EDI

0040D05E FF95 90514400 CALL DWORD PTR SS:[EBP+445190]

0040D064 8985 BD504400 MOV DWORD PTR SS:[EBP+4450BD],EAX

0040D06A 8B85 BB4E4400 MOV EAX,DWORD PTR SS:[EBP+444EBB]

0040D070 8985 AC504400 MOV DWORD PTR SS:[EBP+4450AC],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:[EBP+4450B9]            

到这里我们看到信息框中写有VirtualAlloc           

0040D084 FF95 B9504400 CALL DWORD PTR SS:[EBP+4450B9] ; kernel32.VirtualAlloc

0040D08A 8985 B5504400 MOV DWORD PTR SS:[EBP+4450B5],EAX

0040D090 8D9D CF4A4400 LEA EBX,DWORD PTR SS:[EBP+444ACF]

...............................................................

0040D0B7 8B85 B5504400 MOV EAX,DWORD PTR SS:[EBP+4450B5]

0040D0BD 68 00800000 PUSH 8000

0040D0C2 6A 00 PUSH 0

0040D0C4 50 PUSH EAX

0040D0C5 FF95 BD504400 CALL DWORD PTR SS:[EBP+4450BD]            

到这里我们看到信息框中写有 VirtualFree           

0040D0C5 FF95 BD504400 CALL DWORD PTR SS:[EBP+4450BD] ; kernel32.VirtualFree

0040D0CB 8D85 374C4400 LEA EAX,DWORD PTR SS:[EBP+444C37]

0040D0D1 50 PUSH EAX ; chap703.0040D233

0040D0D2 C3 RETN 返回           

0040D233 8B9D DF4A4400 MOV EBX,DWORD PTR SS:[EBP+444ADF] 这里的跨段太小,也无Popad对应出口,肯定不是Oep

0040D239 0BDB OR EBX,EBX    

0040D23B 74 0A JE SHORT chap703.0040D247 跳

0040D23D 8B03 MOV EAX,DWORD PTR DS:[EBX]

0040D23F 8785 E34A4400 XCHG DWORD PTR SS:[EBP+444AE3],EAX

0040D245 8903 MOV DWORD PTR DS:[EBX],EAX

0040D247 8DB5 F74A4400 LEA ESI,DWORD PTR SS:[EBP+444AF7]

0040D24D 833E 00 CMP DWORD PTR DS:[ESI],0           

0040D250 0F84 0F010000 JE chap703.0040D365

0040D256 8D85 D1504400 LEA EAX,DWORD PTR SS:[EBP+4450D1]

0040D25C 50 PUSH EAX

0040D25D FF95 94514400 CALL DWORD PTR SS:[EBP+445194]           

到这里我们看到信息框中写有 GetModuleHandleA

0040D25D FF95 94514400 CALL DWORD PTR SS:[EBP+445194] ; kernel32.GetModuleHandleA

0040D263 8985 CD504400 MOV DWORD PTR SS:[EBP+4450CD],EAX

0040D269 8BF8 MOV EDI,EAX

0040D26B 8D9D DE504400 LEA EBX,DWORD PTR SS:[EBP+4450DE]

0040D271 53 PUSH EBX

0040D272 50 PUSH EAX

0040D273 FF95 90514400 CALL DWORD PTR SS:[EBP+445190]

           

到这里我们看到信息框中写有 GetProcAddress

           

0040D273 FF95 90514400 CALL DWORD PTR SS:[EBP+445190] ; kernel32.GetProcAddress

0040D279 8985 B9504400 MOV DWORD PTR SS:[EBP+4450B9],EAX

0040D27F 8D9D EB504400 LEA EBX,DWORD PTR SS:[EBP+4450EB]

0040D285 53 PUSH EBX

0040D286 57 PUSH EDI

0040D287 FF95 90514400 CALL DWORD PTR SS:[EBP+445190] ; kernel32.GetProcAddress

0040D28D 8985 BD504400 MOV DWORD PTR SS:[EBP+4450BD],EAX

0040D293 8DB5 F74A4400 LEA ESI,DWORD PTR SS:[EBP+444AF7]

0040D299 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4]

0040D29C 6A 04 PUSH 4

0040D29E 68 00100000 PUSH 1000

0040D2A3 50 PUSH EAX

0040D2A4 6A 00 PUSH 0

0040D2A6 FF95 B9504400 CALL DWORD PTR SS:[EBP+4450B9]

           

到这里我们看到信息框中写有 VirtualAllo

           

0040D2A6 FF95 B9504400 CALL DWORD PTR SS:[EBP+4450B9] ; kernel32.VirtualAlloc    

0040D2AC 8985 B5504400 MOV DWORD PTR SS:[EBP+4450B5],EAX

0040D2B2 56 PUSH ESI

0040D2B3 8B1E MOV EBX,DWORD PTR DS:[ESI]

0040D2B5 039D AC504400 ADD EBX,DWORD PTR SS:[EBP+4450AC]

0040D2BB 50 PUSH EAX

0040D2BC 53 PUSH EBX

0040D2BD E8 A3020000 CALL chap703.0040D565

0040D2C2 3B46 04 CMP EAX,DWORD PTR DS:[ESI+4]

0040D2C5 74 0B JE SHORT chap703.0040D2D2 跳

0040D2C7 8D9D 5D514400 LEA EBX,DWORD PTR SS:[EBP+44515D]

0040D2CD E9 4F010000 JMP chap703.0040D421

0040D2D2 80BD B0504400 0>CMP BYTE PTR SS:[EBP+4450B0],0

           

0040D301 43 INC EBX

0040D302 49 DEC ECX

0040D303 ^ EB ED JMP SHORT chap703.0040D2F2 往回跳

0040D305 291E SUB DWORD PTR DS:[ESI],EBX F4到这里

0040D307 83C3 05 ADD EBX,5

0040D30A 83C6 04 ADD ESI,4

0040D30D 83E9 05 SUB ECX,5

0040D310 ^ EB E0 JMP SHORT chap703.0040D2F2 又往回跳

0040D312 5B POP EBX F4到这里

0040D313 5E POP ESI

0040D314 59 POP ECX

........................................................

0040D339 68 00800000 PUSH 8000

0040D33E 6A 00 PUSH 0

0040D340 50 PUSH EAX

0040D341 FF95 BD504400 CALL DWORD PTR SS:[EBP+4450BD]

           

到这里我们看到信息框中写有 VirtualFree

           

0040D341 FF95 BD504400 CALL DWORD PTR SS:[EBP+4450BD] ; kernel32.VirtualFree

0040D347 83C6 08 ADD ESI,8

0040D34A 833E 00 CMP DWORD PTR DS:[ESI],0

0040D34D ^ 0F85 46FFFFFF JNZ chap703.0040D299 又往回跳

0040D353 8B9D DF4A4400 MOV EBX,DWORD PTR SS:[EBP+444ADF] F4到这里

0040D359 0BDB OR EBX,EBX    

0040D35B 74 08 JE SHORT chap703.0040D365

0040D35D 8B03 MOV EAX,DWORD PTR DS:[EBX]

..................................................

0040D3A9 74 0C JE SHORT chap703.0040D3B7

0040D3AB 83FB 02 CMP EBX,2

0040D3AE 74 16 JE SHORT chap703.0040D3C6

0040D3B0 83FB 03 CMP EBX,3

0040D3B3 74 20 JE SHORT chap703.0040D3D5

0040D3B5 EB 2C JMP SHORT chap703.0040D3E3

0040D3B7 66:8B1E MOV BX,WORD PTR DS:[ESI]

0040D3BA 81E3 FF0F0000 AND EBX,0FFF

0040D3C0 66:01041F ADD WORD PTR DS:[EDI+EBX],AX

0040D3C4 EB 1D JMP SHORT chap703.0040D3E3

0040D3C6 66:8B1E MOV BX,WORD PTR DS:[ESI]

0040D3C9 81E3 FF0F0000 AND EBX,0FFF

0040D3CF 66:01141F ADD WORD PTR DS:[EDI+EBX],DX

0040D3D3 EB 0E JMP SHORT chap703.0040D3E3

0040D3D5 66:8B1E MOV BX,WORD PTR DS:[ESI]

0040D3D8 81E3 FF0F0000 AND EBX,0FFF

0040D3DE 01141F ADD DWORD PTR DS:[EDI+EBX],EDX

0040D3E1 EB 00 JMP SHORT chap703.0040D3E3

0040D3E3 66:830E FF OR WORD PTR DS:[ESI],0FFFF

0040D3E7 83C6 02 ADD ESI,2

0040D3EA ^ E2 B4 LOOPD SHORT chap703.0040D3A0

           

0040D3EC ^ EB 9A JMP SHORT chap703.0040D388

0040D3EE 8BB5 EB4A4400 MOV ESI,DWORD PTR SS:[EBP+444AEB]

0040D3F4 8B95 AC504400 MOV EDX,DWORD PTR SS:[EBP+4450AC]

0040D3FA 03F2 ADD ESI,EDX

0040D3FC 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C]

0040D3FF 85C0 TEST EAX,EAX

0040D401 0F84 3D010000 JE chap703.0040D544

0040D407 03C2 ADD EAX,EDX

0040D409 8BD8 MOV EBX,EAX

0040D40B 50 PUSH EAX

0040D40C FF95 94514400 CALL DWORD PTR SS:[EBP+445194]

           

到这里我们看到信息框中写有 GetModuleHandleA

           

0040D40C FF95 94514400 CALL DWORD PTR SS:[EBP+445194] ; kernel32.GetModuleHandleA

0040D412 85C0 TEST EAX,EAX

0040D414 75 67 JNZ SHORT chap703.0040D47D 跳

0040D416 53 PUSH EBX

0040D417 FF95 98514400 CALL DWORD PTR SS:[EBP+445198]    

0040D41D 85C0 TEST EAX,EAX

0040D41F 75 5C JNZ SHORT chap703.0040D47D

0040D421 8D85 D1504400 LEA EAX,DWORD PTR SS:[EBP+4450D1]

0040D427 50 PUSH EAX

0040D428 FF95 98514400 CALL DWORD PTR SS:[EBP+445198]

...........................................................

0040D4C6 43 INC EBX

0040D4C7 53 PUSH EBX

0040D4C8 81E3 FFFFFF7F AND EBX,7FFFFFFF

0040D4CE 53 PUSH EBX

0040D4CF FFB5 6E514400 PUSH DWORD PTR SS:[EBP+44516E]

0040D4D5 FF95 90514400 CALL DWORD PTR SS:[EBP+445190]

           

到这里我们看到信息框中写有 GetProcAddress

           

0040D4D5 FF95 90514400 CALL DWORD PTR SS:[EBP+445190] ; kernel32.GetProcAddress

0040D4DB 85C0 TEST EAX,EAX

0040D4DD 5B POP EBX

0040D4DE 75 3E JNZ SHORT chap703.0040D51E 跳走。

           

0040D51E 8907 MOV DWORD PTR DS:[EDI],EAX 到这里.

0040D520 8385 72514400 0>ADD DWORD PTR SS:[EBP+445172],4

0040D527 ^ E9 67FFFFFF JMP chap703.0040D493 往回跳。

0040D52C 33C0 XOR EAX,EAX F4到这里。

0040D52E 8906 MOV DWORD PTR DS:[ESI],EAX

0040D530 8946 0C MOV DWORD PTR DS:[ESI+C],EAX

0040D533 8946 10 MOV DWORD PTR DS:[ESI+10],EAX

0040D536 83C6 14 ADD ESI,14

0040D539 8B95 AC504400 MOV EDX,DWORD PTR SS:[EBP+4450AC]

0040D53F ^ E9 B8FEFFFF JMP chap703.0040D3FC 又往回跳。

           

0040D544 8B85 EF4A4400 MOV EAX,DWORD PTR SS:[EBP+444AEF]

0040D54A 50 PUSH EAX

0040D54B 0385 AC504400 ADD EAX,DWORD PTR SS:[EBP+4450AC]

0040D551 5B POP EBX

0040D552 0BDB OR EBX,EBX

0040D554 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX

0040D558 61 POPAD 终于看到这个标志,入口就在附近。    

0040D559 75 08 JNZ SHORT chap703.0040D563 跳走。

0040D55B B8 01000000 MOV EAX,1

0040D560 C2 0C00 RETN 0C

0040D563 50 PUSH EAX EAX=004010CC

0040D564 C3 RETN 返回入口。

           

004010CC 55 PUSH EBP 程序跨段,并且经过了PoPad关键字。我们再这里用Od的Dump插件直接脱壳。

004010CD 8BEC MOV EBP,ESP

004010CF 83EC 44 SUB ESP,44

004010D2 56 PUSH ESI

004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; kernel32.GetCommandLineA

004010D9 8BF0 MOV ESI,EAX

004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]

004010DD 3C 22 CMP AL,22

004010DF 75 1B JNZ SHORT chap703.004010FC

004010E1 56 PUSH ESI

           

用Od插件脱壳时注意,看截图。

此主题相关图片如下:

           

Rubuild ImPort

Method1

Method2

重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。

           

脱壳总结:

这个壳虽老,里面的循环还真多,新Aspack和它肯定不同,后话。

Aspack1.0803加壳

           

脱壳教程6:手动脱壳入门第五篇Aspack2.12    

           

【脱文标题】 手动脱壳入门第五篇Aspack2.12

           

【使用工具】 Peid,Ollydbg

           

【脱壳平台】 Win2K/XP

           

【软件名称】 Ascii 查询专家

           

【软件简介】 Aspack 2.12加壳的Ascii 查询专家

           

【软件大小】 5.35K

           

【加壳方式】 ASPack 2.12 -> Alexey Solodovnikov

           

【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 

           

好,我们这次脱Aspack2.12的壳看看它的特性。

           

本地下载

           

首先必须的工具要准备好,

附件中壳为PEiD查壳为ASPack 2.12 -> Alexey Solodovnikov

手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。

手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不

能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。

           

用OD载入程序后。    

确定一个入口警告,OD提示软件可能有自解压或自修改功能,当然,因为它加了壳。

停在这里

00406001 > 60 PUSHAD 我们先记住Aspack壳的加壳入口第一句是PUSHAD

00406002 E8 03000000 CALL ex2.0040600A 必须F7进入,不然跑飞。很近的Call用F7

           

0040600A 5D POP EBP ; ex2.00406007

0040600B 45 INC EBP

0040600C 55 PUSH EBP

0040600D C3 RETN

           

00406008 /EB 04 JMP SHORT ex2.0040600E 跳

0040600A |5D POP EBP

0040600B |45 INC EBP

0040600C |55 PUSH EBP

0040600D |C3 RETN

0040600E E8 01000000 CALL ex2.00406014 一看就应用F7过,变形的Jmp

           

00406013 EB 5D JMP SHORT ex2.00406072

00406014 5D POP EBP ; ex2.00406013

00406015 BB EDFFFFFF MOV EBX,-13

           

0040601A 03DD ADD EBX,EBP

0040601C 81EB 00600000 SUB EBX,6000

           

00406022 83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0

           

00406029 899D 22040000 MOV DWORD PTR SS:[EBP+422],EBX

           

0040602F 0F85 65030000 JNZ ex2.0040639A

           

0040603C FF95 4D0F0000 CALL DWORD PTR SS:[EBP+F4D] ; kernel32.GetModuleHandleA

           

00406042 8985 26040000 MOV DWORD PTR SS:[EBP+426],EAX

           

00406048 8BF8 MOV EDI,EAX

0040604A 8D5D 5E LEA EBX,DWORD PTR SS:[EBP+5E]

0040604D 53 PUSH EBX

0040604E 50 PUSH EAX

0040604F FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress

               

00406055 8985 4D050000 MOV DWORD PTR SS:[EBP+54D],EAX

           

0040605B 8D5D 6B LEA EBX,DWORD PTR SS:[EBP+6B]

0040605E 53 PUSH EBX

0040605F 57 PUSH EDI

00406060 FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress

00406066 8985 51050000 MOV DWORD PTR SS:[EBP+551],EAX

0040606C 8D45 77 LEA EAX,DWORD PTR SS:[EBP+77]

0040606F FFE0 JMP EAX 跳走。

           

0040608A 8B9D 31050000 MOV EBX,DWORD PTR SS:[EBP+531] 到这里。

00406090 0BDB OR EBX,EBX

00406092 74 0A JE SHORT ex2.0040609E 跳

00406094 8B03 MOV EAX,DWORD PTR DS:[EBX]

.....................................................

004060F9 E8 6E050000 CALL ex2.0040666C 我们手动跟踪时遇到Call一定要正确判断是用F7过

,还是F8过,F7决对安全,但容易重复跟踪,F8容易跑飞。这里是远处Call,F8过。

           

004060FE B3 00 MOV BL,0

00406100 80FB 00 CMP BL,0

00406103 75 5E JNZ SHORT ex2.00406163

....................................................

0040612F /74 2E JE SHORT ex2.0040615F

00406131 |78 2C JS SHORT ex2.0040615F

00406133 |AC LODS BYTE PTR DS:[ESI]

00406134 |3C E8 CMP AL,0E8

00406136 |74 0A JE SHORT ex2.00406142

00406138 |EB 00 JMP SHORT ex2.0040613A

0040613A |3C E9 CMP AL,0E9

0040613C |74 04 JE SHORT ex2.00406142

0040613E |43 INC EBX

0040613F |49 DEC ECX

00406140 ^|EB EB JMP SHORT ex2.0040612D 往回跳.

00406142 8B06 MOV EAX,DWORD PTR DS:[ESI] 直接F4到这里。

00406144 EB 00 JMP SHORT ex2.00406146 Bt,隔壁也跳。

00406146 803E 01 CMP BYTE PTR DS:[ESI],1

00406149 ^ 75 F3 JNZ SHORT ex2.0040613E

....................................................    

           

00406152 8906 MOV DWORD PTR DS:[ESI],EAX

00406154 83C3 05 ADD EBX,5

00406157 83C6 04 ADD ESI,4

0040615A 83E9 05 SUB ECX,5

0040615D ^ EB CE JMP SHORT ex2.0040612D 往回跳.

0040615F 5B POP EBX 直接F4到这里。

00406160 5E POP ESI

00406161 59 POP ECX

00406162 58 POP EAX

00406163 EB 08 JMP SHORT ex2.0040616D 跳

           

0040616D 8BC8 MOV ECX,EAX

0040616F 8B3E MOV EDI,DWORD PTR DS:[ESI]

00406171 03BD 22040000 ADD EDI,DWORD PTR SS:[EBP+422]

00406177 8BB5 52010000 MOV ESI,DWORD PTR SS:[EBP+152]

0040617D C1F9 02 SAR ECX,2

00406180 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>

........................................................

00406197 FF95 51050000 CALL DWORD PTR SS:[EBP+551]

0040619D 83C6 08 ADD ESI,8

004061A0 833E 00 CMP DWORD PTR DS:[ESI],0

004061A3 ^ 0F85 1EFFFFFF JNZ ex2.004060C7 回跳

           

004061A9 68 00800000 PUSH 8000 不能F4到这里,程序跑飞,我上篇Aspack2.11很像。

004061AE 6A 00 PUSH 0

004061B0 FFB5 56010000 PUSH DWORD PTR SS:[EBP+156]

004061B6 FF95 51050000 CALL DWORD PTR SS:[EBP+551]

           

004060C7 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4] 只能让它回到这里。

004060CA 05 0E010000 ADD EAX,10E

004060CF 6A 04 PUSH 4

           

004060D1 68 00100000 PUSH 1000

004060D6 50 PUSH EAX

........................................

004060F9 E8 6E050000 CALL ex2.0040666C F8过

           

004060FE B3 01 MOV BL,1    

00406100 80FB 00 CMP BL,0

00406103 75 5E JNZ SHORT ex2.00406163 这个跳转跳好远。

           

00406163 /EB 08 JMP SHORT ex2.0040616D 跳

00406165 |0000 ADD BYTE PTR DS:[EAX],AL

00406167 |0E PUSH CS

           

0040616D 8BC8 MOV ECX,EAX

0040616F 8B3E MOV EDI,DWORD PTR DS:[ESI]

00406171 03BD 22040000 ADD EDI,DWORD PTR SS:[EBP+422]

.............................................

00406265 /74 11 JE SHORT ex2.00406278

00406267 |03F2 ADD ESI,EDX

00406269 |AD LODS DWORD PTR DS:[ESI]

           

00406278 BE 34200000 MOV ESI,2034

           

0040627D 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]

           

00406283 03F2 ADD ESI,EDX

00406285 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C]

           

00406295 FF95 4D0F0000 CALL DWORD PTR SS:[EBP+F4D]

           

0040629B 85C0 TEST EAX,EAX

0040629D 75 07 JNZ SHORT ex2.004062A6

..............................................

004062FC FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress

           

00406302 85C0 TEST EAX,EAX

00406304 5B POP EBX

00406305 75 6F JNZ SHORT ex2.00406376 大跳转。

           

00406376 8907 MOV DWORD PTR DS:[EDI],EAX ; msvbvm60.MethCallEngine

00406378 8385 49050000 0>ADD DWORD PTR SS:[EBP+549],4

           

0040637F ^ E9 32FFFFFF JMP ex2.004062B6 往回跳。

           

00406384 8906 MOV DWORD PTR DS:[ESI],EAX F4下

00406386 8946 0C MOV DWORD PTR DS:[ESI+C],EAX

00406389 8946 10 MOV DWORD PTR DS:[ESI+10],EAX    

0040638C 83C6 14 ADD ESI,14

0040638F 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]

00406395 ^ E9 EBFEFFFF JMP ex2.00406285 往回跳

0040639A B8 6C100000 MOV EAX,106C F4下

0040639F 50 PUSH EAX

004063A0 0385 22040000 ADD EAX,DWORD PTR SS:[EBP+422]

004063A6 59 POP ECX

004063A7 0BC9 OR ECX,ECX

004063A9 8985 A8030000 MOV DWORD PTR SS:[EBP+3A8],EAX

004063AF 61 POPAD 看到这个标志,入口就不远了。

004063B0 /75 08 JNZ SHORT ex2.004063BA 跳

004063B2 |B8 01000000 MOV EAX,1

004063B7 |C2 0C00 RETN 0C

004063BA \\68 6C104000 PUSH ex2.0040106C 放入入口值40106C

004063BF C3 RETN 返回。

           

0040106C 68 DB 68 程序跨段,并且经过了PoPad关键字。我们再这里用Od的 Dump插件直接脱壳。

0040106D D8 DB D8

0040106E 11 DB 11

0040106F 40 DB 40 ; CHAR \'@\'

00401070 00 DB 00

00401071 E8 DB E8

00401072 F0 DB F0

           

重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳

后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。

一点提示,用Od手动跟综循环,为了看清程序跳转方向,需要对Od进行设置,你设置了没有。

在Od-选项-调试设置-Cpu,填如图中设置,这样后程序跳转时会有一道红线提示方向,我们好更容易控制程序。    

           

看截图

           

"手动脱壳入门第五篇"脱壳动画! 

           

[NextPage]

           

脱壳教程7:手动脱壳入门第六篇PECompact 1.84

           

【使用工具】 Peid,Ollydbg

           

【脱壳平台】 Win2K/XP

           

【软件名称】 note_aPlib.exe

           

【软件简介】 PECompact是一个能压缩可执行文件的工具,通过压缩代码、数据、相关资源使压缩能达到100%,由于在运行时不需要恢复磁盘上压缩后的数据,所以与没有压缩的程序在运行时没有明显的速度差异,在某种程度上还有所改善。

           

【软件大小】 18KB 

           

【加壳方式】 PECompact 1.68 - 1.84 -> Jeremy Collake

           

【保护方式】 PECompact1.84 aPlib方式

           

【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 

           

软件截图

               

我们看到它有aPLib和JCALG1两种压缩引擎,前者对低于64kb的文件压缩效果较好,速度也较快。后者具有更为强劲的压缩效果,对于大文件的压缩效果较好。并有很丰富的各类选项,对普通用户来说,使用其默认设置即可。

           

原版程序本地下载

汉化版本本地下载

           

好现在我们来手动脱一个PECompact1.84以aPlib方式加壳的记事本看看它的特性。

           

本地下载

           

首先必须的工具要准备好

附件中壳PEiD测壳为PECompact 1.68 - 1.84 -> Jeremy Collake,只能测试出大致版本,其实都差不多。

手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。

手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。

           

用OD载入程序后。

确定一个入口警告,然后Od提示程序加壳,选不继续分析。

停在这里

0040C000 n> /EB 06 jmp short note_aPl.0040C008 开始地点。

0040C002 |68 CC100000 push 10CC

0040C007 |C3 retn

0040C008 \\9C pushfd 注意PECompactd的壳比UPX,Aspack多了这个指令。

0040C009 60 pushad 出口处看到与之对应的语句就应知道入口点就在附近。

0040C00A E8 02000000 call note_aPl.0040C011 一看就应用F7过,变形的Jmp

0040C00F 33C0 xor eax, eax    

0040C011 8BC4 mov eax, esp Call这里,很近。

0040C013 83C0 04 add eax, 4

0040C016 93 xchg eax, ebx

0040C017 8BE3 mov esp, ebx

0040C019 8B5B FC mov ebx, dword ptr ds:[ebx-4]

0040C01C 81EB 3F904000 sub ebx, note_aPl.0040903F

0040C022 87DD xchg ebp, ebx

...........................................为节省篇幅,略去一些不重要的代码,今后不再赘述。

0040C06C 8DB5 AC904000 lea esi, dword ptr ss:[ebp+4090AC>

0040C072 B9 40040000 mov ecx, 440

0040C077 F3:A5 rep movs dword ptr es:[edi], dwor>

0040C079 8BFB mov edi, ebx

0040C07B C3 retn 返回。

           

0040D17B BD CF400000 mov ebp, 40CF 到这里。

0040D180 8BF7 mov esi, edi

0040D182 83C6 54 add esi, 54

0040D185 81C7 FF100000 add edi, 10FF

...........................................

0040D19E F3:A5 rep movs dword ptr es:[edi], dwor>

0040D1A0 03C8 add ecx, eax

0040D1A2 83E1 03 and ecx, 3

0040D1A5 F3:A4 rep movs byte ptr es:[edi], byte >

0040D1A7 EB 26 jmp short note_aPl.0040D1CF 跳走。

           

0040D1CF 8BB5 E6904000 mov esi, dword ptr ss:[ebp+4090E6>; note_aPl.00400000 到这里。

0040D1D5 56 push esi

0040D1D6 03B5 EE904000 add esi, dword ptr ss:[ebp+4090EE>

0040D1DC 83C6 14 add esi, 14

0040D1DF 03B5 35974000 add esi, dword ptr ss:[ebp+409735>

0040D1E5 8DBD 39974000 lea edi, dword ptr ss:[ebp+409739>

0040D1EB B9 06000000 mov ecx, 6

0040D1F0 F3:A5 rep movs dword ptr es:[edi], dwor>

...........................................

0040D210 8BB5 DE904000 mov esi, dword ptr ss:[ebp+4090DE>

0040D216 80BD 6B9D4000 C>cmp byte ptr ss:[ebp+409D6B], 0C3

0040D21D 74 2E je short note_aPl.0040D24D 跳走。

           

0040D24D 57 push edi    

0040D24E AD lods dword ptr ds:[esi]

0040D24F 85C0 test eax, eax

0040D251 0F84 9B000000 je note_aPl.0040D2F2 这个跳转很大,但是没跳走,先记住,如果下面的语句有往回跳转无法往后继续走,我们再试试这里。

0040D257 8BD0 mov edx, eax

0040D259 0395 E6904000 add edx, dword ptr ss:[ebp+4090E6>

0040D25F AD lods dword ptr ds:[esi]

0040D260 56 push esi

0040D261 8BC8 mov ecx, eax

0040D263 57 push edi

0040D264 52 push edx

0040D265 8DB5 6BA14000 lea esi, dword ptr ss:[ebp+40A16B>

0040D26B 57 push edi

0040D26C 51 push ecx

0040D26D 52 push edx

0040D26E 6A 40 push 40

0040D270 56 push esi

0040D271 FFB5 3D974000 push dword ptr ss:[ebp+40973D]

0040D277 FFB5 39974000 push dword ptr ss:[ebp+409739]

0040D27D E8 B8090000 call note_aPl.0040DC3A

...........................................

0040D2AA /74 07 je short note_aPl.0040D2B3

0040D2AC |8BC8 mov ecx, eax

0040D2AE |5E pop esi

0040D2AF |5F pop edi

0040D2B0 ^|EB 9B jmp short note_aPl.0040D24D 果然往回跳转。

0040D2B2 B9 E8000000 mov ecx, 0E8 F4无法到达这句,程序运行了。

           

0040D2B7 005D 81 add byte ptr ss:[ebp-7F], bl

0040D2BA ED in eax, dx

           

Ctrl+F2重新加载程序,重新来到我们刚才发现的0040D251处,回车。

           

0040D2F2 5F pop edi 到这里,F2下断点,F9运行跳出循环到这里后再F2取消断点。

0040D2F3 8BB5 E2904000 mov esi, dword ptr ss:[ebp+4090E2>

0040D2F9 AD lods dword ptr ds:[esi]

0040D2FA 83F8 FF cmp eax, -1

0040D2FD 74 74 je short note_aPl.0040D373这个跳转很大,但是没跳走,先记住,如果下面的语句有往回跳转无法往后继续走,我们再试试这里。    

0040D2FF 0385 E6904000 add eax, dword ptr ss:[ebp+4090E6>

0040D305 8BD8 mov ebx, eax

0040D307 AD lods dword ptr ds:[esi]

0040D308 0385 E6904000 add eax, dword ptr ss:[ebp+4090E6>

...........................................

0040D361 8BD1 mov edx, ecx

0040D363 C1F9 02 sar ecx, 2

0040D366 F3:AB rep stos dword ptr es:[edi]

0040D368 03CA add ecx, edx

0040D36A 83E1 03 and ecx, 3

0040D36D F3:AA rep stos byte ptr es:[edi]

0040D36F 5F pop edi

0040D370 ^ EB 87 jmp short note_aPl.0040D2F9 果然往回跳转。

0040D372 0F6800 punpckhbw mm0, qword ptr ds:[eax] F4无法到达这句,程序运行了。

0040D375 40 inc eax

0040D376 0000 add byte ptr ds:[eax], al

...........................................

Ctrl+F2重新加载程序,重新来到我们刚才发现的0040D2FD处,回车。

           

0040D373 68 00400000 push 4000 到这里,F2下断点,F9运行跳出循环到这里后再F2取消断点。

0040D378 6A 00 push 0

0040D37A 57 push edi

0040D37B FF95 45974000 call dword ptr ss:[ebp+409745]

0040D381 8BBD 3C964000 mov edi, dword ptr ss:[ebp+40963C>

0040D387 03BD E6904000 add edi, dword ptr ss:[ebp+4090E6>

0040D38D 8B8D 40964000 mov ecx, dword ptr ss:[ebp+409640>

0040D393 51 push ecx

0040D394 57 push edi

0040D395 33D2 xor edx, edx

0040D397 33DB xor ebx, ebx

0040D399 33F6 xor esi, esi

0040D39B 03FE add edi, esi

0040D39D 03DE add ebx, esi

0040D39F 49 dec ecx

0040D3A0 74 72 je short note_aPl.0040D414 可跳出循环。

0040D3A2 78 70 js short note_aPl.0040D414

...........................................

0040D3B5 /75 0A jnz short note_aPl.0040D3C1 跳走。    

0040D3B7 |80FC 80 cmp ah, 80

0040D3BA |72 05 jb short note_aPl.0040D3C1

0040D3BC |80FC 8F cmp ah, 8F

0040D3BF |76 05 jbe short note_aPl.0040D3C6

0040D3C1 \\47 inc edi

0040D3C2 43 inc ebx

0040D3C3 ^ EB DA jmp short note_aPl.0040D39F 往回跳转。看到0040D3A0可跳出循环。我们在0040D3A0处点一下,然后回车。

           

0040D414 5F pop edi F2下断点,F9运行跳出循环到这里后再F2取消断点

0040D415 59 pop ecx

0040D416 33C0 xor eax, eax

0040D418 85C9 test ecx, ecx

0040D41A 74 3B je short note_aPl.0040D457

0040D41C 8BF7 mov esi, edi

0040D41E 33C0 xor eax, eax

0040D420 83F9 04 cmp ecx, 4

...........................................

0040D42F 8B1E mov ebx, dword ptr ds:[esi]

0040D431 03C3 add eax, ebx

0040D433 D1E3 shl ebx, 1

0040D435 83D3 01 adc ebx, 1

0040D438 33C3 xor eax, ebx

0040D43A 83C6 04 add esi, 4

0040D43D 83E9 04 sub ecx, 4

0040D440 74 15 je short note_aPl.0040D457

0040D442 83F9 04 cmp ecx, 4

0040D445 ^ 73 E8 jnb short note_aPl.0040D42F往回跳转

0040D447 BA 04000000 mov edx, 4 F4到这里。

0040D44C 2BD1 sub edx, ecx

0040D44E 2BF2 sub esi, edx

0040D450 B9 04000000 mov ecx, 4

0040D455 ^ EB D8 jmp short note_aPl.0040D42F 又往回跳转

0040D457 3B85 67974000 cmp eax, dword ptr ss:[ebp+409767> F4到这里。

0040D45D 74 4D je short note_aPl.0040D4AC 跳走。

0040D45F ^ E9 4FFEFFFF jmp note_aPl.0040D2B3

               

0040D4AC E8 A1010000 call note_aPl.0040D652 到这里。Call的距离较远,F8过。

           

0040D4B1 E8 A3000000 call note_aPl.0040D559 Call的距离较远,F8过。

           

0040D4B6 73 6B jnb short note_aPl.0040D523 跳走。

           

0040D523 80BD 6B9F4000 C>cmp byte ptr ss:[ebp+409F6B], 0C3

           

0040D52A 74 22 je short note_aPl.0040D54E 跳。

0040D52C 8D95 6BA14000 lea edx, dword ptr ss:[ebp+40A16B>

           

0040D532 6A 40 push 40

0040D534 52 push edx

0040D535 FFB5 3D974000 push dword ptr ss:[ebp+40973D]

           

0040D53B FFB5 39974000 push dword ptr ss:[ebp+409739]

           

0040D541 E8 F40A0000 call note_aPl.0040E03A

           

0040D546 85C0 test eax, eax

0040D548 ^ 0F85 9DFDFFFF jnz note_aPl.0040D2EB

           

0040D54E 61 popad 看到这两个与开始处对应的标志了。

0040D54F 9D popfd 入口点就在附近。

0040D550 50 push eax

0040D551 68 CC104000 push note_aPl.004010CC 

           

0040D556 C2 0400 retn 4 准备返回到程序入口点,跨段。

           

004010CC 55 push ebp 入口点,跨段来到这里并且经过了PoPad和popfd两个关键字,我们在这里用Od的 Dump插件直接脱壳。

004010CD 8BEC mov ebp, esp

004010CF 83EC 44 sub esp, 44

           

004010D2 56 push esi

004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA

004010D9 8BF0 mov esi, eax    

004010DB 8A00 mov al, byte ptr ds:[eax]

004010DD 3C 22 cmp al, 22

004010DF 75 1B jnz short note_aPl.004010FC

004010E1 56 push esi

004010E2 FF15 F4644000 call dword ptr ds:[4064F4] ; USER32.CharNextA

重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。

           

总结:

           

PECompac加壳程序

入口关键字 有两个。

pushfd 注意PECompactd的壳比UPX,Aspack多了这个指令。

pushad

出口关键字

POPAD 

popfd 和入口关键字对应,过了这两个关键字,要注意程序oep就在附近。

通过Ret返回到程序Oep

           

经过实践,发现PECompac1.4X-1.8X加壳的程序手动脱壳流程基本相同,这里就不一一列出,大家碰到后请自行参考本文进行练习。

           

附参考教学。

           

作者:lordor[BCG] 来源:看雪论坛 加入时间:2003-6-2 

           

对象:五笔打字通5.0

作者:lordor[BCG]

               

声明:属技术交流,无其它目的,请不要任意散布或用作商业用途。初学破解,如有不对的地方欢迎批评指出。

           

工具:ollydbg1.09B,插件ollyDump V2.11.108

           

基本操作:F8-单步执行,遇到call不进入。F7-单步执行,遇到call进入。F4-执行到光标所在行。F2-设断

           

手动脱壳要把握两点:

1、单步往前走,不要回头。

2、观察。注意poshad、poshfd,popad、popfd等,注意地址发生大的变化。

程序用PECompact V1.40-45加的壳,没见过的,在这里只好手动脱壳。

           

0054DC00 > /EB 06 JMP SHORT wb86.0054DC08

0054DC02 |68 84370000 PUSH 3784

0054DC07 |C3 RETN

0054DC08 \\9C PUSHFD

0054DC09 60 PUSHAD

0054DC0A E8 02000000 CALL wb86.0054DC11 =>单步走到这里,F8过的话程序就运行,所以要F7跟入

-------------------------------------------------------------------------------

0054DC11 8BC4 MOV EAX,ESP    =>F7后来到这,继续单步运行

0054DC13 83C0 04 ADD EAX,4

0054DC16 93 XCHG EAX,EBX

0054DC17 8BE3 MOV ESP,EBX

0054DC19 8B5B FC MOV EBX,DWORD PTR DS:[EBX-4]

0054DC1C 81EB 0FA04000 SUB EBX,wb86.0040A00F

           

0054DC22 87DD XCHG EBP,EBX

0054DC24 8B85 A6A04000 MOV EAX,DWORD PTR SS:[EBP+40A0A6]

0054DC2A 0185 03A04000 ADD DWORD PTR SS:[EBP+40A003],EAX

0054DC30 66:C785 00A0400>MOV WORD PTR SS:[EBP+40A000],9090

           

0054DC39 0185 9EA04000 ADD DWORD PTR SS:[EBP+40A09E],EAX    

           

0054DC3F BB C3110000 MOV EBX,11C3

           

0054DC44 039D AAA04000 ADD EBX,DWORD PTR SS:[EBP+40A0AA]

           

0054DC4A 039D A6A04000 ADD EBX,DWORD PTR SS:[EBP+40A0A6]

0054DC50 53 PUSH EBX

0054DC51 53 PUSH EBX

...............(一直往前走,省略).....................

0054F25E 57 PUSH EDI

0054F25F AD LODS DWORD PTR DS:[ESI]

0054F260 0BC0 OR EAX,EAX

0054F262 74 6C JE SHORT wb86.0054F2D0

0054F264 8BD0 MOV EDX,EAX

0054F266 0395 A6A04000 ADD EDX,DWORD PTR SS:[EBP+40A0A6]

           

0054F26C AD LODS DWORD PTR DS:[ESI]

0054F26D 56 PUSH ESI

0054F26E 8BC8 MOV ECX,EAX

0054F270 57 PUSH EDI

0054F271 52 PUSH EDX

0054F272 8BF2 MOV ESI,EDX

0054F274 8B85 15A64000 MOV EAX,DWORD PTR SS:[EBP+40A615]

           

0054F27A 8B9D 19A64000 MOV EBX,DWORD PTR SS:[EBP+40A619]

0054F280 E8 910A0000 CALL wb86.0054FD16

0054F285 5A POP EDX

0054F286 5F POP EDI

0054F287 52 PUSH EDX

0054F288 57 PUSH EDI

0054F289 FF95 9EA04000 CALL DWORD PTR SS:[EBP+40A09E]

           

0054F28F 0BC0 OR EAX,EAX

0054F291 74 07 JE SHORT wb86.0054F29A

0054F293 8BC8 MOV ECX,EAX

0054F295 5E POP ESI

0054F296 5F POP EDI

0054F297 ^ EB C5 JMP SHORT wb86.0054F25E  ==>走到这里会跳到前面,把光标移动到下一行,F4跳过时程序会直接运行,所以还得单步运行,走到上面的0054F262处会跳到后面去了

0054F299 B9 8D9D97A5 MOV ECX,A5979D8D

           

0054F29E 40 INC EAX

0054F29F 0053 FF ADD BYTE PTR DS:[EBX-1],DL    

0054F2A2 95 XCHG EAX,EBP

0054F2A3 15 A640008D ADC EAX,8D0040A6

           

0054F2A8 9D POPFD

...............(一直往前走,省略).....................

0054F2CF 24 58 AND AL,58  ==>从上面跳到这,继续单步走

0054F2D1 8DB5 C3A64000 LEA ESI,DWORD PTR SS:[EBP+40A6C3]

           

0054F2D7 AD LODS DWORD PTR DS:[ESI]

0054F2D8 0BC0 OR EAX,EAX

0054F2DA 74 74 JE SHORT wb86.0054F350

0054F2DC 0385 A6A04000 ADD EAX,DWORD PTR SS:[EBP+40A0A6]

...............(一直往前走,省略).....................

0054F36D 49 DEC ECX

0054F36E 74 72 JE SHORT wb86.0054F3E2

0054F370 78 70 JS SHORT wb86.0054F3E2

0054F372 66:8B07 MOV AX,WORD PTR DS:[EDI]

0054F375 2C E8 SUB AL,0E8

0054F377 3C 01 CMP AL,1

0054F379 76 38 JBE SHORT wb86.0054F3B3

0054F37B 66:3D 1725 CMP AX,2517

0054F37F 74 51 JE SHORT wb86.0054F3D2

0054F381 3C 27 CMP AL,27

0054F383 75 0A JNZ SHORT wb86.0054F38F

0054F385 80FC 80 CMP AH,80

0054F388 72 05 JB SHORT wb86.0054F38F

0054F38A 80FC 8F CMP AH,8F

0054F38D 76 05 JBE SHORT wb86.0054F394

0054F38F 47 INC EDI

0054F390 43 INC EBX

0054F391 ^ EB DA JMP SHORT wb86.0054F36D ==>这里又跳到前面,看一下前面那一句会跳到后面的,是JE SHORT 0054F3E2,JS SHORT 0054F3E2,JBE SHORT wb86.0054F3B3,JE SHORT 0054F3D2,依次在其跳往的地方设断。F9运行,会在设断的地方停,最后确定0054F3E2才是正确的设断地方

0054F393 B8 8B47023C MOV EAX,3C02478B

...............(一直往前走,省略).....................

0054F476 8BB5 15A64000 MOV ESI,DWORD PTR SS:[EBP+40A615]

0054F47C 8BBD 19A64000 MOV EDI,DWORD PTR SS:[EBP+40A619]    

           

0054F482 E8 8F0C0000 CALL wb86.00550116

           

0054F487 61 POPAD ==>看到希望了,继续单步走

0054F488 9D POPFD 

0054F489 50 PUSH EAX

0054F48A 68 84374000 PUSH wb86.00403784

           

0054F48F C2 0400 RETN 4 ==>走过这里,地址会有很大变化,可以确定,壳已脱完了。

0054F492 8BB5 37A64000 MOV ESI,DWORD PTR SS:[EBP+40A637]

           

00403781 00 DB 00

00403782 > 0000 ADD BYTE PTR DS:[EAX],AL

00403784 . 68 94FF4300 PUSH wb86.0043FF94  ===>由0054F48F处跳来,在这里运行ollyDump把

           

程序dump下来。到此手动脱壳结束。

           

00403789 E8 DB E8

0040378A EE DB EE

0040378B FF DB FF

0040378C FF DB FF

0040378D FF DB FF

0040378E 00 DB 00

0040378F 00 DB 00

00403790 00 DB 00

00403791 00 DB 00

00403792 00 DB 00

           

脱完后可以用侦壳工具看,是用VB写的。其它壳(如Aspack等)都可以用此法配合OLLYDUMP来手动脱壳.

"手动脱壳入门第六篇"脱壳动画!  

           

脱壳教程8:手动脱壳入门第七篇EZIP 1.0 加壳的一个Win98的记事本

           

【使用工具】 Peid,Ollydbg,Loadpe,ImportREC    

           

【脱壳平台】 Win2K/XP

           

【软件名称】 Notepad.exe

           

【软件简介】 EZIP 1.0 加壳的一个Win98的记事本

           

【软件大小】 33.8KB 

           

【加壳方式】 EZIP 1.0 -> Jonathan Clark [Overlay]

           

【保护方式】 EZIP

           

【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 

           

软件截图

           

           

           

本地下载

           

好现在我们来手动脱一个EZIP1.0加壳的记事本看看它的特性。

           

本地下载

           

我们看到加壳后文件大小79.3k,原Win98下的记事本52K,看来这个程序不是已压缩文件大小为目的,只是个简单保护程序不被反汇编的简单加壳程序。

首先必须的工具要准备好

附件中壳为Peid测壳为EZIP 1.0 -> Jonathan Clark [重叠]

手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。    

手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。

           

用OD载入程序后。

这次没有任何提示,应为这个壳是增肥壳,所以Od无压缩提示。

停在这里

0040D0BE N>  /E9 19320000 jmp Notepad.004102DC 开始地点,和我们平时看到的Pushad等不同。怎样找Oep呢,只能在程序跨段跳跃时,地址变化很大时寻找Oep,一般通过Jmp,Ret等语句跨段。

0040D0C3 . |E9 7C2A0000 jmp Notepad.0040FB44

0040D0C8  |E9 19240000 jmp Notepad.0040F4E6 

0040D0CD  |E9 FF230000 jmp Notepad.0040F4D1 

0040D0D2 . |E9 1E2E0000 jmp Notepad.0040FEF5

0040D0D7  |E9 882E0000 jmp Notepad.0040FF64

0040D0DC  |E9 2C250000 jmp Notepad.0040F60D

0040D0E1  |E9 AE150000 jmp Notepad.0040E694

0040D0E6  |E9 772B0000 jmp Notepad.0040FC62

0040D0EB  |E9 87020000 jmp Notepad.0040D377

0040D0F0  |E9 702E0000 jmp Notepad.0040FF65

           

如无特别提示,单步跟踪脱壳均用F8键步过。

           

004102DC /> \\55 push ebp 跳到这里。

004102DD |. 8BEC mov ebp, esp

004102DF |. 81EC 28040000 sub esp, 428

           

004102E5 |. 53 push ebx

004102E6 |. 56 push esi

004102E7 |. 57 push edi

004102E8 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C]

004102EE |. 50 push eax

004102EF |. E8 FCCDFFFF call Notepad.0040D0F0 远程Call用F8过。

004102F4 |. 59 pop ecx

004102F5 |. 85C0 test eax, eax

004102F7 |. 75 05 jnz short Notepad.004102FE 跳

004102F9 |. E9 8C030000 jmp Notepad.0041068A    

           

004102FE |> \\68 00800000 push 8000 到这里。

00410303 |. 6A 00 push 0

00410305 |. FF95 DCFCFFFF call dword ptr ss:[ebp-324] ; kernel32.GlobalAlloc

0041030B |. 8985 3CFCFFFF mov dword ptr ss:[ebp-3C4], eax

...................................................

0041033A |. 68 00304100 push Notepad.00413000 ; ASCII "1.1.3"

0041033F |. 8D85 44FCFFFF lea eax, dword ptr ss:[ebp-3BC]

00410345 |. 50 push eax

00410346 |. E8 E7CCFFFF call Notepad.0040D032 远程Call用F8过。

...................................................

004103C3 |. 8D85 ECFBFFFF lea eax, dword ptr ss:[ebp-414]

004103C9 |. 50 push eax

004103CA |. 8D85 3CFCFFFF lea eax, dword ptr ss:[ebp-3C4]

004103D0 |. 50 push eax

004103D1 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C]

004103D7 |. 50 push eax

004103D8 |. E8 28CCFFFF call Notepad.0040D005 远程Call用F8过。

...................................................

004103F0 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C]

004103F6 |. 50 push eax

004103F7 |. E8 09CCFFFF call Notepad.0040D005

004103FC |. 83C4 10 add esp, 10

004103FF |. 68 E0000000 push 0E0

00410404 |. 8D85 08FDFFFF lea eax, dword ptr ss:[ebp-2F8]

0041040A |. 50 push eax

0041040B |. 8D85 3CFCFFFF lea eax, dword ptr ss:[ebp-3C4]

00410411 |. 50 push eax

00410412 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C]

00410418 |. 50 push eax

00410419 |. E8 E7CBFFFF call Notepad.0040D005 远程Call用F8过。

...................................................

           

0041042B |. /75 0C jnz short Notepad.00410439 小跳转,没什么值得注意。

0041042D |. |0FBE85 EDFBFF>movsx eax, byte ptr ss:[ebp-413]

00410434 |. |83F8 5A cmp eax, 5A

00410437 |. |74 14 je short Notepad.0041044D

00410439 |> |6A 00 push 0

0041043B |. |68 644B4100 push Notepad.00414B64

00410440 |. |68 184A4100 push Notepad.00414A18 ; ASCII "bad Dos Header"

00410445 |. |6A 00 push 0    

00410447 |. |FF95 04FDFFFF call dword ptr ss:[ebp-2FC]

0041044D |> \\6A 40 push 40

...................................................

004104BE |. E8 BFCBFFFF call Notepad.0040D082 远程Call用F8过。

004104C3 |. 83C4 0C add esp, 0C

004104C6 |. 8B85 DCFBFFFF mov eax, dword ptr ss:[ebp-424]

004104CC |. 8B8D DCFBFFFF mov ecx, dword ptr ss:[ebp-424]

004104D2 |. 0348 3C add ecx, dword ptr ds:[eax+3C]

004104D5 |. 898D E4FBFFFF mov dword ptr ss:[ebp-41C], ecx

004104DB |. 8B85 E4FBFFFF mov eax, dword ptr ss:[ebp-41C]

004104E1 |. 83C0 18 add eax, 18

004104E4 |. 8985 2CFCFFFF mov dword ptr ss:[ebp-3D4], eax

004104EA |. 8B85 2CFCFFFF mov eax, dword ptr ss:[ebp-3D4]

...................................................

0041050A |. E8 73CBFFFF call Notepad.0040D082 远程Call用F8过。

0041050F |. 83C4 0C add esp, 0C

00410512 |. 68 E0000000 push 0E0

00410517 |. 8D85 08FDFFFF lea eax, dword ptr ss:[ebp-2F8]

0041051D |. 50 push eax

0041051E |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4]

00410524 |. E8 59CBFFFF call Notepad.0040D082 远程Call用F8过。

00410529 |. 83C4 0C add esp, 0C

0041052C |. 8B85 E4FBFFFF mov eax, dword ptr ss:[ebp-41C]

00410532 |. 0FB740 06 movzx eax, word ptr ds:[eax+6]

...................................................

0041054E |. E8 B2CAFFFF call Notepad.0040D005 远程Call用F8过。

00410553 |. 83C4 10 add esp, 10

00410556 |. 83A5 34FCFFFF>and dword ptr ss:[ebp-3CC], 0

0041055D |. EB 0D jmp short Notepad.0041056C 跳走。

           

           

0041056C |> \\8B85 E4FBFFFF mov eax, dword ptr ss:[ebp-41C] ; Notepad.00400080

00410572 |. 0FB740 06 |movzx eax, word ptr ds:[eax+6]

00410576 |. 3985 34FCFFFF |cmp dword ptr ss:[ebp-3CC], eax

0041057C |. 0F83 9D000000 |jnb Notepad.0041061F 看这个跳转很大,估计是循环出口。这里没跳走,因为脱壳的过程是外壳程序程序在内存中解压程序,我们看到的解压过程就是一些循环,解压完毕后就要转到程序入口点,准备运行程序,这个时候就是我们手动脱壳的时机。

...................................................    

004105E0 |. 8B85 ECFDFFFF |mov eax, dword ptr ss:[ebp-214]

004105E6 |. FF70 10 |push dword ptr ds:[eax+10]

004105E9 |. FFB5 D8FBFFFF |push dword ptr ss:[ebp-428]

004105EF |. FFB5 E8FDFFFF |push dword ptr ss:[ebp-218]

004105F5 |. 8D85 3CFCFFFF |lea eax, dword ptr ss:[ebp-3C4]

004105FB |. 50 |push eax

004105FC |. 8D85 94FCFFFF |lea eax, dword ptr ss:[ebp-36C]

00410602 |. 50 |push eax

00410603 |. E8 48CAFFFF |call Notepad.0040D050

00410608 |. 83C4 18 |add esp, 18

0041060B |. 8B85 ECFDFFFF |mov eax, dword ptr ss:[ebp-214]

00410611 |. 83C0 28 |add eax, 28

00410614 |. 8985 ECFDFFFF |mov dword ptr ss:[ebp-214], eax

0041061A |.^ E9 40FFFFFF \\jmp Notepad.0041055F 跳到0041055F,直到在内存中解压完毕从0041057C跳出。

           

我们点一下 0041057C这行,然后回车。

           

0041057C |. 0F83 9D000000 |jnb Notepad.0041061F 回车

           

0041061F |> \\FFB5 E8FDFFFF push dword ptr ss:[ebp-218] F2在这句下断点,F9执行到这里F2取消断点。

00410625 |. FF95 D4FCFFFF call dword ptr ss:[ebp-32C] ; kernel32.CloseHandle

0041062B |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C]

00410631 |. 50 push eax

00410632 |. 8B85 2CFCFFFF mov eax, dword ptr ss:[ebp-3D4]

00410638 |. 8B8D E0FBFFFF mov ecx, dword ptr ss:[ebp-420]

0041063E |. 2B48 1C sub ecx, dword ptr ds:[eax+1C]

00410641 |. 51 push ecx

00410642 |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4]

00410648 |. E8 6CCAFFFF call Notepad.0040D0B9

0041064D |. 83C4 0C add esp, 0C

00410650 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C]

           

00410656 |. 50 push eax

00410657 |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4]

...................................................

00410648 |. E8 6CCAFFFF call Notepad.0040D0B9 远程Call用F8过。

0041064D |. 83C4 0C add esp, 0C    

00410650 |. 8D85 94FCFFFF lea eax, dword ptr ss:[ebp-36C]

00410656 |. 50 push eax

00410657 |. FFB5 2CFCFFFF push dword ptr ss:[ebp-3D4]

0041065D |. E8 F3C9FFFF call Notepad.0040D055 远程Call用F8过。

00410662 |. 59 pop ecx

00410663 |. 59 pop ecx

00410664 |. 8B85 2CFCFFFF mov eax, dword ptr ss:[ebp-3D4]

0041066A |. 8B40 10 mov eax, dword ptr ds:[eax+10]

0041066D |. 8B8D 2CFCFFFF mov ecx, dword ptr ss:[ebp-3D4]

00410673 |. 0341 1C add eax, dword ptr ds:[ecx+1C]

00410676 |. 8985 38FCFFFF mov dword ptr ss:[ebp-3C8], eax

0041067C |. 8B85 38FCFFFF mov eax, dword ptr ss:[ebp-3C8]

00410682 |. 5F pop edi

00410683 |. 5E pop esi

00410684 |. 5B pop ebx 

00410685 |. 8BE5 mov esp, ebp

00410687 |. 5D pop ebp

00410688 |.- FFE0 jmp eax ; Notepad.004010CC

           

呵,解压完毕,准备跳到入口点了。410688和4010CC多么明显的跨段

           

004010CC 55 push ebp 入口点。注意,因为这个壳会修改PE头,只好用LordPE脱壳。用Od的插件脱壳并修复也不能运行。

Loadpe脱壳时,在进程列表中找到Notepad.exe这个进程,点右键完整脱壳,保存即可。

           

截图

           

004010CD 8BEC mov ebp, esp

004010CF 83EC 44 sub esp, 44

004010D2 56 push esi

004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA

004010D9 8BF0 mov esi, eax

004010DB 8A00 mov al, byte ptr ds:[eax]

004010DD 3C 22 cmp al, 22

004010DF 75 1B jnz short Notepad.004010FC

004010E1 56 push esi

004010E2 FF15 F4644000 call dword ptr ds:[4064F4] ; USER32.CharNextA

004010E8 8BF0 mov esi, eax

脱壳后的入口点不正确,手动改麻烦,我们用ImportREC这个专业级的工具修复,如果输入表坏的也可一并修复,还可以跨平台运行。

Imprec修复过程。

在Oep处填000010cc,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,正常运行,这里不用备份,Imprec自动帮你做了. 


阅读原文:原文链接


该文章在 2025/2/5 17:28:05 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved