扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
第二节 认识脱壳
作为一个以“壳”为主的站台,如果连访者连什么是“壳”都不清楚的话,那我也太失败了。很早以前就想写编完全关于“壳”的文章,但苦于时间和文字水平的关系,都没提笔。
首先我想大家应该先明白“壳”的概念。在自然界中,我想大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。
最早提出“壳”这个概念的,据我所知,应该是当年推出脱壳软件 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 。虽然它还不太成熟,但它可以为软件加上使用日期限制这个功能是其它加壳软件所没有的,或者以后的加壳软件真的会是像他说的那样可以:加壳和压缩并重、并施;随意加使用日期;加上注册码;加软件狗(磁盘)保护;加硬件序列号判别;加... 。
后记:很久没写过怎么长的东西了,写着写着,就发觉这是一个很难用一篇文章就可以说得完的题目,所以就决定这次先写“壳”的历史、发展、种类等。如果大家反映还可以的话,以后有时间的话再补上它的姐妹篇来介绍如何加壳、脱壳、脱壳软件的使用、技巧等等。欢迎大家给我提意见,我的EMAIL 是:WCX98@163.NET,再次感谢你的阅读。
第三节 自动脱壳
1、工具介绍
通过上一节,我想大家己认识了什么是壳的概念了,也是说运行加壳程序时, 用户执行的实际上是这个外壳的程序,而这个外壳程序负责把用户原来的程序在内存中解压缩,并把控制权交还给解开后的真正的程序,由于一切工作都是在内存中运行,用户根本不知道也不需要知道其运行过程,只要执行起来没有变化就好。当时有些人担心这些解压缩的工作会给程序带来额外的运行时间,但实际上所有的可执行文件都要读到内存中去执行,文件小了,从计算机硬盘上读到内存的时间自然也少了,两下相抵,实际上用户并不会感觉程序慢了多少。脱壳的就是把在内存中真正还原的程序抓取下来,修正后变成可执行的文件。在Windows 95/NT/2000 上的文件格式是Portable Executable File Format(即PE格式),该格式应用于所有基于Win32的系统。由于现在windows的普及,下面谈到的壳都是基于这种文件格式。
压缩工具介绍(PACKERS)我们这里谈的压缩工具不是Winzip,WINRAR等工具(它们是可压缩任何文件),而是谈专门压缩windows下的 PE 格式EXE或DLL文件的工具,压缩的EXE文件是自解压可执行文件。
常用压缩工具(Windows Packers )列表:
名称 |
作者 |
主页 |
介绍 |
ASPack |
Alexey Solodovnikov |
是俄国作者Alexey Solodovnikov写的一个非常强大的Win32压缩工具,其压缩率、速度和兼容性很不错,是目前很流行的一种压缩工具。 | |
UPX | Markus Oberhumer & Laszlo Molnar | 非常全能的 EXE 压缩软件,并可用UPX -D命令脱壳。 | |
Petite | Ian Luck | 能压缩PE文件的code, data等资源。 | |
PE-PACK | ANAKiN | 一个自身体积小巧的压缩工具 | |
PKLITE32 | PKWARE, Inc. | 32-位压缩工具(DLL/EXE). | |
WWPack32 | Piotr Warezak and Rafal Wierzbicki | 32-位压缩工具(DLL/EXE). | |
NeoLite | 32-位压缩工具(DLL/EXE). | ||
Shrinker | Blink Inc | 32-位压缩工具(DLL/EXE). |
脱壳工具介绍(UNPACKERS)一般某种压缩工具的壳,都会有相应的脱壳工具,因此只要找到较新版本的脱壳工具, 一般的壳都可轻易脱去。
常用脱壳工具(Windows Unpackers)列表:
名称 |
作者 |
主页 |
介绍 |
ASPack unpacker | bane | 脱ASPack的压缩PE文件。 | |
UnPEPack | M.o.D. | 脱PEPack的壳 | |
ProcDump32 | 十分优秀的“万能”脱壳工具,可惜不升级了,因此只能自动脱些老版本压缩工具的壳,但可通过脚本命令使其升级。也是一款优秀的PE修改工具。 |
侦测文件类型工具
名称 |
介绍 | ||
FileInfo | 能检测多种文件格式,脱壳前用来判断是否加壳或何种壳,推荐使用! | ||
GetTyp | 功能同上 | ||
TYP | 功能同上 |
2、ProcDump应用文章一
注:本文作者PererS是台湾的,因此要注意在一些名词上称呼与我们不同。
由于此文写作时间较早,在此推荐两个新版工具:
侦测工具:推荐FileInfo。
脱壳工具:ProcDump32 v1.6.2 FINAL终结版本 。
保护方法壳
需要工具TYP(侦测工具) & ProcDump 1.50(剥壳机)
文章作者Peter S.(彼得的家)
侦测与剥 CWView 2000 (Version 4.1) 的壳
一、前言
何谓壳?相信这是很多人的疑问。
其实壳,顾名思义,就像鸡蛋的壳一样,主要是保护鸡的「卵」。从外观上看来,鸡蛋是白色的,但是把壳剥掉以后呢?是黄色的卵+透明的蛋白(未熟蛋)。这应用到我们的破解与保护上呢,也是同样的意思,假若我今天要修改一个执行档(就像我要把黄色的卵,涂成绿色),但是因为有壳,所以根本找不到你要修改的地方(就像光从鸡蛋的外观上看来,根本找不到有黄色的地方一样),一定要把壳「剥掉」,才能达成你的目的。我这样说,应该比较容易了解什么是壳了吧?
当然,正确的说,「壳」与「加密」是一体的,这类似你有一个纯文字档,如果你用zip压缩它以后,能够再更改它吗?不可能,因为资料已经被重新排列、且压缩运算过,成为一堆乱码,所以根本不能直接改。
这个教学文件所需要的软体如下:
1. TYP 这是一个能侦测你的软体是被哪一种「壳」给加密了
(就好像侦测你的文件档是被zip、rar、arj哪一个给压缩了一样,如果连被哪种软体加了壳都不晓得,那要剥壳就难很多)。
2. Procdump 1.5 这是剥壳机器,可剥许多已知壳、未知的for win32的壳。
二 . 用 TYP 测试 CWView2000 是被哪种壳给加密了 :
废话不多说,直接来:
1.首先,你要把你下载来的TYP先解压缩到某个目录(我假设c:\try)
2.再来,把CWView2000的主程式cwview32.exe,由c:\cwv2000下拷贝到上面讲的目录(c:\try),接下来,从win95开一个dos视窗,并且切换到c:\try目录下,然后键入typ3 cwview32.exe
3.过几秒以后,直接跳到最后一行,有没有看到ASPACK / Solodovnikov Alexy [1.07b]这行?
哦~~~原来CWView2000是用ASPACK 1.07b 来加密的啊。那要脱壳不就简单了,去找一个专门脱ASPACK 1.07的软体不就得了??
没错,不过我在来要教的,是使用目前全世界最强的拨壳机Procdump来剥壳。
三.用Procdump 1.50 来剥ASPACK 1.07b的壳:
1.首先,当然也是把Procdump解压缩到刚刚的目录(C:\TRY)
2.执行Procdump,你会看到如下的视窗:
3.因为我们要剥壳,所以按下Unpack(其他的按钮是干什么的,我也不清楚,大概是跟WIN的PE执行档有关的吧):
4.由刚刚TYP侦测得知,CWView2000是用Aspack 1.07b加的壳,所以理所当然的我们要选择 [Aspack<108],选好后,按下OK(要选对喔,选错会剥不出来):
5.此时,ProcDump会要求你开启你要剥壳的执行档,当然,我们要把路径指到c:\try\cwview32.exe
6.紧接著马上会出现如下的视窗,此时,千万不要按下[确定]。稍微等一下,有耐心一点,你马 上就会看到CWView2000被呼叫执行了,此时,将视窗切换至CWView,随便使用一二个 功能,然后在不要关掉CWView2000之下,按下[确定]钮。(这个按钮是当程式[完全]被载入以后,才要按的)
上面这个步骤很重要,如果心急乱按或乱关,你就得重来了。
7.按下[确定]后没多久,会出现下面的视窗,并且此时cwview会自动被关掉,然后开始剥壳 运算,当出现Step by step analyzis activated ...时,过不久,Prucdump就会要求你键入要输出的 档名(也就壳剥掉以后,原始的卵要存成什么档名),我这里举例成unshell.exe,此时,也代表剥壳成功!!:
剥壳还蛮简单的嘛,对不对?
三 . 试试看剥壳了以后的 CWView32.exe 可不可用 :
你可以自己执行看看,应该可以用吧?或许你也可以比较一下剥壳与未剥之间的差别, 你将惊觉:没有剥壳的CWView32只有602kb,但是剥壳后,竟然高达1634kb。很惊人的压缩率吧!(所以加密或加壳的确有存在的必要,就好像压缩一样,可以帮助人们节省很多硬碟空间)
四 . 试试看剥壳了以后的 CWView32.exe 可不可以修改成注册版 ?:
你可以用16位元编辑器,打开刚刚剥壳后的档案(unshell.exe),然后
寻找 C60520864F0001
改成 ------------00
嘿嘿,找的到对不对?也可以改了吧...这样就不用使用外挂的「动态破解」软体PPATCHER了!
五 . 我知道你在想什么 ...
你是不是在想,可不可以把刚刚修改完成的unshell.exe再把它加壳,让它变的小一点啊?
当然可以,只要你有加壳软体...还等什么,赶快去做啊!
从这次的破解教学我们学到:
1. 如何使用TYP来侦测壳,与如何使用史上最强的procdump来剥壳。
2. 要剥壳,其实并不难,只要TYP侦测得出来、procdump有列表的,都很简单。
要注意的是:
1.当你发现TYP的回报是Unknow时候,别慌,procdump也可以针对未知的壳作剥壳的运算,只要选择 **unknow** 就可以啦,不过成功率当然降低许多。
2.为什么要介绍procdump?因为它可以外挂script.ini来增加剥壳的能力。也就是你可以自己用sice追某个被不知名加密软体给加壳的软体,然后纪录起相关的资料,再交由Procdump来把记忆体的内容「dump」(存)起来,只是这篇教学没有教(我也不太会啦...)。
3.TYP是目前世界上侦测壳、压缩资料,能力最强的软体,要善用,你可以在下面的网站抓到:
阿伦的家(GB码): http://crackers.163.net/作者网页: http://www-user.TU-Cottbus.DE/~kannegv
注意:要抓dos32的版本,才能在windows下正常使用
4.Procdump是目前世界上最强的拨壳软体,除可以剥已知道的壳外,还可以剥许多未知的壳。更可以以手动的方法,增强其剥壳能力(可惜的是,它只支援win32的软体,win16与dos的他都不支援)。,你可以在下面的网站抓到:
3、ProcDump应用文章二
今天,在吴朝相的网页上看到一篇由台湾的Peter's写的关于脱壳的文章,里面提及到的了Procdump1.50的使用,但由于所写的内容比较地肤浅,并没有交待到Procdump1.50的强大之处,同时由于最近在网上的软件,加壳之风日盛,如果作为一个Cracker,不跟着时代走,可能在不久的将来,你就没有什么软件可以修改了,所以一定要在加脱方法下点苦功才行,为此,小弟想把一月来学习到的脱壳技术Post出来,让大家了解一下在Windows上是如何进行软件脱壳的,同时也想向大家介绍强大的Procdump1.50是如何使用的,如何用它来进行手动脱壳的,如何扩展自已的Procdump1.50的脱壳种类。但由于小弟在脱壳方面还是新手,如果文章中有错误之处,请来信指教。
读者要求:
你可以阅读和传播本文章,但不能对文章的内容作任何的修改,请尊重作者的劳动。
首先我们要先准备我们的工具:
1.Procdump1.50
2.Ultraedit6.10(这个你也可以用别的编辑器)
3.Winsoftice4.0
4.Trw0.75
5.MakePE1.27
6.Wdasm8.93
好了!工具都准备齐全了,我们就去下载一个实验品吧!今次我们选的是UPX ,在Procdump1.50的脱壳文件列表中,你可以清楚地看到有UPX的选项,所以我们今次就选它了,目前它的最新版本是0.82,好了下载完毕了,我们先用它来为软件加一个脱吧!
操作:
1.在windows上打开一个Dos窗口,进入UPX0.82所在的目录;
2.输入upx [要加壳的文件路径和文件名]
3.OK!加壳成功了!
好了!现在可以试一试脱壳了!
操作:
1.运行Procdump1.50;
2.按Unpack按钮,这时就出现了Choose Unpacker窗口;
3.在窗口中选择UPX,这时就会跳出一个选择你要脱壳文件的选择窗口;
4.按下打开,哦天啊!好痛苦啊!程序没有脱壳竟然运行了,Procdump1.50提示一个错
误发生在script的第一行。
以上的所有操作,是对自动脱壳来说的,基本上的自动脱壳的操作都是这样的。好了,难道就这样没有戏唱了吗?作者写文章那会就写这几十行废话呢?请接着看下面的吧!好了,看一看它没有没防住winsoftice呢?重新启动机器,换一个有安装winsoftice的windows平台吧!再次运行被加脱了的程序,还好!没有当掉winsoftice,这样心中暗喜,你有难了啊!看来外国人写的东西还是比较有善,不象Ding Boy的幻影系列,比小燕子还凶(^o^,又说Ding Boy的坏话了,其实有时我觉得他比较象Crack界的小燕子,令人又爱又恨)。好了关闭程序,用winsoftice载入去,唉刚刚还说好呢!原来它还是对winsoftice作了一点小动作,winsoftice不能中断于程序的入口的第一句处。没有关系,现在有三种方法,第一种方法是通过对程序的exe文件作一点修改,使其符合标准的PE文件格式,因为winsoftice毕竟不是专为Crack设计的,所以它的中断程序入口是针对标准的PE文件格式来写的,对于那些不符合的,它就没有能力了,具体的PE文件格式,大家可以看一看VC中的MSDN中的帮助和WINNT.H中的解释;第二种方法就是不用winsoftice,而用TRW,因为刘涛涛先生的TRW是专为Crack设计的,所以几乎所有可以在Windows上运行的程序,它都可以中断得了;第三种方法,就是在原exe文件中加插int 3语句,令winsoftice强行中断。 好了,方法说了一大罗,我们就用最简单的方法吧!没人会有简单的不用,去用最繁的,如果有吧!大家就。。。。。。。。
运行TRW0.75,选择菜单中的TRNEWTCB命令,然后运行加脱的程序,程序马上中断于第一句了。
具体如下:
0137:0043D100 PUSHAD 程序会中断于这里
0137:0043D101 MOV ESI,0042B0D9
0137:0043D106 LEA EDI,[ESI+FFFD5F27]
0137:0043D10C PUSH EDI
0137:0043D10D OR EBP,-01
0137:0043D110 JMP 0043D122 跳到解压程序
0137:0043D112 NOP
0137:0043D113 NOP
解压程序的入口:
0137:0043D122 8B1E MOV EBX,[ESI]
0137:0043D124 83EEFC SUB ESI,-04
0137:0043D127 11DB ADC EBX,EBX
0137:0043D129 72ED JB 0043D118
0137:0043D12B B801000000 MOV EAX,00000001
0137:0043D130 01DB ADD EBX,EBX
0137:0043D132 7507 JNZ 0043D13B
0137:0043D134 8B1E MOV EBX,[ESI]
好了在解压程序里面,程序会做无数次的循环,我没有必要了解它是如何进行加压的,所以就把光标一直向下走,一直走到这里:
0137:0043D250 EBD6 JMP 0043D228
0137:0043D252 61 POPAD
0137:0043D253 C3 RET
0137:0043D254 61 POPAD
0137:0043D255 E9D6A1FDFF JMP 00417430 这就是程序的真正入口了
0137:0043D25A 0000 ADD [EAX],AL
0137:0043D25C 0000 ADD [EAX],AL
0137:0043D25E 0000 ADD [EAX],AL
好开心啊!终于找到了入口地址,如果你只是针对某一个特定的程序而脱壳的,那么现在就可以用TRW的pedump命令直接脱壳了,但这不是我们所要的,我们现在是要研究UPX0.82的壳,要写一个通用的脱壳ini加入到Procdump1.50里面,那么,这样你以后就可以很方便脱掉UPX0.82所的脱了,同时也很方便网上传播了,让别人也能分享你的成果,这才是真正的Cracker精神。
操作:
1.用Ultraedit6.10打开Procdump1.50目录下的Script.ini文件;
它的格式如下:
[INDEX]
P1=Hasiuk/NeoLite
P2=PESHiELD
P3=Standard
P4=Shrinker 3.3
P5=Wwpack32 I
P6=Manolo
P7=Petite<1.3
P8=Wwpack32 II
P9=Vbox Dialog
PA=Vbox Std
PB=Petite 1.x
PC=Shrinker 3.2
PD=PEPack
PE=UPX 修改为PE=UPX<0.7X
PF=Aspack<108
P10=SoftSentry
P11=CodeSafe 3.X
P12=Aspack108
P13=Neolite2
P14=Aspack108.2
P15=Petite 2.0
P16=Sentinel
P17=PKLiTE
P18=Petite 2.1
P19=PCShrink
P1A=PCGUARD v2.10
P1B=Aspack108.3
P1C=Shrinker 3.4
P1D=UPX0.7X-0.8X 加入这句
然后找到:
[UPX] 修改为[UPX<0.7X]
然后在文件最下面加入:
[UPX0.7X-0.8X]
好了,准备功夫我们都做好了,现在可以写UPX0.82的脱壳扩展了,首先我们可以见到程序有两个跳动的地方,第一个是:
0137:0043D110 JMP 0043D122 跳到解压程序
所以我们马上把机器代码抄下来:
EB,10
第二个是:
0137:0043D255 E9D6A1FDFF JMP 00417430 这就是程序的真正入口了
机器代码就是:
E9,D6,A1,FD,FF
好了,所有的要找到东西我们都已经找到了,我们就开始编写UPX0.82的脱壳扩展了。
我编写的具体如下:
[UPX0.7X-0.8X]
L1=OBJR ;在扫描开始处设置初始的内存地址
L2=LOOK EB,10 ;查找第一个EB,10程序代码
L3=BP ;在当前内存位置设置断点
L4=WALK ;交还控制权到Procdump并且执行下一个指令
L5=OBJR ;在扫描开始处设置初始的内存地址
L6=LOOK 61,E9 ;查找第一个EB,10程序代码
L7=BP ;在当前内存位置设置断点
L8=STEP ;一步一步地跟踪分析程式
好了,以上的解释都很清楚了,没有什么不明白了,我们把文件保存后,再次运行Procdump1.50,在Choose Unpacker中可以见到多了一个UPX0.7X-0.8X项了,选择它,进行脱我们加了脱的程序,哈哈,叫我们保存了,你可以不要高兴得太早了,你试一试运行dump程序,哦不能运行,非法操作。不要心急,我们好象还有点东西要加上呢!那就是dump的可选参数了,Procdump1.50一共给我们提供了五组可选参数,如果你没有特别指出,就用默认值。好我们加上去试一试吧!
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000
以上这五参数是最常用的,你加参数时可要先试试,或者加了之后就可以用了,好我们加上,试一试。
以下文章所述,可能在有的机器上有不同的结果,请自行修正:
作者的机器是:
赛扬300A(超450)
PC100-64M内存
当我再次运行Procdump1.50来脱壳程序时,竟然程序一下子就运行了,根本不象上次那样提示要我保存脱壳后的文件,所以我想,可能这些参数有些不合适我的机器,于是我认真分析了每一个参数的真正含义之后,就把参数作了如下的修改:
OPTL1=00000001 这是延迟时间,我设为1ms
OPTL2=01010101 采用了快速dump的工作方式
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000
今次再运行Procdump1.50进行脱壳,哈哈!!!可以脱了,然后再双击脱壳后的文件,咦,可以执行了,再用Wdasm8.93反汇编分析一下文件,发现基本和原文件相同,只是文件大小有点不同,大了一点,再用了一下软件的各种功能,一切正常,所以应该说脱壳是成功的,到此,文章也该在此结束了,不过好象还漏了点事,就是用MakePe1.27帮助脱壳后的文件作进一步的优化,这就不一一描述了,自己看帮助进行吧!好了,最后总结一下吧!
完整地加入:
[UPX0.7X-0.8X]
L1=OBJR
L2=LOOK EB,10
L3=BP
L4=WALK
L5=OBJR
L6=LOOK 61,E9
L7=BP
L8=STEP
OPTL1=00000001
OPTL2=01010101
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000
By The Way!
4、Procdump中文说明书
大家好!早两天放上了提高篇(10)后,大家的反应还不错,不过对于一些朋友来说,要想用好Procdump1.50,可能还有点问题,因为它的Script的说明书是英文的,对于英文不是太好的朋友,这就成为一个很大的问题了。昨晚,在白菜的聊天室内,我和Ding Boy等高手一起聊天,Ding Boy就建议我把Procdump1.50的说明书翻译成中文,方便广大的朋友学习和使用Procdump1.50,本着我不入地狱,谁入地狱的决心,我就着手了翻译工作,由于本人的英文也不是太好!所以在Procdump1.50的Script说明书的翻译过程中,难免会有一些错误的地方,同时我的语文水平也不见得好到那里去,有时英文了解什么意思,中文也不知如何表达,所以也难免有一些词不达意,还有一些地方,我只能根据意译的方法来完成了,因为如果一字一字的合并起来,句子的意思可能不知它说什么。花了三个小时的时间,终于完成了,但为了有点记念意义,就把译文放进了提高篇(11)当中了,希望大家喜欢!
读者要求:
你可以阅读和传播本文章,但不能对文章的内容作任何的修改,请尊重作者(译)的劳动。
*********************************
ProcDump32的Script扩展:
*********************************
A) 功能定义:
*************************
1) Look功能:
这个Look功能是在被载入的程序中查找指定的HEX字串。它会把找到了的内存地址保存下来以便你可以方便在此内存地址设置断点。
例:
Look OF,85将用于搜索一个JNE或一个长jump。你可以通过BP命令来设置断点。
2) ADD功能:
允许你在当前内存地址上加一个变址值(例:出现于look命令或POS命令之后)。
3) DEC功能:
猜测;)
4) REPL功能
这个功能用于在当前内存中修改内码(连续的HEX)(注:它出现在look命令之后)。
例:
REPL 90,90将会在你当前的内存位置开始连接放入两个NOP指令。
5) BP功能
在当前内存位置设置一个断点。
6) BPX功能
在指定的位置设置断点。这个位置与程序开始位置有关。
例:
如果程序的开始位置在RVA 66000h,BPX 2672就会在RVA 68672设置断点。
7) BPF功能(用标志位设断)
这个功能会检查每一次断点发生时的标志位的值是否为你所设定的值。断点的位置为
当前内存地址。
Unset/Set的内容
*******************
C * C * 进位标志。
P * P * 奇偶标志。
A * A * 辅助进位标志。
Z * Z * 零标志。
S * S * 正负号标志。
D * D * 方向标志。
O * O * 溢出标志。
你可以单独测试ONE旗标。
8) BPC功能
当经过当前位置的次数达到设定值时发生中断。
例:
BPC 15 (在第21(15h)次经过当前位置时中断)
9) BPV功能
当如果寄存器的值到达了你设定的值时中断。
例:
BPV EAX=5 (当特定位置的EAX=5时中断)。
10) MOVE功能
设置当前EIP。加一个参数值给当前EIP。但请小心使用它。其实它对于程序没有做到什么,只是当你要跳过一些CRC检查时,就要用到它了,它相当于代替一连串的NOP指令。
例:
MOVE 14 就会把当前EIP变为EIP+14h。
11) POS功能
为所有的功能设置当前内存地址,这个位置与程序开始位置有关。
12) STEP功能
这个功能是设置一步一步的进行分析。它通常是用于完成跟踪dump过程的。
注意:单步模式就意味着每一行代码它都进行测试->慢!!所以设置单步模式一般
都放在最后。
13) OBJR功能
这个功能是设置以基始内存地址为开始进行扫描。对于LOOK命令有影响。
14) BPREG功能
以通过寄存器的值来设置断点。
15) WALK功能
执行下一条指令后把控件权交还ProcDump32。
16) EIP功能
设置下一个EIP为原来程序的最初进入点。
注意:
在断点之后,下一个EIP就是断点地址本身。
17) 建立外部帮助文件
通过特殊的参数创建外部文件。这个你指定的ini文件是由一些特殊的参数组成和建立的。
它包括:
. 进程的Pid。
. 所有寄存器的值包括EIP。
. 当前EIP的值
例子:
在script中:
...
L5=HELP PDHelp.Exe Helper.ini
...
你的helper的命令行会包含<Path to helper.ini>\"helper.ini"。
在helper.ini中:
[REG]
Dr0=00000000
Dr1=00000000
Dr2=00000000
Dr3=00000000
Dr6=00000000
Dr7=00000000
SegGs=00000000
SegFs=00000FDF
SegEs=00000167
SegDs=00000167
Edi=00000000
Esi=8161D244
Ebx=00000000
Edx=8161D2A4
Ecx=8161D264
Eax=0043E9B4
Ebp=00456000
Eip=00456264
SegCs=0000015F
Flags=00000216
Esp=0068FE34
SegSs=00000167
Pid=FFC1E943
Local=00456264
我想这样做可以比较灵活;)。
注意:
命令行每行不能使用超过512个字每来描述helper的EXE和INI文件的路径,这个只是ProcDump的内部限制,而对于WINDOWS API来说来说就不能超过256个字母。
B) 在script中Options的格式:
*************************************
Options是通过OPTL开始的,并以DWORD形式保存的。
OPTL1=
DWORD : 设定AutoDump中的延迟时间,以ms为单位。
OPTL2=
BYTE :自动执行EIP
BYTE :忽略错误
BYTE :快速模式Dump
BYTE :外部Predump
OPTL3=
BYTE :优化PE
BYTE :自动计算程式
BYTE :跟踪API
BYTE :自动分层
OPTL4=
BYTE :未知模式
BYTE :Import表类型重建
BYTE :修复Header
BYTE :修复Relocs
OPTL5=
BYTE :保留
BYTE :保留
BYTE :检查Header
BYTE :合并代码
为得到更详细资料... 查看ProcDump Options的解释吧。
C) 如何编写你的加壳软件的定义:
*****************************************************
1) 添加索引段:
*************************
加一个Pxx的声明....注意xx的值是跟接在最后一个的值。
例如:
增加之前
[INDEX]
P1=Shrinker 3.3
P2=Wwpack32 Beta 9
P3=Wwpack32 1.0
增加之后
[INDEX]
P1=Shrinker 3.3
P2=Wwpack32 Beta 9
P3=Wwpack32 1.0
P4=My Own definition
2) 增加你的定义:
************************
每行的定义都必须事先声明,例如用Lxx。
例:
[My own definition]
L1=Look 0F,85,DB,FF,FF
L2=BP
L3=STEP
你可以在定义中多加一点默认options,添加OPTLx的方法也是这样做,如果你没有指定默认的options,ProcDump会使用常规的那些设置。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。