• 标 题:手动脱ASPack2.12加壳的DLL文件
  • 作 者:popo123456
  • 时 间:004-07-25,17:47
  • 链 接:http://bbs.pediy.com

手动脱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块都存在,如果有一个不存在,那就要用第二种方法了,不对的地方敬请指出。