|
| 软件名称: 幼儿拼图识物 下载地址: http://yingjia.hostrocket.com/jigsaw/index.htm 软件大小: 2.6 MB 软件语言: 中文 软件类别: 国内软件 / 共享版 应用平台: Win9x/NT/2000/XP 软件简介: 通过这个软件不仅可以锻炼孩子的观察力、耐性、记忆力,而且还可以了解更多的事物。适合于3到10岁的儿童使用。 调试环境: Win2003、OllyDBG、PEiD、LordPE、ImportREC 破文作者: linex 作者声明: 只是感兴趣,没有其他目的,失误之处请大侠多多赐教。由于ARM脱文较多,从略,要点在后面脱壳后的输入表修复。 破解过程:
一、寻找OEP和DUMP进程
下断BP WaitForDebugEvent,断下后堆栈如下:
0012DAA8 004E1DD7 /CALL 到 WaitForDebugEvent 来自 jigsaw.004E1DD1
0012DAAC 0012EB84 |pDebugEvent = 0012EB84
0012DAB0 000003E8 \Timeout = 1000. ms
再BP WriteProcessMemory
经过一个对话框后是:
0012EB8C E4 0E 00 00 01 00 00 80 ?....€
0012EB94 00 00 00 00 00 00 00 00 ........
0012EB9C EC F7 4A 00 02 00 00 00 祺J....
0012EBA4 00 00 00 00 EC F7 4A 00 ....祺J.
故oep=004AF7EC
ALT+F9返回,搜索所有命令“or eax,FFFFFFF8”,向上找到这里:
004E23FA > \83BD D0F5FFFF>CMP DWORD PTR SS:[EBP-A30],0 //清0
004E2401 . 0F8C A9020000 JL jigsaw.004E26B0
004E2407 . 8B8D D0F5FFFF MOV ECX,DWORD PTR SS:[EBP-A30]
004E240D . 3B0D BCE75000 CMP ECX,DWORD PTR DS:[50E7BC]
004E2413 . 0F8D 97020000 JGE jigsaw.004E26B0
……
004E24CD . 25 FF000000 AND EAX,0FF //这里开始PATCH
004E24D2 . 85C0 TEST EAX,EAX
补丁代码为:
004E24CD FF85 D0F5FFFF INC DWORD PTR SS:[EBP-A30]
004E24D3 C705 C0E75000>MOV DWORD PTR DS:[50E7C0],1
004E24DD ^ E9 18FFFFFF JMP jigsaw1.004E23FA
在4E26B0下断后,运行,DUMP
二、IAT修复:
将DUMP出来的程序OEP改为AF7EC,然后用OD载入,跟踪几步就可以找到IAT
00401278 - FF25 28824B00 JMP DWORD PTR DS:[4B8228]
0040127E 8BC0 MOV EAX,EAX
00401280 - FF25 24824B00 JMP DWORD PTR DS:[4B8224]
00401286 8BC0 MOV EAX,EAX
00401288 - FF25 20824B00 JMP DWORD PTR DS:[4B8220]
IAT地址4B817C,RVA=B817C
重新载入主程序,BP DebugActiveProcess 中断后看堆栈:
0012DAC4 004C1BDB /CALL 到 DebugActiveProcess 来自 jigsaw.004C1BD5
0012DAC8 00000F2C \ProcessId = F2C
新开一个OllyDbg,附加进程ID F2C的子进程(每次子进程ID会不同)F9,再F12,会暂停在EP处:
004AF7EC >- EB FE JMP SHORT dumped_.004AF7EC //改为 55 8B
004AF7EE EC IN AL,DX
004AF7EF 83C4 EC ADD ESP,-14
用脚本转成单进程(这脚本不错,很方便用,转自看雪csjwaman的文章)
//转单进程脚本
msg "请忽略所有异常,并添加忽略C000001E异常,然后运行本脚本!"
gpa "OpenMutexA","kernel32.dll"
bp $RESULT
esto
exec
pushad
pushfd
push edx
xor eax,eax
push eax
push eax
call kernel32.CreateMutexA
popfd
popad
jmp kernel32.OpenMutexA
ende
bc eip
msg "现已转换成单进程!"
ret
下面F9一下,出现对话框时HE GetModuleHandleA, 再点确定,Shift+F9运行一下,断下后修改魔术跳转
00CA97CD 8B0D C04CCD00 MOV ECX,DWORD PTR DS:[CD4CC0]
00CA97D3 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00CA97D6 A1 C04CCD00 MOV EAX,DWORD PTR DS:[CD4CC0]
00CA97DB 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00CA97DE 75 16 JNZ SHORT 00CA97F6
00CA97E0 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00CA97E6 50 PUSH EAX
00CA97E7 FF15 D0B0CC00 CALL DWORD PTR DS:[CCB0D0] ; kernel32.LoadLibraryA
00CA97ED 8B0D C04CCD00 MOV ECX,DWORD PTR DS:[CD4CC0]
00CA97F3 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00CA97F6 A1 C04CCD00 MOV EAX,DWORD PTR DS:[CD4CC0]
00CA97FB 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00CA97FE 0F84 AD000000 JE 00CA98B1 //修改这里为JMP
F9运行,异常暂停
用IMR修复一下IAT ,RVA=B817C,Size=1000,Oep=F7EC,剪去无效指针后得到IAT表,然后保存树文件(下面要用到)修复DUMP。
三、修复
运行后出现错误,跟踪了一下,运行到这里出错,
004A69FC - FF25 7C884B00 JMP DWORD PTR DS:[4B887C]
004B886C 00CAA6CA
004B8870 774EEA5C ole32.CoCreateGuid
004B8874 774ED78D ole32.StringFromGUID2
004B8878 00CAA742
004B887C 00CC6ED5//这里
004B8880 00CC7184//还有这里,两个函数指针不正确
004B8884 00CAA73D
004B8888 6E72656B
004B888C 32336C65
004B8890 6C6C642E
按第二步重来一次,修改完魔术跳转后不取消GetModuleHandleA断点,数据窗口定位到004B8870,
不断按F9直到写入输入表指针004B8870 完成,但004B887C未写入指针时停下,
此时按Alt+M,打开内存窗口,搜索字串CoCreateGuid会找到写输入表用到的函数名,
可以找到两个函数Environ和ExpireCurrentKey,这两个指针是调用ArmAccess.dll的两个函数,
我以前装过 Armadillo4,于是把ArmAccess.dll复制到文件所在目录
00D7B9E9 00 00 00 43 6F 43 72 65 61 74 65 47 75 69 64 00 ...CoCreateGuid.
00D7B9F9 53 74 72 69 6E 67 46 72 6F 6D 47 55 49 44 32 00 StringFromGUID2.
00D7BA09 00 61 72 6D 61 63 63 65 73 73 2E 64 6C 6C 00 7C .armaccess.dll.|
00D7BA19 88 0B 00 02 00 00 00 45 6E 76 69 72 6F 6E 00 45 ?....Environ.E
00D7BA29 78 70 69 72 65 43 75 72 72 65 6E 74 4B 65 79 00 xpireCurrentKey.
用记事本打开以前保存的IAT文件,在最后添上两个指针名,重新载入树文件,再修复转储文件,OK了。
FThunk: 000B887C NbFunc: 00000002
1 000B887C ArmAccess.dll 0011 Environ
1 000B8880 ArmAccess.dll 0144 ExpireCurrentKey
附件下载:http://www.unpack.cn/viewthread.php?tid=3034 |