手动脱ASPack2.12加壳的DLL文件
发表于:
2004-7-25 17:47
6624
手动脱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块都存在,如果有一个不存在,那就要用第二种方法了,不对的地方敬请指出。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!