飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2769|回复: 2

脱用UPX加壳的EXE及DLL文件之雕虫小技

[复制链接]

该用户从未签到

发表于 2005-5-14 18:31:58 | 显示全部楼层 |阅读模式
本文对读者的一点点小小的要求:  

你可以阅读和传播本文章,并可对文章的内容作任何类型的修改,甚至可以将心得体会重心整理发布,更可以直接针对某一个特定的文件进行理论):

首先让我们要先准备如下几种工具(以下工具均可找到最新免费或破解版本,别问我下载地址):
1.Procdump
2.Ultraedit (这个你也可以用别的编辑器)
3.Winsoftice
4.Trw
5.MakePE
6.Wdasm

好了!工具都准备齐全了,我们就去搞一个实验品吧!今次我们选的是UPX ,在Procdump的脱壳文件列表中,你可以清楚地看到有 UPX 的选项,所以我们今天就选它了。好了,下载完毕,我们先用它来为软件加一个脱吧!
操作:

1. 在 windows 上打开一个 Dos 窗口 , 进入 UPX 所在的目录;
2. 输入 upx  [ 要加壳的文件路径和文件名 ]
3.OK! 加壳成功了!

嘿嘿,好了,现在可以再试一试脱壳了!
操作:

1. 运行 Procdump ;
2. 按 Unpack 按钮,这时就出现了 Choose Unpacker 窗口;
3. 在窗口中选择 UPX ,这时就会跳出一个选择你要脱壳文件的选择窗口;
4. 按下打开,哦天啊!好痛苦啊!程序没有脱壳竟然运行了, Procdump提示一个错
误发生在 script 的第一行。

以上的所有操作,是对自动脱壳来说的,基本上的自动脱壳的操作都是这样的。好了,难道就这样没有戏唱了吗?作者写文章那会就写这几十行废话呢?请接着看下面的吧! 好了,看一看它没有没防住 winsoftice 呢?重新启动机器,换一个有安装 winsoftice 的 windows 平台 吧!再次运行被加脱了的程序,还好!没有当掉 winsoftice ,这样心中暗喜,你有难了啊!看来外国人写的东西还是比较友善,不象 Ding Boy 的幻影系列,比小燕子还凶,加了两重,气死本帅,嘿,又说 Ding Boy 的坏话了,其实有时我觉得他比较象 Crack 界的小燕子,令人又爱又恨。好了关闭程序,用 winsoftice 载入去,唉刚刚还说好呢!原来它还是对 winsoftice 作了一点小动作, winsoftice 不能中断于程序的入口的第一句处。没有关系,现在有三种方法,第一种方法是通过对程序的.exe or .dll 文件作一点修改, 使其符合标准的 PE 文件格式,因为 winsoftice 毕竟不是专为 Crack 设计的,所以它的中断程序入口 是针对标准的 PE 文件格式来写的,对于那些不符合的,它就没有能力了,具体的 PE 文件格式,大家可以看一看 VC 中的 MSDN 中的帮助和 WINNT.H 中的解释;第二种方法就是不用 winsoftice ,而用 TRW ,因为刘涛涛先生的 TRW 是专为 Crack 设计的,所以几乎所有可以在 Windows 上运行的程序,它 都可以中断得了;第三种方法,就是在原 .exe or .dll 文件中加插 int 3 语句,令 winsoftice 强行中断。   好了,方法说了一大罗,我们就用最简单的方法吧!没人会有简单的不用,去用最繁的,如果有吧!大家就......

运行 TRW,选择菜单中的 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           跳到解压程序
137: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]

好了,准备功夫我们都做好了,现在可以写 UPX 的脱壳扩展了,首先我们可以见到程序有两个跳动的地方,第一个是:
0137:0043D110  JMP       0043D122           跳到解压程序
所以我们马上把机器代码抄下来:
EB,10
第二个是:
0137:0043D255  E9D6A1FDFF    JMP       00417430         这就是程序的真正入口了
机器代码就是:
E9,D6,A1,FD,FF
好了,所有的要找到东西我们都已经找到了,我们就开始编写 UPX 的脱壳扩展了。

我编写的具体如下:
[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                                    ; 一步一步地跟踪分析程式

好了,以上的解释都很清楚了,没有什么不明白了,我们把文件保存后,再次运行 Procdump, 在 Choose Unpacker 中可以见到多了一个 UPX0.7X-0.8X 项了,选择它,进行脱我们加了脱的程序, 哈哈,叫我们保存了,你可以不要高兴得太早了,你试一试运行 dump 程序,哦不能运行,非法操作。 不要心急,我们好象还有点东西要加上呢!那就是 dump 的可选参数了, Procdump 一共给我们 提供了五组可选参数,如果你没有特别指出,就用默认值。好,我们加上去试一试吧!
OPTL1=00000000
OPTL2=01010001
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

  以上这五参数是最常用的,你加参数时可要先试试,或者加了之后就可以用了,好我们加上,试一试。
以下文章所述,可能在有的机器上有不同的结果,请自行修正:

作者的机器是:
PIII 667
128M 内存

当我再次运行 Procdump 来脱壳程序时,竟然程序一下子就运行了,根本不象上次那样提示要我保存 脱壳后的文件,所以我想,可能这些参数有些不合适我的机器,于是我认真分析了每一个参数的真正含义之后,就把参数作了如下的修改:
OPTL1=00000001         这是延迟时间,我设为 1ms  
OPTL2=01010101         采用了快速 dump 的工作方式
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000

今次再运行 Procdump 进行脱壳,哈哈!!!可以脱了,然后再双击脱壳后的文件,咦,可以执行了, 再用 Wdasm 反汇编分析一下文件,发现基本和原文件相同,只是文件大小有点不同,大了一点,再用了一下软件的各种功能,一切正常,所以应该说脱壳是成功的,到此,文章也该在此结束了,不过好象还漏了点事,就是用 MakePe 帮助脱壳后的文件作进一步的优化,这就不一一描述了 ,自己看帮助进 行吧! 好了,最后总结一下吧!
完整地加入:
[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

最后说了,魔术再高明也看得出门道,但看门道的就看,看热闹的也可以看!
PYG19周年生日快乐!
filandcome 该用户已被删除
发表于 2005-6-24 08:25:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-1-6 14:28
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2005-6-29 22:44:47 | 显示全部楼层
    学习学习
    偶很爱破解但是现在不会
    我想不会很久的```呵呵
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表