滴水逆向联盟

标题: 分享 脱壳教程第1-4篇 [打印本页]

作者: admin    时间: 2014-5-9 15:04
标题: 分享 脱壳教程第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 这几个国外的好软件了,它们每个都有自己的特色,可以说都是当今各类“壳”中的最新代表了。(这些软件和详细介绍请到我的主页查阅)


作者: admin    时间: 2014-5-9 15:06

由于 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:手动脱壳入门第一篇
作者: admin    时间: 2014-5-9 15:06
脱壳教程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 跳
作者: admin    时间: 2014-5-9 15:08

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 这一句可以跳出这个循环。
作者: admin    时间: 2014-5-9 15:08

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
作者: admin    时间: 2014-5-9 15:09
如果我们直接下断点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
作者: admin    时间: 2014-5-9 15:09

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
作者: admin    时间: 2014-5-9 15:10

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
作者: admin    时间: 2014-5-9 15:10
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
作者: admin    时间: 2014-5-9 15:11

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
作者: admin    时间: 2014-5-9 15:11
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
............................................................
作者: admin    时间: 2014-5-9 15:12
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
作者: admin    时间: 2014-5-9 15:12
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 又往回跳
作者: admin    时间: 2014-5-9 15:12
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加壳
作者: OneTime    时间: 2014-11-14 19:45
学习了~:lol:lol:lol
作者: 树袋老妖    时间: 2015-1-22 09:38
学习了,…………………………
作者: 亚历山大    时间: 2016-2-13 10:08
树袋老妖 发表于 2015-1-22 09:38
学习了,…………………………

不错不错,很受启发。明白了脱壳的原理




欢迎光临 滴水逆向联盟 (http://dtdebug.com/) Powered by Discuz! X3.2