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加壳的软件,用我的方法都可以成功脱壳。
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命令之后)。
