下载页面: http://www.enterbrain.co.jp/digifami/
软件大小: 27.6 M
软件简介: 日本的rpg游戏。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg V1.10、PEiD、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脱壳过程】:
感觉ASProtect V2.0比ASProtect V1.31 build 06.14要简单,是作者加壳时没有使用最强选项?还是Alexey Solodovnikov放水?不得知了。至少RPGXP.exe没有Stolen Code,没有自校验,也没有IAT混乱,简直比ASProtect V1.23RC4还简单。
最近比较烦,一直没时间看壳。
入秋了,酷暑已然消亡。今夜月圆,夜凉如水,秋高气爽。心情也好了不少。
朋友让看看这个程序,所以在这深夜凌晨静下心来脱这个壳。
近来写脱壳教程的朋友少了,略记过程,聊以充数,各位兄弟见笑了。
另外:程序是朋友传给我的,不懂日语,不知道EXE在其主页上的下载地址。
―――――――――――――――――――――――――――――――――
一、壳代码解压
老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。
设置:事件->标记首先暂停在->系统断点
因为程序的支持文件rgss100j.dll(\WINDOWS\System32\目录下)加了多层壳,其里面也是ASProtect壳,所以我们设置Ollydbg忽略除所有的异常选项。
77F7F571 C3 retn
//进入OD后暂停在系统断点
Shift+F9,程序加载rgss100j.dll后弹出入口点警告,点“否”。
如果你在这里就弹出“Debugger detected”,Game Over的话,请清除所有的UDD文件,然后按上面的步骤重新来过。
00401000 68 01106500 push RPGXP.00651001
//暂停在EXE的壳入口处
00401005 E8 01000000 call RPGXP.0040100B
0040100A C3 retn
下断:HE GetModuleHandleA
Shift+F9,中断2次后,就可以取消断点,Alt+F9返回044994AC了。
看过《用Ollydbg手脱ASProtect V1.23RC4加壳的DLL》的朋友应该熟悉下面的代码了。
这段代码采用了ASPack引擎,解压出壳代码。
Ctrl+F9 执行到返回。
044994A6 FF95 EC314400 call dword ptr ss:[ebp+4431EC]
044994AC 85C0 test eax,eax ; kernel32.77E40000
//返回这里
044994AE 75 07 jnz short 044994B7
044994B0 53 push ebx
044994B1 FF95 F0314400 call dword ptr ss:[ebp+4431F0]
044994B7 8985 4D294400 mov dword ptr ss:[ebp+44294D],eax
044994BD C785 51294400 00000>mov dword ptr ss:[ebp+442951],0
044994C7 8B95 D8304400 mov edx,dword ptr ss:[ebp+4430D8]
044994CD 8B06 mov eax,dword ptr ds:[esi]
044994CF 85C0 test eax,eax
044994D1 75 03 jnz short 044994D6
044994D3 8B46 10 mov eax,dword ptr ds:[esi+10]
044994D6 03C2 add eax,edx
044994D8 0385 51294400 add eax,dword ptr ss:[ebp+442951]
044994DE 8B18 mov ebx,dword ptr ds:[eax]
044994E0 8B7E 10 mov edi,dword ptr ds:[esi+10]
044994E3 03FA add edi,edx
044994E5 03BD 51294400 add edi,dword ptr ss:[ebp+442951]
044994EB 85DB test ebx,ebx
044994ED 0F84 A2000000 je 04499595
044994F3 F7C3 00000080 test ebx,80000000
044994F9 75 04 jnz short 044994FF
044994FB 03DA add ebx,edx
044994FD 43 inc ebx
044994FE 43 inc ebx
044994FF 53 push ebx
04499500 81E3 FFFFFF7F and ebx,7FFFFFFF
04499506 53 push ebx
04499507 FFB5 4D294400 push dword ptr ss:[ebp+44294D]
0449950D FF95 E8314400 call dword ptr ss:[ebp+4431E8]
04499513 85C0 test eax,eax
04499515 5B pop ebx
04499516 75 6F jnz short 04499587
04499518 F7C3 00000080 test ebx,80000000
0449951E 75 19 jnz short 04499539
04499520 57 push edi
04499521 8B46 0C mov eax,dword ptr ds:[esi+C]
04499524 0385 D8304400 add eax,dword ptr ss:[ebp+4430D8]
0449952A 50 push eax
0449952B 53 push ebx
0449952C 8D85 53314400 lea eax,dword ptr ss:[ebp+443153]
04499532 50 push eax
04499533 57 push edi
04499534 E9 99000000 jmp 044995D2
04499539 81E3 FFFFFF7F and ebx,7FFFFFFF
0449953F 8B85 DC304400 mov eax,dword ptr ss:[ebp+4430DC]
04499545 3985 4D294400 cmp dword ptr ss:[ebp+44294D],eax
0449954B 75 24 jnz short 04499571
0449954D 57 push edi
0449954E 8BD3 mov edx,ebx
04499550 4A dec edx
04499551 C1E2 02 shl edx,2
04499554 8B9D 4D294400 mov ebx,dword ptr ss:[ebp+44294D]
0449955A 8B7B 3C mov edi,dword ptr ds:[ebx+3C]
0449955D 8B7C3B 78 mov edi,dword ptr ds:[ebx+edi+78]
04499561 035C3B 1C add ebx,dword ptr ds:[ebx+edi+1C]
04499565 8B0413 mov eax,dword ptr ds:[ebx+edx]
04499568 0385 4D294400 add eax,dword ptr ss:[ebp+44294D]
0449956E 5F pop edi
0449956F EB 16 jmp short 04499587
04499571 57 push edi
04499572 8B46 0C mov eax,dword ptr ds:[esi+C]
04499575 0385 D8304400 add eax,dword ptr ss:[ebp+4430D8]
0449957B 50 push eax
0449957C 53 push ebx
0449957D 8D85 A4314400 lea eax,dword ptr ss:[ebp+4431A4]
04499583 50 push eax
04499584 57 push edi
04499585 EB 4B jmp short 044995D2
04499587 8907 mov dword ptr ds:[edi],eax
04499589 8385 51294400 04 add dword ptr ss:[ebp+442951],4
04499590 E9 32FFFFFF jmp 044994C7
04499595 8906 mov dword ptr ds:[esi],eax
04499597 8946 0C mov dword ptr ds:[esi+C],eax
0449959A 8946 10 mov dword ptr ds:[esi+10],eax
0449959D 83C6 14 add esi,14
044995A0 8B95 D8304400 mov edx,dword ptr ss:[ebp+4430D8]
044995A6 E9 EBFEFFFF jmp 04499496
044995AB 8B85 652A4400 mov eax,dword ptr ss:[ebp+442A65]
044995B1 50 push eax
044995B2 0385 D8304400 add eax,dword ptr ss:[ebp+4430D8]
044995B8 5B pop ebx
044995B9 0BDB or ebx,ebx
044995BB 8985 112F4400 mov dword ptr ss:[ebp+442F11],eax
044995C1 61 popad
044995C2 75 08 jnz short 044995CC
044995C4 B8 01000000 mov eax,1
044995C9 C2 0C00 retn 0C
044995CC 68 4C1D4904 push 4491D4C
044995D1 C3 retn
//执行到返回至这里
―――――――――――――――――――――――――――――――――
二、避开IAT加密
现在壳代码已经解压完毕了。
Ctrl+S 搜索命令序列:
mov edx,dword ptr ss:[ebp+C]
mov edx,dword ptr ds:[edx]
mov dword ptr ds:[edx],eax
共找到4处,全部下断。
044858CF 8B55 0C mov edx,dword ptr ss:[ebp+C]
044858D2 8B12 mov edx,dword ptr ds:[edx]
044858D4 8902 mov dword ptr ds:[edx],eax
//需要修改
0448593F 8B55 0C mov edx,dword ptr ss:[ebp+C]
04485942 8B12 mov edx,dword ptr ds:[edx]
04485944 8902 mov dword ptr ds:[edx],eax
//不需要修改
04485953 8B55 0C mov edx,dword ptr ss:[ebp+C]
04485956 8B12 mov edx,dword ptr ds:[edx]
04485958 8902 mov dword ptr ds:[edx],eax
//不需要修改
04485961 8B55 0C mov edx,dword ptr ss:[ebp+C]
04485964 8B12 mov edx,dword ptr ds:[edx]
04485966 8902 mov dword ptr ds:[edx],eax
//GetProcAddress函数加密
――――――――――――――――――――――――
你也可以走至OEP后找到IAT位置,然后重新运行,在IAT处下“内存写入”断点,从而确定IAT加密的地方。
Shift+F9,中断在044858CF处。
044858CA E8 FDF8FFFF call 044851CC
044858CF 8B55 0C mov edx,dword ptr ss:[ebp+C]
044858D2 8B12 mov edx,dword ptr ds:[edx]
044858D4 8902 mov dword ptr ds:[edx],eax
//修改为:mov dword ptr ds:[edx],ebx ★
//寄存器EBX中保存的就是正确的函数!
044858D6 E9 90000000 jmp 0448596B
0448596B 8B45 0C mov eax,dword ptr ss:[ebp+C]
0448596E 8300 04 add dword ptr ds:[eax],4
04485971 5F pop edi
04485972 5E pop esi
04485973 5B pop ebx
04485974 8BE5 mov esp,ebp
04485976 5D pop ebp
04485977 C2 1000 retn 10
//返回 04485A36
044859EA AD lods dword ptr ds:[esi]
044859EB 09C0 or eax,eax
044859ED 74 4A je short 04485A39
//输入表处理完毕则跳转 ★
044859EF 89C7 mov edi,eax
044859F1 037D F8 add edi,dword ptr ss:[ebp-8]
044859F4 897D F4 mov dword ptr ss:[ebp-C],edi
044859F7 89F3 mov ebx,esi
044859F9 31C9 xor ecx,ecx
044859FB 49 dec ecx
044859FC 87FE xchg esi,edi
044859FE 30C0 xor al,al
04485A00 F2:AE repne scas byte ptr es:[edi]
04485A02 87FE xchg esi,edi
04485A04 AC lods byte ptr ds:[esi]
04485A05 80F8 00 cmp al,0
04485A08 74 E0 je short 044859EA
04485A0A 80F8 01 cmp al,1
04485A0D 75 06 jnz short 04485A15
04485A0F 8345 F4 04 add dword ptr ss:[ebp-C],4
04485A13 EB EF jmp short 04485A04
04485A15 53 push ebx
04485A16 56 push esi
04485A17 53 push ebx
04485A18 8D5D F4 lea ebx,dword ptr ss:[ebp-C]
04485A1B 53 push ebx
04485A1C 80F8 05 cmp al,5
04485A1F 74 06 je short 04485A27
04485A21 0FB60E movzx ecx,byte ptr ds:[esi]
04485A24 41 inc ecx
04485A25 EB 05 jmp short 04485A2C
04485A27 B9 04000000 mov ecx,4
04485A2C 01CE add esi,ecx
04485A2E FF75 F0 push dword ptr ss:[ebp-10]
04485A31 E8 FAFDFFFF call 04485830
//IAT加密
04485A36 5B pop ebx
04485A37 EB CB jmp short 04485A04
04485A39 5F pop edi
//这里下断 ★
04485A3A 5E pop esi
04485A3B 5B pop ebx
04485A3C 5A pop edx
04485A3D 59 pop ecx
04485A3E 8BC3 mov eax,ebx
04485A40 5B pop ebx
04485A41 8BE5 mov esp,ebp
04485A43 5D pop ebp
04485A44 C3 retn
//循环处理输入表
――――――――――――――――――――――――
看看04485966处的处理
0448595C B8 B8464804 mov eax,44846B8
04485961 8B55 0C mov edx,dword ptr ss:[ebp+C]
04485964 8B12 mov edx,dword ptr ds:[edx]
04485966 8902 mov dword ptr ds:[edx],eax
04485968 EB 01 jmp short 0448596B
当我们中断在04485966处时,EAX=044846B8
Ctrl+G:044846B8
044846B8 55 push ebp
044846B9 8BEC mov ebp,esp
044846BB 8B55 0C mov edx,dword ptr ss:[ebp+C]
044846BE 8B45 08 mov eax,dword ptr ss:[ebp+8]
044846C1 3B05 F8234904 cmp eax,dword ptr ds:[44923F8>
044846C7 75 09 jnz short 044846D2
044846C9 8B0495 F8234904 mov eax,dword ptr ds:[edx*4+4>
044846D0 EB 07 jmp short 044846D9
044846D2 52 push edx
044846D3 50 push eax
044846D4 E8 2710FFFF call 04475700; jmp to kernel32.GetProcAddress
044846D9 5D pop ebp
044846DA C2 0800 retn 8
所以这个函数是GetProcAddress,把EAX的值修改为GetProcAddress的地址,WinXP下这个地址是77E5A5FD
―――――――――――――――――――――――――――――――――
三、Second段内存断点大法,直达OEP
输入表处理结束后中断在04485A39处,现在我们不必通过最后一次异常走至OEP了。
取消所有的断点。
Alt+M,打开内存察看窗口。
在00401000的第2个区段上设置内存访问断点。
Shift+F9,直达OEP!
004A4F03 6A 60 push 60
//在这儿用LordPE纠正ImageSize后完全DUMP这个进程
004A4F05 68 18495600 push RPGXP.00564918
004A4F0A E8 49110000 call RPGXP.004A6058
004A4F0F BF 94000000 mov edi,94
004A4F14 8BC7 mov eax,edi
004A4F16 E8 25DDFFFF call RPGXP.004A2C40
004A4F1B 8965 E8 mov dword ptr ss:[ebp-18],esp
004A4F1E 8BF4 mov esi,esp
004A4F20 893E mov dword ptr ds:[esi],edi
004A4F22 56 push esi
004A4F23 FF15 0CA45200 call dword ptr ds:[52A40C]; kernel32.GetVersionExA
―――――――――――――――――――――――――――――――――
四、修复输入表,完成脱壳
运行ImportREC,选择这个进程。
修改OEP=000A4F03、RVA=0012A000、Size=000008D0,获取输入表,所有的函数都是有效的。
FixDump,正常运行,脱壳成功!
―――――――――――――――――――――――――――――――――
五、破解
程序启动后弹出要求注册的NAG,如果取消的话则程序自动退出。现在就来搞定这个NAG。
你可以用试炼码注册时下BP MessageBoxA,从而得知注册窗口的位置。
00403C2D E8 CA1B1100 call UnPacked.005157FC
00403C32 85C0 test eax,eax
00403C34 0F84 84000000 je UnPacked.00403CBE
00403C3A 396C24 2C cmp dword ptr ss:[esp+2C],ebp
00403C3E 74 7E je short UnPacked.00403CBE
00403C40 6A 00 push 0
00403C42 8BCE mov ecx,esi
00403C44 E8 57ECFFFF call UnPacked.004028A0
//弹出NAG
00403C49 85C0 test eax,eax
00403C4B 74 0A je short UnPacked.00403C57
00403C4D C786 A0000000 01000>mov dword ptr ds:[esi+A0],1
00403C57 8B56 1C mov edx,dword ptr ds:[esi+1C]
00403C5A 85D2 test edx,edx
00403C5C 74 60 je short UnPacked.00403CBE
修改为:
00403C2D E8 CA1B1100 call UnPacked.005157FC
00403C32 B8 01000000 mov eax,1 ★
00403C37 EB 10 jmp short UnPacked.00403C49 ★
00403C39 90 nop
00403C3A 396C24 2C cmp dword ptr ss:[esp+2C],ebp
00403C3E 74 7E je short UnPacked.00403CBE
00403C40 6A 00 push 0
00403C42 8BCE mov ecx,esi
00403C44 E8 57ECFFFF call UnPacked.004028A0
00403C49 85C0 test eax,eax
00403C4B 74 0A je short UnPacked.00403C57
OK,世界清净下来,NAG了无踪迹了。
月明星稀,秋虫唧唧,好一个怡人的初秋之夜。
我愿折去生命的四分之三,换取这个四分之一的爽秋!
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacked By 巢水工作坊――fly [FCG][NUKE][DCM][BCG][CUG]
2004-08-31 04:00
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)