日期:2005年1月27日 脱壳人:csjwaman[DFCG]
―――――――――――――――――――――――――――――――――――――――――――
【软件名称】:3dsmax6-keygen
【下载地址】:http://bbs.pediy.com/showthread.php?s=&threadid=10336
【软件限制】:伪Telock
【破解声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【操作系统】:win2k
【破解工具】:OD等传统工具
―――――――――――――――――――――――――――――――――――――――――――
【脱壳过程】:
一、查找入口:
用PEID检测不到。用OD载入,忽略所有异常。
00410C0D FF6424 04 JMP NEAR DWORD PTR SS:[ESP+4]
00410C11 00F9 ADD CL,BH
00410C13 >^ E9 E8E3FFFF JMP 3dsmax6-.0040F000/////停在这里。
00410C18 0000 ADD BYTE PTR DS:[EAX],AL
00410C1A 0000 ADD BYTE PTR DS:[EAX],AL
SHIFT+F9,运行程序后到0040F000处看看:
0040F000 - E9 9D45FFFF JMP 3dsmax6-.004035A2/////004035A2就是OEP。
0040F005 0000 ADD BYTE PTR DS:[EAX],AL
0040F007 0000 ADD BYTE PTR DS:[EAX],AL
0040F009 0000 ADD BYTE PTR DS:[EAX],AL
0040F00B 0000 ADD BYTE PTR DS:[EAX],AL
0040F00D 0000 ADD BYTE PTR DS:[EAX],AL
0040F00F 0000 ADD BYTE PTR DS:[EAX],AL
0040F011 0000 ADD BYTE PTR DS:[EAX],AL
估计是Telock 修改版。
二、修复IAT:
重新载入程序,ALT+M打开内存镜像,在区段40E000处下内存访问断点,然后SHIFT+F9,断在:
004100BD F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>////断在这里。
004100BF 8BCB MOV ECX,EBX
004100C1 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
004100C3 8BF2 MOV ESI,EDX
取消内存断点,然后在区段401000处下内存访问断点,SHIFT+F9,直接断在入口处:
004035A2 6A 60 PUSH 60////断在这里。DUMP出来。
004035A4 68 20814000 PUSH 3dsmax6-.00408120
004035A9 E8 DA270000 CALL 3dsmax6-.00405D88
004035AE BF 94000000 MOV EDI,94
004035B3 8BC7 MOV EAX,EDI
004035B5 E8 26280000 CALL 3dsmax6-.00405DE0
004035BA 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
004035BD 8BF4 MOV ESI,ESP
004035BF 893E MOV DWORD PTR DS:[ESI],EDI
004035C1 56 PUSH ESI
004035C2 FF15 40804000 CALL NEAR DWORD PTR DS:[408040]////408040处应该是IAT地址。
004035C8 8B4E 10 MOV ECX,DWORD PTR DS:[ESI+10]
004035CB 890D F4BA4000 MOV DWORD PTR DS:[40BAF4],ECX
004035D1 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4]
004035D4 A3 00BB4000 MOV DWORD PTR DS:[40BB00],EAX
004035D9 8B56 08 MOV EDX,DWORD PTR DS:[ESI+8]
004035DC 8915 04BB4000 MOV DWORD PTR DS:[40BB04],EDX
004035E2 8B76 0C MOV ESI,DWORD PTR DS:[ESI+C]
004035E5 81E6 FF7F0000 AND ESI,7FFF
004035EB 8935 F8BA4000 MOV DWORD PTR DS:[40BAF8],ESI
004035F1 83F9 02 CMP ECX,2
004035F4 74 0C JE SHORT 3dsmax6-.00403602
取消内存断点,到内存408040处看看:
00408040 74 01 8C 00 83 01 8C 00 t???
上下有许多8CXXXX之类的地址。先到8C0174处:
008C0174 /EB 01 JMP SHORT 008C0177////在这里下内存访问断点。
008C0176 |66:40 INC AX///有花指令。
008C0178 2BC7 SUB EAX,EDI
008C017A B8 6A088C00 MOV EAX,8C086A
008C017F 40 INC EAX
008C0180 FF30 PUSH DWORD PTR DS:[EAX]
008C0182 C3 RETN
F9运行程序,断下后跟踪一下。F7后:
008C0177 40 INC EAX
008C0178 2BC7 SUB EAX,EDI
008C017A B8 6A088C00 MOV EAX,8C086A
008C017F 40 INC EAX////EAX=8C086B
008C0180 FF30 PUSH DWORD PTR DS:[EAX] ; kernel32.GetVersionExA////F7到这里后出现API名,[EAX]中就是API,可见00408040处就是跳转表。
008C0182 C3 RETN
再回到内存00408040处上下看看:
00408000 00 00 8C 00 0F 00 8C 00 ..?.?
00408008 1E 00 8C 00 2F 00 8C 00 .?/.?
。。。。。。
004080C8 7A 04 8C 00 8B 04 8C 00 z???
004080D0 00 00 8B 00 0F 00 8B 00 ..?.?
004080D8 1E 00 8B 00 2F 00 8B 00 .?/.?
004080E0 3E 00 8B 00 63 00 8B 00 >.?c.?
004080E8 71 00 8B 00 80 00 8B 00 q.???
004080F0 A5 00 8B 00 00 00 00 00 ??....
可知IAT大小为F4
再到内存8C086B处看看:
008C0823 00 00 00 00 00 00 00 00 ........
008C082B C4 20 E6 77 43 3D E6 77 ?骥C=骥
008C0833 0E 8A E7 77 8B 6C F9 77 ?w??
008C083B 5A CC FC 77 AF 3A E6 77 Z厅w?骥
008C0843 3E 3F E6 77 71 3A E6 77 >?骥q:骥
008C084B FA 48 E6 77 7B 3A E6 77 ?骥{:骥
008C0853 7D 0E E7 77 EF C0 FC 77 }琪锢?
008C085B 44 C6 FC 77 FC 3D E6 77 D泣w?骥
008C0863 DE FB E6 77 03 FB E6 77 摞骥?w
008C086B C7 A5 E6 77 0C 4F E6 77 钎骥.O骥
008C0873 B1 4E E6 77 64 4E E6 77 蔽骥dN骥
008C087B B9 4D E6 77 E3 5E F8 77 雇骥戕?
008C0883 CC C3 E7 77 2D 54 E6 77 堂琪-T骥
008C088B 7E 4C E6 77 9D 3A E6 77 ~L骥?骥
008C0893 C4 51 E6 77 BB D7 E7 77 难骥蛔琪
008C089B FE 9B E6 77 CD 61 E6 77 ?骥歪骥
008C08A3 AB 3A E6 77 F3 37 E6 77 ?骥?骥
008C08AB 09 FB E6 77 D0 41 E6 77 .?w辛骥
008C08B3 18 AA E7 77 17 64 E6 77 ?wd骥
008C08BB 42 69 E7 77 17 64 E6 77 Bi琪d骥
008C08C3 9D 63 E6 77 D1 3E E6 77 ?骥?骥
008C08CB 43 87 E6 77 29 76 E6 77 C?w)v骥
008C08D3 C7 FA E6 77 53 A4 E6 77 曲骥Sゆw
008C08DB 5C 6A E6 77 A4 9B E6 77 \j骥?骥
008C08E3 FB 68 E6 77 E6 3E E6 77 ?骥?骥
008C08EB 82 6C E6 77 03 44 E6 77 ?骥D骥
008C08F3 18 86 E6 77 00 00 00 00 ?w....
008C08FB 00 00 00 00 00 00 00 00 ........
这就是IAT。把8C082B-8C08F6处大小为CC的数据DUMP下来粘贴到DUMP出来的文件408000处。但这样还差F4-CC=28大小的数据(也就是还有10个API)没找到。再回到跳转表处看看,可以发现这10个API正是从4080D0开始调用的。那么我们就在4080D-4080F3处下内存访问断点。F9运行后断在:
00401033 FF15 EC804000 CALL NEAR DWORD PTR DS:[4080EC]///第一次断在这里。F7进入。
00401039 6A 01 PUSH 1
0040103B FF15 28804000 CALL NEAR DWORD PTR DS:[408028]
00401041 8BE5 MOV ESP,EBP
00401043 5D POP EBP
00401044 C2 1000 RETN 10
00401047 55 PUSH EBP
进入后F7几次后来到:
008B009A 40 INC EAX
008B009B 40 INC EAX
008B009C B8 63018B00 MOV EAX,8B0163
008B00A1 40 INC EAX
008B00A2 FF30 PUSH DWORD PTR DS:[EAX] ; user32.DialogBoxParamA////出现API名了。此时EAX=8B0164。
008B00A4 C3 RETN
到内存8B0164处看看:
008B0148 3B 47 E0 77 19 47 E0 77 ;G圜G圜
008B0150 8A 58 DF 77 47 3C DF 77 ?喵G<喵
008B0158 C1 95 DF 77 DA 5F DF 77 ?喵谶喵
008B0160 5D 7E E0 77 3C 85 E0 77 ]~圜<?w
呵呵,这里有8个API呢!把这8个地址粘贴到DUMP文件的4080D0处,还有2个没找可能是垃圾。
现在用LORDPE打开DUMP文件,看到输入表在10C22处。
重新载入程序,来到入口后,运行ImportRECv1.42+,设置选项“建立新输入表”,找到进程,OEP处填入35A2,RVA处填入4C082B,大小CC,然后搜索。搜索完成后,再搜索一次,RVA处填入4B0148,大小20。两次搜索完成后,把“增加新块”前的钩去掉,新输入表信息的RVA填入10C22,最后修复DUMP文件。
至此,可以正常运行。还可以优化一下大小。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法