首页
社区
课程
招聘
手动脱ASPack2.12加壳的DLL文件
发表于: 2004-7-25 17:47 6625

手动脱ASPack2.12加壳的DLL文件

2004-7-25 17:47
6625

手动脱ASPack2.12加壳的DLL文件

    前一段时间曾经写过一篇关于脱ASPack2.12加壳的DLL文件,但由于不便说明的原因删掉了,故此再写一篇,以弥补。其实道理上是一样的。欢迎和我探讨,E-mail:popo1000@yeah.net,ncdx2011@163.com

破解工具:Softice4.05,icedump 6.0.2.5,Lordpe,PEditor,UltraEdit

破解对象:win_32_cj.dll(一个游戏外挂的库文件)

   关于DLL文件脱壳其实和EXE文件道理一样,就是多了一个重定位表,脱壳步骤和EXE一样,分以下几个步骤:

1.查看加壳文件的基本信息:

用PEditor打开win_32_cj.dll,得到如下信息:

再查看各块的数据如下:

因为后边我们要修复输入表与重定位表,故此需要注意idata与reloc的Virtual offet分别为EC000和F0000.

2.找真正的入口点并抓取镜像文件

  现在用Ctrl+D呼出Softice,下断点bpint 3,然后按F5回到WINDOWS,此时打开Lordpe,点击“Break&Enter”按纽,选取win_32_cj.dll,中断如下:

**************************************************************************

016F:00C70000 90 NOP -

016F:00C70001 CC INT 3 <========中断在这里,要把此处的CC改为原来的60

016F:00C70002 E803000000 CALL 00C7000A  <=======要按F8跟进

016F:00C70007 E9EB045D45 JMP 462404F7

016F:00C7000C 55 PUSH EBP

016F:00C7000D C3 RET

016F:00C7000E E801000000 CALL 00C70014  <=======要按F8跟进

016F:00C70013 EB5D JMP 00C70072

016F:00C70015 BBEDFFFFFF MOV EBX,FFFFFFED  <======在这以后就不必按F8了

...............

**************************************************************************

在中断处(016F:00C70001 CC INT 3)用eb eip 60命令来把CC改为原来的60;此处EIP为:00C70001,而不是400000+110001=510001,这说明加载的win_32_cj.dll的基址不是400000,那此时的基址是多少呢?简单计算可以得到:C70001-110001=B60000。

往下跟踪过程中为了得到刚刚解压过的输入表与重定位表,还需要计算它们的虚拟地址,idata段VA是:EC000+B60000=C4C000,reloc段VA是:F0000+B60000=C50000,用D C4C000查看现在的idata段情况是一堆乱码(当然了,还没有解压吗!),先不管它,跟踪时注意这一部分的变化就可以了。

对于上边的两个CALL要按F8跟进(若按F10程序就直接执行了),直到016F:00C70015,就可以改为按F10了,然后是一系列条件、无条件转跳及循环指令,要跳出这些指令,需要一点技巧,方法如下:

(选自:看雪,《加密与解密--软件保护技术及完全解决方案》,第一版,电子工业出版社,P251)

***************************************

aaaaaaaa 指令1

........

wwwwwwww 指令2

xxxxxxxx JNZ zzzzzzzz

yyyyyyyy JMP aaaaaaaa  ;<---循环返回到aaaaaaaa

zzzzzzzz 指令3

若跟踪时,将转跳到aaaaaaaa处多次,可将光标移到zzzzzzzz一行,按F7让指令直接跳到此处,省去不少时间。

*****************************************

运用此技巧跟踪,来到:

*****************************************

................

016F:00C7019D 83C608 ADD ESI,08

016F:00C701A0 833E00 CMP DWORD PTR [ESI],00

016F:00C701A3 0F851EFFFFFF JNZ 00C700C7<======此处转跳若干次,用上边的技巧,直接到016F:034721A9

016F:00C701A9 6800800000 PUSH 00008000 <======到此处后,idata与reloc段出来了

................

*****************************************

现在文件完全解压,是抓取镜像文件的最好时机,下命令:/dump B60000 113000 F:\1.dll

然后往下接着跟踪,找真正入口点,最后来到:

*****************************************

....................

016F:00C703AF 61 POPAD  <=====在跟踪时发现POPAD或POPFD,要小心,一般入口点就在附近

016F:00C703B0 7508 JNZ 00C703BA <=====此处跳转

016F:00C703B2 B801000000 MOV EAX,00000001

016F:00C703B7 C20C00 RET 000C

016F:00C703BA 6850B8C300 PUSH 00C3B850 <=====00C3B850就是真正的入口点

016F:00C703BF C3 RET

016F:00C703C0 8B8526040000 MOV EAX,[EBP+00000426]

...................

*****************************************

3.修复镜像文件

  1)入口点

  然后回到WINDOWS,用PEditor打开抓取的文件1.dll,选择“section”,点击右键,选则"dumpfixer"完成RVA,SIZE转换,关闭PEditor.用Lordpe打开1.dll,修改文件的入口点为00C3B850-B60000=DB850,然后保存.

  2)输入表和重定位表

  由于我们抓取的时机得当,外壳没有破坏输入表和重定位表,只需要找到它们的地址即可。找它们的地址有两种方法,第一种:就是输入表的地址就是原来idata块的Virtual offet,重定位表的地址就是原来reloc块的Virtual offet,(这种方法适用于抓取的时机必须得当并且idata块和reloc块都存在,也就是各块刚解压完毕的时候),第二种方法就是《加密与解密》上介绍的。为此用点击Lordpe上的“Directories”按钮,修改输入表的地址为:EC000,重定位表的地址为:F0000,大小为:B504,然后保存。这样脱壳完毕,脱壳的后的文件可跨系统运行!

注:关于输入表与重定位表的地址,第一种方法是本人脱了若干个ASPack2.12的壳后发现的规律,只食用于加壳后idata块和reloc块都存在,如果有一个不存在,那就要用第二种方法了,不对的地方敬请指出。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
DLL脱壳后重定位表 的大小要确定吧?
2004-7-25 18:27
0
雪    币: 241
活跃值: (175)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
最初由 fly 发布
DLL脱壳后重定位表 的大小要确定吧?


呵呵,就是就是,忘写了,已经改过来了。
2004-7-26 08:21
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
最初由 fly 发布
DLL脱壳后重定位表 的大小要确定吧?

如果你的系统loader根据size装载就得要了:D
2004-7-26 08:26
0
雪    币: 298
活跃值: (512)
能力值: ( LV12,RANK:490 )
在线值:
发帖
回帖
粉丝
5
最初由 fly 发布
DLL脱壳后重定位表 的大小要确定吧?

对 输入表可以填大点 ,但重定位表一定要有,不然肯定不能运行
2004-7-30 09:53
0
游客
登录 | 注册 方可回帖
返回
//