破解

      关于创作者 2004-12-11 19:46
第二节 认识脱壳

一切从“壳”开始
吴朝相 1999.2.23 (搜新网www.souxin.com)

  我写这篇东西的主要目的是让初到本站的新手们能对“壳”有个大概的认识,知道我每天说了些什么。限于本人的知识,如果有 ERROR 之处,还请多原谅。如果你觉得还可以, 也欢迎转贴,但请保留文章的完整性和作者的资料。当然如果你想把它发表,硬塞些稿费给 俺花花,我也不会拒绝的。;)

  作为一个以“壳”为主的站台,如果连访者连什么是“壳”都不清楚的话,那我也太失败了。很早以前就想写编完全关于“壳”的文章,但苦于时间和文字水平的关系,都没提笔。本着对站台负责的态度,现在经过一天的努力,“打”出这编尝试由壳的历史一直谈到最新发展的本章来。

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

   最早提出“壳”这个概念的,据我所知,应该是当年推出脱壳软件 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月建起了一个专门介绍“壳”的站台: 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、工具介绍 2、ProcDump应用文章一
3、ProcDump应用文章二 4、ProcDump中文说明书

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 www.aspack.com 是俄国作者Alexey Solodovnikov写的一个非常强大的Win32压缩工具,其压缩率、速度和兼容性很不错,是目前很流行的一种压缩工具。
UPX Markus Oberhumer & Laszlo Molnar Homepage 非常全能的 EXE 压缩软件,并可用UPX -D命令脱壳。
Petite Ian Luck Homepage 能压缩PE文件的code, data等资源。
PE-PACK ANAKiN Homepage 一个自身体积小巧的压缩工具
PKLITE32 PKWARE, Inc. www.pkware.com 32-位压缩工具(DLL/EXE).
WWPack32 Piotr Warezak and Rafal Wierzbicki Homepage 32-位压缩工具(DLL/EXE).
NeoLite Hompage 32-位压缩工具(DLL/EXE).
Shrinker Blink Inc Hompage 32-位压缩工具(DLL/EXE).


脱壳工具介绍(UNPACKERS)

  一般某种压缩工具的壳,都会有相应的脱壳工具,因此只要找到较新版本的脱壳工具, 一般的壳都可轻易脱去。

常用脱壳工具(Windows Unpackers)列表: 名称 作者 主页 介绍
ASPack unpacker bane Homepage 脱ASPack的压缩PE文件。
UnPEPack M.o.D. 脱PEPack的壳
ProcDump32 十分优秀的“万能”脱壳工具,可惜不升级了,因此只能自动脱些老版本压缩工具的壳,但可通过脚本命令使其升级。也是一款优秀的PE修改工具。


侦测文件类型工具

名称 介绍
FileInfo 能检测多种文件格式,脱壳前用来判断是否加壳或何种壳,推荐使用!
GetTyp 功能同上
TYP 功能同上

要了解更多的压缩工具或脱壳工具可去下面站点:

站点1:playtools工具站点(请通过代理访问)
站点2:protools工具站点 (请通过代理访问)
站点3:阿伦主页

2、ProcDump应用文章一

注:本文作者PererS是台湾的,因此要注意在一些名词上称呼与我们不同。
由于此文写作时间较早,在此推荐两个新版工具:
侦测工具:推荐FileInfo。
脱壳工具:ProcDump32 v1.6.2 FINAL终结版本 。(作者不升级了,对目前新版压缩工具的壳无效,为了你对 Procdump有个认识,在此提供一较老版本ASPack压缩的记事本程序供练习:下载)

标题:软体名称 中文哇!档案阅览器 2000 (Version 4.1)
保护方法 壳
需要工具 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 码 ): crackers.163.net/
作者网页 : www-user.TU-Cottbus.DE/~kannegv

注意 : 要抓 dos32 的版本,才能在 windows 下正常使用

4.Procdump 是目前世界上最强的拨壳软体,除可以剥已知道的壳外,还可以剥许多未知的壳。更可以以手动的方法,增强其剥壳能力 ( 可惜的是,它只支援 win32 的软体, win16 与 dos 的他都不支援 ) 。,你可以在下面的网站抓到 :

阿伦的家 (GB 码 ): crackers.163.net/
吴朝相的家 (GB 码 ):http://member.netease.com/~topage

5. 别看我的网站都是介绍中国的网站,我可是道道地地的台湾人,只是因为破解与保护在中国比较盛行,不得已 ... 否则我也想介绍一些台湾的破解站啊 !( 不然只有孤零零的我一个 )
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 !

我发现对于使用 UPX0.7x 到 UPX0.8x 加壳的软件,用我的方法都可以成功脱壳。


作者: Ru Feng

信箱: ocq@163.net (未得作者允许,严禁 Email 任何软件到此信箱)

主页(一): ocq.163.net (枫林居)

主页(二): ocq.yeah.net (最 Cool 的 VB 控件天堂)

主页(三): ocqpat.163.net (我的作品,主要介绍“电子资料库”软件)

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 会使用常规的那些设置。

作者: Ru Feng (译)

信箱: ocq@163.net (未得作者允许,严禁 Email 任何软件到此信箱)

主页(一): ocq.163.net (枫林居)

主页(二): ocq.yeah.net (最 Cool 的 VB 控件天堂)

主页(三): ocqpat.163.net (我的作品,主要介绍“电子资料库”软件)

第四节 手动脱壳

1、基本知识 2、UPX V1.01的壳
3、Shrinker v3.4 的壳 4、ASPack v1.083

1、基本知识

  手动脱壳就是不借助自动脱壳工具,而是用动态调试工具SOFTICE或TRW2000来脱壳。这课谈谈一些入门方面的知识,如要了解更深的脱壳知识,请参考《脱壳高级篇》这课。

工具

*调试器:SoftICE 、TRW2000
*内存抓取工具:Procdump等;
*十六进制工具:Hiew、UltraEdit、Hex Workshop等;
*PE编辑工具: Procdump、PEditor等;


名词概念

★PE文件:Microsoft设计了一种新的文件格式Portable Executable File Format(即PE格式),该格式应用于所有基于Win32的系统:Windows NT、Windows 2000、Win32s及Windows 95/98。

★基址(ImageBase ):是指装入到内存中的EXE或DLL程序的开始地址,它是Win32中的一个重要概念。 在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 95中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。

★RVA:相对虚拟地址(Relative Virual Address),是某个项相对于文件映象地址的偏移。例如:装载程序将一个PE文件装入到虚拟地址空间中,从10000h开始的内存中,如果PE中某个表在映像中的起始地址是10464h,那么该表的RVA就是464h。虚拟地址(RVA)=偏移地址+基址(ImageBase )

★Entry Point:入口点,就是程序在完成了对原程序的还原后,开始跳转到刚还原的程序执行,此时的地址就是入口点的值。

步骤

★确定壳的种类

一般拿到软件后,可用工具FileInfo、gtw、TYP32等侦测文件类型的工具来看看是何种壳,然后再采取措施。

★入口点(Entry Point)确定

对初学者来说定位程序解壳后的入口点确定较难,但熟练后,入口点查找是很方便的。 决大多数 PE 加壳程序在被加密的程序中加上一个或多个段。 所以看到一个跨段的 JMP 就有可能是了。如:UPX 用了一次跨段的 JMP , ASPACK 用了两次跨段的 JMP 。 这种判断一般是跟踪分析程序而找到入口点,如是用TRW2000也可试试命令:PNEWSEC,它可让TRW2000中断到入口点上。
PNEWSEC:运行直到进入一个 PE 程序内存的新的 section时产生断点。(如不懂,以后到脱壳高级篇自会明白)

另外也可用D.boy的冲击波2000,它能轻易的找到任何加密壳的入口点,

★dump取内存己还原文件

找到入口点后,在此处可以用 Procdump的FULL DUMP功能来抓取内存中整个文件,
如是用TRW2000也可用命令:

makepe命令含义:从内存中整理出一个指令名称的PE格式的exe文件, 当前的 EIP 将成为新的程序入口,生成文件的 Import table 已经重新生成过了。生成的PE文件可运行任何平台和微机上。

pedump命令含义:将PE文件的内存映像直接映像到指定的文件里。生成的文件只能在本机运行,不能在其它系统平台或微机运行。


★修正刚dump取的文件

如是用 Procdump的FULL DUMP功能脱壳的文件,要用 Procdump或PEditor等PE编辑工具修正入口点(Entry Point)。
第四节 手动脱壳

1、基本知识 2、UPX V1.01的壳
3、Shrinker v3.4 的壳 4、ASPack v1.083

2、UPX V1.01的壳

目标程序: 用 UPX V1.01压缩过的Notepad.exe


方法一、使用TRW2000来脱壳

★使用工具

TRW2000
FileInfo


★确定壳的种类

拿到这软件后,可用工具FileInfo、gtw、TYP32等侦测文件类型的工具来看看是何种软件压缩的,在这我们以FileInfo 为例,把目标文件复制到FileInfo目录下,在资源管理器下双击FileInfo,再按回车,你将看到报告出来:告诉你这是UPX1.01压缩的软件。

★入口点(Entry Point)确定

◇利用跟踪分析来确定入口点

决大多数 PE 加壳程序在被加密的程序中加上一个或多个段。 所以看到一个跨段的 JMP 就有可能是了。 UPX 用了一次跨段的 JMP 。 就是你一步步跟踪时会看到代码有一突跃,一般再跟据领空文件名的变化,就能确定入口点了。运行TRW2000并装载目标程序,然后LOAD,你将中断在主程序入口处:此时合理按F10、F7及F12一直向前走,注意此时领空会是:NOTUPX!UPX1+2xxx.

在你跟踪过程中会出现如下代码:

该程序的具体情况如下:

XXX:XXXXXXXX 60 PUSHAD ;所有的寄存器进栈
XXX:XXXXXXXX BE2EFD4200 MOV ESI, XXXXXXXX ;将下一条指令送入进行解压
XXX:XXXXXXXX 8DBED21FFDFF LEA EDI, [ESI+XXXXXXXX]

.......
....... <---- 按F10跟踪 ;-P
XXX:XXXXXXXX FF96A8C90400 CALL [ESI+XXXXXXXX]
XXX:XXXXXXXX 61 POPAD ;所有寄存器出栈
XXX:XXXXXXXX E9A44AFBFF JMP 00401000 ;跳到程序真正入口点(OEP),文件完全解压。


0137:40ddbe popa
0137:40ddf jmp 00401000 <-此行己完全解压结束,将要跳到记事本程序入口点执行程序(注意此处的一个大的突跃)。
........................
0137:401000 push ebp <-完全解压后的记事本程序第一行

因此入口点(Entry Point)找到为:401000

◇利用TRW2000特有命令PNEWSEC

TRW2000也是一款优秀的脱壳工具,有许多特有的命令对脱壳很有帮助,在此时用PNEWSEC命令也可方便找到入口点。
运行TRW2000并装载目标程序,然后LOAD,你将中断在主程序入口处,下令:PNEWSEC
等上一段时间,程序将中断在入口点处。

◇用冲击波2000

冲击波2000是D.boy开发的一个专门查找加壳软件入口点的工具,先运行冲击波2000,点击Track按钮:开始进行跟踪,然后运行要跟踪的程序, 找到入口点后,会在Enter point 显示。可是用这个记事本程序却无效。

★dump取内存中己脱壳的文件

不管你用何种方法找到入口点,首先要来到入口点一行:

0137:401000 push ebp

执行命令makepe 路径/文件名或pedump 路径/文件名

就这样脱壳成功。

注:TRW2000的makepe重建的PE文件可跨平台运行,pedump抓取的文件却不可。

方法二、用SOFTICE来脱壳

★使用工具

TRW2000
FileInfo
ProcDump

★入口点(Entry Point)确定

◇利用跟踪分析来确定入口点

方法同TRW2000。

★dump取内存中己脱壳的文件

0137:40ddf jmp 00401000
现在这一行,键入以下命令:
a eip (然后按回车)
jmp eip (然后按回车)
按下F5

这样将改变0137:40ddf行的代码. 你会注意到在键入"jmp eip"并按下回车后,40ddf的指令现在是一个jmp.这将有效地使程序"暂停"(有点类似TRW2000的suspend命令). 按下F5使你回到window。

运行ProcDump,在Task的列表中的第一个list上点击鼠标右键,然后选择"Refresh list". 在Task列表中找到notepad.exe,在它的上面点击鼠标右键. 然后,选中"Dump (Full)",给脱壳的程序起名存盘. 再在notepad.exe上点击鼠标右键,然后选中"Kill Task".

注:用此方法抓取的文件不可跨平台运行。

★修正刚dump取的文件的入口点

脱壳的notepad.exe程序入口是00401000.
再次使用ProcDump的PE Editor功能, 打开已脱壳的notepad.exe.

在"Header Infos"一项, 你会看见程序Entry Point(入口值)是0000DC70,这当然是错误的. 如果你试着不改动这个入口值而运行脱壳后的notepad.exe,程序将无法运行.

在 Procdump可看到ImageBase =00400000,我们上面跟踪找到的入口值的RVA是00401000,因为:虚拟地址(RVA)=偏移地址+基址(ImageBase ),因此

Entry Poin=00401000-00400000=1000,改变入口值为1000,点击"OK".

现在, 运行脱壳后的notepad.exe吧,它应该正常运行了。
3、Shrinker v3.4 的壳

英文原作: Etenal Bliss
电子邮件: Eternal_Bliss@hotmail.com
作者网址: crackmes.cjb.net
surf.to/crackmes
写作日期: 2000年2月25日
中文翻译: 冰毒
翻译日期: 2000年3月14日

目标程序: 用Shrinker v3.4压缩过的Notepad.exe

******************************************************************
冰毒注:
1. Notepad.exe就是Windows自带的写字板程序,相信大家的机器中都会有.
2. Shrinker v3.4可以在http://w3.to/protools下载,这里你可以找到你
想要的几乎所有的工具.
******************************************************************

使用工具:
ProcDump
Softice
Symbol Loader (冰毒注:这个是Softice自带的,用过Softice的应该知道)

破解方法:
手动脱壳

教学目的:
教你手动脱壳的基本技术
__________________________________________________________________________

关于这个教程

这是我打算写的*简单*的脱壳系列教程的第一篇. 目标程序是notepad.exe,在大多数
的电脑中都有它. 因为我还不能很好地解释脱壳中的一些问题,我只能尽我所能向你们
展示简单的方法. 至于高级的方法,你们必须去读别的教程.
_________________________________________________________________________


使Softice中断于程序入口处

用Symbol Loader打开已压缩的notepad.exe.

点击Symbol loader任务条上的第二个图标,当你把鼠标移到图标上时,在Symbol Loader
窗口底部提示行你会见到"Load the currently open module"的字样

你将得到一条出错信息并问你是否尽管出错还是要装入这个exe文件. 点击"Yes".

假如Softice已经运行的话, 它应该在程序的入口处中断.可是它并没有中断,压缩过的
notepad.exe直接就运行了.

该到改变characteristics of the sections的时间了...
通过改变characteristics, 你可以使Softice中断于程序入口.

用ProcDump装入压缩过的notepad.exe (使用PE Editor)
你会看到这个以"PE Structure Editor"作为标题的窗口.
点击称作"Sections"的按钮.

你将得到另一个以"Sections Editor"做标题的窗口.
你会见到压缩过的notepad.exe的不同sections.

第一个是 .shrink0 它的characteristics是C0000082.
改变characteristics: 鼠标左键点击.shrink0再点击右键并选择edit section.

你将得到另一个窗口,它用'Modify section value" 作标题.
把Section Characteristics由C0000082改为E0000020.
一路按OK直到你回到ProcDump的主窗口.
你现在可以把ProcDump放在一边了.

**我愿意多作解释为什么必须这样做,但我没这个能力. 8P
你也许要读些PE结构的资料来找到原因.
别人教我说, E0000020将使section成为可执行的,因此Softice将会中断于入口处

找到程序真正入口并进行脱壳

现在, 希望你没有关闭symbol loader. 假如你关掉的话,重新运行它,打开并装入已
压缩的notepad.exe

当你这次点击"Yes"时, 你会发现你已在进入Softice中了...
我把下面的代码贴出来并加上注解.

************************* 你在SICE中所见到的 *************************

**Softice中断时,你会在这儿. 一直按F10走过这部分代码

0041454F FFFF INVALID
00414556 55 PUSH EBP
00414557 8BEC MOV EBP,ESP
00414559 56 PUSH ESI
0041455A 57 PUSH EDI
0041455B 756B JNZ 004145C8 (NO JUMP)
0041455D 6800010000 PUSH 00000100
00414562 E8D60B0000 CALL 0041513D
00414567 83C404 ADD ESP,04
0041456A 8B7508 MOV ESI,[EBP+08]
0041456D A3B4F14000 MOV [0040F1B4],EAX
00414572 85F6 TEST ESI,ESI
00414574 7423 JZ 00414599 (JUMP)
00414599 33FF XOR EDI,EDI
0041459B 57 PUSH EDI
0041459C 893D8C184100 MOV [0041188C],EDI
004145A2 FF1510224100 CALL [KERNEL32!GetModuleHandleA]
004145A8 8BF0 MOV ESI,EAX
004145AA 68FF000000 PUSH 000000FF
004145AF A1B4F14000 MOV EAX,[0040F1B4]
004145B4 897D10 MOV [EBP+10],EDI
004145B7 C7450C01000000 MOV DWORD PTR [EBP+0C],00000001
004145BE 50 PUSH EAX
004145BF 56 PUSH ESI
004145C0 FF15F4214100 CALL [KERNEL32!GetModuleFileNameA]
004145C6 EB03 JMP 004145CB (JUMP)
004145CB E830EAFFFF CALL 00413000
004145D0 FF7510 PUSH DWORD PTR [EBP+10]
004145D3 FF750C PUSH DWORD PTR [EBP+0C]
004145D6 56 PUSH ESI
004145D7 E806000000 CALL 004145E2

**当你走过这个位于004145D7的CALL, 压缩过的notepad.exe就自由运行了. 再次用
symbol loader装入. 再次来到这个CALL时, 按F8追进去. 你将看到以下代码. 不
过记着先BPX 004145D7.

004145E2 64A100000000 MOV EAX,FS:[00000000]
004145E8 55 PUSH EBP
004145E9 8BEC MOV EBP,ESP
004145EB 6AFF PUSH FF
004145ED 6810E04000 PUSH 0040E010
004145F2 68EC5D4100 PUSH 00415DEC
004145F7 50 PUSH EAX
004145F8 64892500000000 MOV FS:[00000000],ESP
004145FF 83EC14 SUB ESP,14
00414602 C745E401000000 MOV DWORD PTR [EBP-1C],00000001
00414609 53 PUSH EBX
0041460A 56 PUSH ESI
0041460B 57 PUSH EDI
0041460C 8965E8 MOV [EBP-18],ESP
0041460F C745FC00000000 MOV DWORD PTR [EBP-04],00000000
00414616 8B450C MOV EAX,[EBP+0C]
00414619 83F801 CMP EAX,01
0041461C 7510 JNZ 0041462E (NO JUMP)
0041461E E886030000 CALL 004149A9
00414623 FF05C0F14000 INC DWORD PTR [0040F1C0]
00414629 E882F6FFFF CALL 00413CB0
0041462E 8B35C0F14000 MOV ESI,[0040F1C0]
00414634 85F6 TEST ESI,ESI
00414636 0F848D000000 JZ 004146C9 (NO JUMP)
0041463C 833DC4F1400000 CMP DWORD PTR [0040F1C4],00
00414643 7526 JNZ 0041466B (NO JUMP)
00414645 833D6417410000 CMP DWORD PTR [00411764],00
0041464C 741D JZ 0041466B (NO JUMP)
0041464E A164174100 MOV EAX,[00411764]

**EAX现在的值是000010CC

00414653 030588184100 ADD EAX,[00411888]

**EAX现在的值是004010CC

00414659 8945DC MOV [EBP-24],EAX

**[EBP-24]现在含的是004010CC

0041465C FF7510 PUSH DWORD PTR [EBP+10]
0041465F FF750C PUSH DWORD PTR [EBP+0C]
00414662 FF7508 PUSH DWORD PTR [EBP+08]
00414665 FF55DC CALL [EBP-24]

**假如你追过最后这个CALL,notepad.exe将再次自由运行.
由上得知, 既然[EBP-24] = 004010CC, 最后这句代码就意味着压缩过的程序在
CALL 004010CC. 如果你追进这个CALL, 你会发现notepad.exe很快就会运行了.

假如你曾经追过更多shrinker v3.4压缩的程序, 你总会见到这个"CALL [EBP-24]".
所以, 程序实际上正在进入已脱壳的程序的真正入口.

再次装入压缩过的notepad.exe,中断之后,按F5,你将中断于004145D7行(这里你原来
设过断点). 追进去直到你到达00414665行,这里程序正要进入已脱壳程序的真正入口.

现在,键入以下命令:
a eip (然后按回车)
jmp eip (然后按回车)
按下F5

这样将改变00414665行的代码. 你会注意到在键入"jmp eip"并按下回车后,00414665的
指令现在是一个jmp.这将有效地使程序"暂停". 按下F5使你回到window,你就可以dump
已经脱壳的程序到你的硬盘了.

现在又要用ProcDump了,在Task的列表中的第一个list上点击鼠标右键,然后选择"Refresh
list". 在Task列表中找到notepad.exe,在它的上面点击鼠标右键.
然后,选中"Dump (Full)",给脱壳的程序起名存盘.
再在notepad.exe上点击鼠标右键,然后选中"Kill Task".

_________________________________________________________________________

改动程序入口值

如果你记得的话, 脱壳的notepad.exe程序入口是004010CC.
再次使用ProcDump的PE Editor功能, 打开已脱壳的notepad.exe.

在"Header Infos"一项, 你会看见程序入口值是0001454F,这当然是错误的. 如果你试着
不改动这个入口值而运行脱壳后的notepad.exe,程序将无法运行.

改变入口值为Entry Poin=004010CC-基址(ImageBase ),点击"OK".

现在, 运行脱壳后的notepad.exe吧,它应该正常运行了. 8)

__________________________________________________________________________


最后的说明

这篇教程是为所有和我一样的newbies而作.

我感谢和感激:

MiZ. 从他那里我学会了脱壳的基本技巧.

所有破解教程和CrackMe的作者,以及所有一直支持我的网站和论坛的Cracker们.

4、ASPack v1.083

压缩文件:下载。

如用TRW2000调试,装载后,下命令:pnewsec就可中断到入口点。为了提高跟踪水平,下面以SOFTICE为例,讲述跟踪过程。

_________________________________________________________________________

寻找程序的入口点( Entry Point)


用Symbol Loader打开Notepad-ASPACK.exe,点击Symbol loader的第二个图标("Load the currently open module")

如SOFTICE 装载成功,它应中断在起始程序入口处。


当跟踪时,你会经过许多条件跳转指令及循环指令,要用点技巧跳出这些圈子,其形式一般这样:

*************************************
aaaaaaaa
...
wwwwwwww
xxxxxxxx JNZ zzzzzzzz <-- 循环返回到aaaaaaaa
yyyyyyyy JMP aaaaaaaa
zzzzzzzz 新的指令

如果你跟踪时,你将跳转到 aaaaaaa处多次,你可将光标移到 zzzzzzzz一行,按F7让指令直接跳到此处,可省不少时间。
*************************************


在跟踪过程会来到:
167:0040D558 POPAD
0167:0040D559 JNZ 0040D563 (JUMP)
0167:0040D55B MOV EAX,00000001
0167:0040D560 RET 000C
0167:0040D563 PUSH EAX<--EAX的值就是入口点的值=4010CC
0167:0040D564 RET <--返回到记事本的真正的入口点

*************************************
0167:004010CC PUSH EBP <--真正的入口点
0167:004010CD MOV EBP,ESP
0167:004010CF SUB ESP,00000044
0167:004010D2 PUSH ESI

经过0167:0040D564 RET 一行,程序将来到0167:004010CC刚完全解压的真正程序第一条指令处。
*************************************
当我们跟踪时发现POPAD或POPFD,就要提高警惕,一般入口点就在附近了,在此程序的原始入口点是004010CC
在0167:0040D564 RET一行键入:
a eip (然后按回车)
jmp eip (然后按回车)
F5

这个方法是让程序挂起,按F5回到windows下。
运行 Procdump,在Task的列表中的第一个list上点击鼠标右键,然后选择"Refresh
list". 在Task列表中找到notepad.exe,在它的上面点击鼠标右键.
然后,选中"Dump (Full)",给脱壳的程序起名存盘.
再在notepad.exe上点击鼠标右键,然后选中"Kill Task".


_________________________________________________________________________

修正入口点

脱壳的notepad.exe程序入口是004010CC.
再次使用ProcDump的PE Editor功能, 打开已脱壳的notepad.exe.


修正入口点值=4010CC-00400000(基址)=10CC
点击"OK".

现在, 运行脱壳后的notepad.exe吧,它应该正常运行了。

第五节 脱壳高级篇

 1、认识Import表  2、Import表的重建  3、IceDump和NticeDump使用
 4、Import REConstructor使用  5、ASProtect保护   

1、认识Import表

著者: [yAtEs] [Jamesluton@hotmail.com]
译者:hying[CCG]
标题:PE输入表说明
例子:下载
有很多介绍PE文件的文章,但是我打算写一篇关于输入表的文章,因为它对于破解很有用。
我想解释它的最好的方法是举一个例子,你可以跟着我逐步深入,一步一步的思考,最后你将完全明白,我选择了一个我刚下载下来的小程序,它是用TASM编译的,有一个比较小的输入表,所以我想它应该是个不错的范例。
好了,让我们开始吧。首先我们得找到输入表,它的地址放在PE文件头偏移80处,所以我们用16进制编辑器打开我们的EXE文件,我们先得找到PE文件头的起始点,这很简单,因为它总是以PE,0,0开始,我们可以在偏移100处找到它。在一般的WIN32程序中文件头偏移被放在文件0X3C处,在那我们通常可看到00 01 00 00,由于数据存储时是低位在前,高位在后的,所以翻转过来实际就是00000100,就象前面我们说的。接下来我们就可以在PE文件中找到我们的输入表,100+80=180在偏移180处我们看到0030 0000,翻转一下,它其实应该是00003000,这说明输入表在内存3000处,我们必须把它转换成文件偏移。
一般来说,输入表总是在某个段的起始处,我们可以用PE编辑器来查看虚拟偏移,寻找3000并由此发现原始偏移。很简单的。打开我们看到:
-CODE 00001000 00001000 00000200 00000600
-DATA 00001000 00002000 00000200 00000800
.idata 00001000 00003000 00000200 00000A00
.reloc 00001000 00004000 00000200 00000C00
找一下,我们就发现.idata段的虚拟偏移是3000,原始偏移是A00,3000-A00=2600,我们要记住2600,以便以后转换其它的偏移。如果你没找到输入表的虚拟偏移,那么就找一下最接近的段。
来到偏移A00处,我们就看到被称为IMAGE_IMPORT_DESCRIPTORs(IID)的东东,它用5个字段表示每一个被调用DLL的信息,最后以Null结束。
**************************************************************************
(IID) IMAGE_IMPORT_DESCRIPTOR的结构包含如下5个字段:
OriginalFirstThunk, TimeDateStamp, ForwarderChain, Name, FirstThunk

OriginalFirstThunk
该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是不变的。

TimeDateStamp
一个32位的时间标志,有特殊的用处。

ForwarderChain
输入函数列表的32位索引。

Name
DLL文件名(一个以00结束的ASCII字符串)的32位RVA地址。

FirstThunk
该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是可变的。
**************************************************************************

好了,你有没有理解?让我们看看我们有多少IID,它们从偏移A00处开始
3C30 0000 / 0000 0000 / 0000 0000 / 8C30 0000 / 6430 0000
{OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk}
5C30 0000 / 0000 0000 / 0000 0000 / 9930 0000 / 8430 0000
{OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk}
0000 0000 / 0000 0000 / 0000 0000 / 0000 0000 / 0000 0000

每三分之一是个分界,我们知道每个IID包含了一个DLL的调用信息,现在我们有2个IID,所以我们估计这个程序调用了2个DLL。甚至我可以打赌,你能推测出我们将能找到什么。
每个IID的第四个字段表示的是名字,通过它我们可以知道被调用的函数名。第一个IID的名字字段是8C30 0000,翻转过来也就是地址0000308C,将它减去2600可以得到原始偏移,308C-2600=A8C,来到文件偏移A8C处,我们看到了什么?啊哈!原来调用的是KERNEL32.dll。
好了,接下来我们就要去找出KERNEL32.dll中被调用的函数。回到第一个IID。
FirstThunk字段包含了被调用的函数名的标志,OriginalFirstThunk仅仅是FirstThunk的备份,甚至有的程序根本没有,所以我们通常看FirstThunk,它在程序运行时被初始化。
KERNEL32.dll的FirstThunk字段值是6430 0000,翻转过来也就是地址00003064,减去2600得A64,在偏移A64处就是我们的IMAGE_THUNK_DATA,它存储的是一串地址,以一串00结束。如下:
A430 0000/B230 0000/C030 0000/CE30 0000/DE30 0000/EA30 0000/F630 0000/0000 0000
通常在一个完整的程序里都将有这些。我们现在有了7个函数调用,让我们来看其中的两个:
DE30 0000翻转后是30DE,减去2600后等于ADE,看在偏移ADE处的字符串是ReadFile,
EA30 0000翻转后是30EA,减去2600后等于AEA,看在偏移AEA处的字符串是WriteFile,
你可能注意到了,在函数名前还有2个这字节的00,它是被作为一个提示。
很简单吧,你可以自己来试一下。回到A00,看第二个DLL的调用
5C30 0000 / 0000 0000 / 0000 0000 / 9930 0000 / 8430 0000
{OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk}
先找它的DLL文件名。9930翻转为3099-2600 =A99,在偏移A99处找到USER32.dll。再看FirstThunk字段值:8430翻转为3084-2600=A84,偏移A84处保存的地址为08310000,翻转后3108-2600=B08,偏移B08处字符串为MessageBoxA。明白了吧,接下来你就可以把这些用在你自己的EXE文件上了。
摘要:
在PE文件头+80偏移处存放着输入表的地址,输入表包含了DLL被调用的每个函数的函数名和FirstThunk,通常还有Forward Chain和TimeStamp。
当运行程序时系统调用GetProcAddress,将函数名作为参数,换取真正的函数入口地址,并在内存中写入输入表。当你对一个程序脱壳时你可能注意到你有了一个已经初始化的FirstThunk。例如,在我的WIN98上,函数GetProcAddress的入口地址是AE6DF7BF,在98上,所有的KERNEL32.dll函数调用地址看上去地址都象:xxxxF7BF,如果你在输入表中看到这些,你可以利用orignal thunk重建它,或者重建这个PE程序。
好了,我已经告诉你它们是如何工作的,我不是专家,如果你发现什么错误,请告诉我。


2、Import表的重建

标题:重建 PE 文件的输入表

原著:TiTi/BLiZZARD

翻译:Sun Bird [CCG]

日期:2000年5月24日


1. 前言
=======

大家好 :) 我之所以写这篇短文,是由于我在 Dump 时发现,很多加压、加密软件都使
得输入表(Import Table)不可用,所以 Dump 出的可执行文件必须要重建输入表。而在普
通的讲授 Win32 汇编的站点上我没有找到这样的介绍,所以如果你对此感兴趣,那么这篇
短文对你会有些帮助。

例如,为了让从内存中 Dump 出的经 PETite v2.1 压缩过的可执行文件正常运行,必
须重建输入表。(对于 ASPack、PEPack、PESentry……也同样)这就是所有 Dump 软件都
具备重建输入表功能的原因(例如 G-RoM/UCF 制作的 Phoenix Engine(ProcDump 内含),
或者由 Virogen/PC 和我制作的 PE Rebuilder)。

鉴于这个问题十分特殊,而且比较复杂,所以我假定你已经了解了 PE 文件结构。(你
需要阅读有关 PE 文件的文档)

2. 预备知识
===========

首先是一些关于输入表和 RVA/VA 的简介。

输入表的相对虚拟地址(RVA)储存在 PE 文件头部的相应目录入口(它的偏移量为
[ PE 文件头偏移量+80h ])。由于是虚拟偏移量,所以它和文件输入表中的偏移量(VA)
是不匹配的(除非文件纯粹是刚刚从内存中 Dump 出来的)。于是我们首先要做的事情是,
找到 PE 文件的输入表,将 RVA 转换为相应的 VA。为此,我们可以采用不同的办法:你可
以自行编制软件来分析块(Sections)目录并计算 VA,但最简单的办法是使用专门为此设
计的应用程序接口(API)。这个 API 包括在 IMAGEHLP.DLL(Win9X 和 NT 系统都使用的
一个库)中,名为 ImageRvaToVa。下面是对它的描述(完整的内容详见 MSDN 库):

# LPVOID ImageRvaToVa(
# IN PIMAGE_NT_HEADERS NtHeaders,
# IN LPVOID Base,
# IN DWORD Rva,
# IN OUT PIMAGE_SECTION_HEADER *LastRvaSection
#);
#
# 参数:
#
# NtHeaders
#
# 指示一个 IMAGE_NT_HEADERS 结构。通过调用 ImageNtHeader 函数可以获得这个结构。
#
# Base
#
# 指定通过调用 MapViewOfFile 函数映射入内存的一个映象的基址(Base Address)。
#
# Rva
#
# 指定相对虚拟地址的位置。
#
# LastRvaSection
#
# 指向一个指定的最终 RVA 块的 IMAGE_SECTION_HEADER 结构。这是一个可选参数。当被
#指定时,它指向一个变量,该变量包含指定映象的最后块值,以便将 RVA 转换为 VA。

就这么简单。你只需要将 PE 文件映射入内存,然后调用这个函数就能够得到输入表的正
确 VA。

注意,下面我会忽略所有的 RVA/VA 注释,但是,当你对重建的 PE 文件进行读出或写入
RVAs 操作时,不要忘记它们之间的转换。

3. 完整说明
===========

这里是一个完整改变输入表的例子(这个 PE 文件的输入表已经被 PETite v2.1 压缩过,
并且是直接从内存中 Dump 出来的):

我们用“`”表示 00,用“-”表示非字符串

0000C1E8h : 00 00 00 00 00 00 00 00 00 00 00 00 BA C2 00 00 ````````````----
0000C1F8h : 38 C2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ----````````````
0000C208h : C5 C2 00 00 44 C2 00 00 00 00 00 00 00 00 00 00 --------````````
0000C218h : 00 00 00 00 D2 C2 00 00 54 C2 00 00 00 00 00 00 ````--------````
0000C228h : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ````````````````
0000C238h : 7F 89 E7 77 4C BC E8 77 00 00 00 00 E6 9F F1 77 --------````----
0000C248h : 1A 38 F1 77 10 40 F1 77 00 00 00 00 4F 1E D8 77 --------````----
0000C258h : 00 00 00 00 00 00 4D 65 73 73 61 67 65 42 6F 78 ``````MessageBox
0000C268h : 41 00 00 00 77 73 70 72 69 6E 74 66 41 00 00 00 A```wsprintfA```
0000C278h : 45 78 69 74 50 72 6F 63 65 73 73 00 00 00 4C 6F ExitProcess```Lo
0000C288h : 61 64 4C 69 62 72 61 72 79 41 00 00 00 00 47 65 adLibraryA````Ge
0000C298h : 74 50 72 6F 63 41 64 64 72 65 73 73 00 00 00 00 tProcAddress````
0000C2A8h : 47 65 74 4F 70 65 6E 46 69 6C 65 4E 61 6D 65 41 GetOpenFileNameA
0000C2B8h : 00 00 55 53 45 52 33 32 2E 64 6C 6C 00 4B 45 52 ``USER32.dll`KER
0000C2C8h : 4E 45 4C 33 32 2E 64 6C 6C 00 63 6F 6D 64 6C 67 NEL32.dll`comdlg
0000C2D8h : 33 32 2E 64 6C 6C 00 00 00 00 00 00 00 00 00 00 32.dll``````````

正如你看到的,这个输入表被分成三个主要部分:

- C1E8h - C237h:IMAGE_IMPORT_DESCRIPTOR 结构部分,对应着每一个需要输入的动态
链接库(DLL)。这部分以关键字 00 结束。

IMAGE_IMPORT_DESCRIPTOR struct
OriginalFirstThunk dd 0 ;原拆分 IAT 的 RVA
TimeDateStamp dd 0 ;没有使用
ForwarderChain dd 0 ;没有使用
Name dd 0 ;DLL 名字符串的 RVA
FirstThunk dd 0 ;IAT 部分的 RVA
IMAGE_IMPORT_DESCRIPTOR ends

- C238h - C25Bh:这部分双字(DWord) 称作“IAT”,由 IMAGE_IMPORT_DESCRIPTOR
结构中的 FirstThunk 部分指明。这部分每一个 DWord 对应一个输入函数。

- C25Ch - C2DDh : 这里是输入函数和 DLL 文件的名称。问题是,这些是没有规定顺序
的:有时候 DLL 文件在函数前面,有时候正好相反,另外一些时候它们混在一起。

输入表的简介
------------

OriginalFirstThunk 是 IAT 的一部分,它是 PE 文件引导时首先要搜索的。如果存在,PE
文件的引导部分将使用它来纠正在 FirstThunk IAT 部分的问题。当调入内存后,FirstThunk
的每一个 Dword (包含有函数名字符串的 RVA),将被 RVA 替换为函数的真实地址(当调用这
些函数时,它们调入内存的位置将被执行)。所以,只要 OriginalFirstThunk 没有被改变,基
本上这里不存在输入表的问题。

下面来看我们的问题
------------------

好了,经过简单描述后,下面来看我们的问题。如果你试图运行包含上面显示的输入表的可
执行文件,它不会被调入,Windows 会显示一个错误信息。为什么?很简单,因为
OriginalFirstThunk 被删除了。事实上,你应该注意到,在这个输入表的每一个IMAGE_IMPORT_DESCRIPTOR 结构,OriginalFirstThunk 的内容都是 00000000h。嗯,所以我们
可以推测出,当我们运行这个可执行程序时,PE 文件的引导部分试图从 FirstThunk 部分获得
输入函数的名字。但是,正象你注意到的,这部分根本没有包含函数名字符串的 RVA,但是函数
地址的 RVA 在内存中。

我们需要怎么做
--------------

现在,为了让这个可执行文件运行,我们需要重建 FirstThunk 部分的内容,让它们指向我
们在输入表第三部分看到的函数名字符串。这不是一项很困难的任务,但是,我们需要知道哪个
IAT 对应哪个函数,而函数字符串和 FirstThunk 内容并不采用同样的存储方法。所以,对于每
一个 IAT,我们需要验证它对应的是哪个函数名(事实上,根据 IMAGE_IMPORT_
DESCRIPTOR.Name DWord 我们已经有了 DLL 名称,这些并没有被改变)。

如何验证每一个函数
------------------

正向我们上面所见到的,在内存中,每一个被破坏的 IAT 都有一个函数地址的 RVA。这些
地址并没有被破坏,所以,我们只要重新找回指向错误 IAT 的函数地址,把它们指向函数名字
符串。
为此,在 Kernel32.dll 中有一个非常有用的 API:GetProcAddress。它允许你得到给定函
数的地址。这里是它的描述:

GetProcAddress(

HMODULE hModule, // DLL 模块的句柄
LPCSTR lpProcName // 函数名
);

所以,对于每一个被破坏的 IAT,在 GetProcAddress 返回我们寻找的函数地址之前,只需
要分析包含在输入表第三部分的所有函数名。

- hModule 参数是 DLL 模块的句柄(也就是说,模块映象在内存中的基址),我们可以通
过 GetModuleHandleA API 得到:

HMODULE GetModuleHandle(
LPCTSTR lpModuleName // 返回模块名地址句柄
);

(lpModuleName 只需要指向我们从 IMAGE_IMPORT_DESCRIPTOR.Name 部分得到的 DLL 文件
名字符串)

- lpProcName 仅指向函数名字符串。

注意,有时候函数是按序号输入的。这些序号是在每个 [ 函数名偏移量-2 ] 处的单字(WORDS)。
所以,你在分析程序时需要检查函数是按名称还是按序号输入的。

使用上面输入表的实例
--------------------

针对上面输入表的例子,我将说明如何修复第一个输入 DLL 的第一个输入函数。

1. 我们来看第一个 IMAGE_IMPORT_DESCRIPTOR 结构部分(C1E8h),.Name 部分(C1E4h,指向
C1BAh)指出了 DLL 名。我们看到,那是 USER32.dll。

2. 我们来看 .FirstThunk 部分,它们指向 IAT 部分;每个对应一个这个 DLL(user32.dll)的
输入函数。在这里是 C1F8h,指向 C238h。所以,在 C238h,我们可以修复被破坏的 IATs。(你
会注意到,这个 IAT 部分包含二个 DWords,所以,这个 DLL 有二个函数输入)

3. 我们得到了第一个被破坏的 IAT。它的值是 77E7897Fh。这是函数在内存中的地址。

4. 对每一个输入表第三部分中的函数,我们调用 GetProcAddress API。当该 API 返回 7E7897Fh
时就意味着,我们到达了正确的函数。所以我们让被破坏的 IAT 指向正确函数名(在本例中为 'wsprintfA')。

5. 现在我们只需要将 IAT 指向:偏移量(函数名字符串)-2。为什么是 -2 ?因为有时候使用了
函数序列。
所以在本例中,我们改变地址 C238h,让它指向 C26Ah(以代替 77E7897Fh)。

6. 就这样,这个函数被修复了,下面你只需要对所有的 IATs 重复这个过程就可以了。

后记
----

我描述的是一般的操作过程。当然只有在 DLLs 被正常调入内存后才能够这样做。对于其他情
况,你需要将它们调入,或者你需要仔细研究它们的输出表才能找到正确的函数地址。

3、IceDump和NticeDump使用

  IceDump和NticeDump是一款配合SoftICE扩展其内存操作的工具,IceDump支持Windows 9x、Windows Millennium系统,NticeDump支持Windows NT/2000。它们的出现,使SoftICE如虎添翼,TRW2000的许多特色功能在SoftICE里也可实现了。

1.Icedump操作简介
  运行IceDump前,首先要确定SoftICE版本号,按Ctrl+D切换到SoftICE下命令:VER,查看版本号。然后在相应SoftICE版本号目录下运行icedump.exe文件,它会调用自身的VXD文件,装载成功出现图7.16所示画面。如果发现SoftICE没运行或版本不符,就拒绝运行。 如果想从内存中卸载它,可以在DOS下键入"icedump u"。

1)/DUMP <起始地址> [<长度> <文件名>]
  抓取内存中的数据到文件里,类似TRW2000中的W命令。<文件名>参数可以指定盘符和路径,当在Ring-0下还原时最好清除还原区域内的全部断点,否则会给SoftICE带来不必要麻烦。(这一点在所有的IceDump命令里都应该值得注意)
在Win32系统下读者可能会想到用/BHRAMA或/PEDUMP从内存内中重建一个可用的PE镜像。请看下面关于/OPTION命令的说明。

注意: IceDump 6.015以前类似的命令是PAGEIN D <address> [<length> <filename>]

2)/LOAD <地址> <长度> <文件名>
  把<文件>指定长度的字节内容调入到内存中的<地址>处。与/DUMP的作用相反,同样需要注意的是不要设置断点。

3)/BHRAMA <Bhrama dumper server 窗口名>
  用Procdump的Bhrama(由G-Rom出品的著名脱壳工具)来初始化dumping。用户必须提供窗口的名称,可以从标题条找到它。为了使工作简单化,可以在winice.dat里设置F3键:
F3="/BHRAMA ProcDump32 - Dumper Server;"

4) /TRACEX <low EIP> [<high EIP>]
  控制跟踪器并退出SoftICE。注意该命令只能用于跟踪当前线程,如果要跟踪其它线程,请使用/TRACE命令。


  /TRACEX <low EIP>: 跟踪当前线程。注意,如果跟踪当前线程弹出SoftICE窗口后想继续跟踪,必须使用/TRACEX命令,否则跟踪器会失去对当前线程的控制。
   当线程的EIP到达<low EIP>时,跟踪停止并弹出SoftICE窗口。这也要求EIP真正可以到达,否则SoftICE不会弹出。


  /TRACEX <low EIP> <high EIP> 跟踪当前线程,注意事项同上。
  当线程的EIP到达<low EIP>与<high EIP>之间的区域内时停止并弹出SoftICE窗口。注意这里没有作<low EIP>和<high EIP>的边界检查,所以错误的参数地址会使SoftICE不能中断。

5) /SCREENDUMP [<文件名>]
  把SoftICE屏幕内容保存到一个文件中。注意该功能只支持通用显示驱动模式。这个命令的用法类似于/DUMP,如果没有指定<文件名>,IceDump将在模式0、1、2、3和4中切换。
  模式1:默认模式,将以ASCII格式输出。
  模式0:字节属性也将被抓取。
  模式2:可以把屏幕内容保存成一个HTML文件。
  模式3:会把屏幕内容保存成LaTeX格式的文件。
  模式4 :把屏幕内容保存为EPS (encapsulated Postscript)格式。

2.NticeDump操作简介
  Nticedump远不如IceDump功能强大,并且Nticedump装载方式不同于IceDump,它是通过给SoftICE打补丁来实现0特权级控制权的,这是因为在Windows 2000上,要切换到0特权级不象Windows9x那么容易了。
  要打补丁的文件是\WINNT\SYSTEM32\DRIVERS\Ntice.sys,在Nticedump目录里有一补丁工具ntid.exe,把安装目录下相应SoftICE版本的Icedump文件与ntid.exe一同复制到\WINNT\SYSTEM32\DRIVERS\目录下,然后运行ntid.exe程序就能正确补丁Ntice.sys。这样Nticedump和SoftICE就完全结合了。

1) 抓取内存数据:PAGEIN D 基地址 长度 文件名
例: PAGEIN D 400000 512 \??\C:\memory.dmp


注意: 在NT输入输出管理系统中,象"C:\memory.dmp"不是合法路径。"\??\C:\filename.dmp"是在C盘根目录下创建"filename.dmp"文件。

2) 抓取进程: PAGEIN B <Bhrama窗口名>
例: PAGEIN B ProcDump32 - Dumper Server

3) 导入文件: PAGEIN L 基地址 长度 文件名
Example: PAGEIN L 400000 512 \??\C:\memory.dmp


4) 帮助: PAGEIN 例: PAGEIN

4、Import REConstructor使用

   Import REConstructor可以从杂乱的IAT中重建一个新的Import表(例如加壳软件等),它可以重建Import表的描述符、IAT和所有的ASCII函数名。用它配合手动脱壳,可以脱UPX、CDilla1、PECompact、PKLite32、Shrinker、ASPack, ASProtect等壳。该工具位于:光盘\tools\PE tools\Rebuilders\Import REConstructor。
在运行Import REConstructor之前,必须满足如下条件:
1) 目标文件己完全被Dump到另一文件;
2) 目标文件必须正在运行中;
3) 事先要找到真正的入口点(OEP);
4) 最好加载IceDump,这样建立的输入表较少存在跨平台的问题。

步骤如下:

(1)找被脱壳的入口点(OEP);
(2)完全Dump目标文件;
(3)运行Import REConstructor和需要脱壳的应用程序;
(4)在Import REConstructor下拉列表框中选择应用程序进程;
(5)在左下角填上应用程序的真正入口点偏移(OEP);
(6)按"IAT AutoSearch"按钮,让其自动检测IAT位置, 出现"Found address which may be in the Original IAT.Try 'Get Import'"对话框,这表示输入的OEP发挥作用了。
(7)按"Get Import"按钮,让其分析IAT结构得到基本信息;
(8)如发现某个DLL显示"valid :NO" ,按"Show Invalids"按钮将分析所有的无效信息,在Imported Function Found栏中点击鼠标右键,选择"Trace Level1 (Disasm)",再按"Show Invalids"按钮。如果成功,可以看到所有的DLL都为"valid:YES"字样;
(9)再次刷新"Show Invalids"按钮查看结果,如仍有无效的地址,继续手动用右键的Level 2或3修复;
(10)如还是出错,可以利用"Invalidate function(s)"、"Delete thunk(s)"、编辑Import表(双击函数)等功能手动修复。
(11)开始修复已脱壳的程序。选择Add new section (缺省是选上的) 来为Dump出来的文件加一个Section(虽然文件比较大,但避免了许多不必要的麻烦) 。
(12)按"Fix Dump"按钮,并选择刚在(2)步Dump出来的文件,在此不必要备份。如修复的文件名是"Dump.exe",它将创建一个"Dump_.exe",此外OEP也被修正。
(13)生成的文件可以跨平台运行。

标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}