奇迹商业版破解方法

来源: 作者: 点击:
【加壳方式】Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
【操作系统】Windows XP

【破解工具】PEID,OllyDbg,LordPE,ImportREC

【破解声明】破解完全出于兴趣,无任何商业目的。

1、用PEID载入程序gameserver.exe,显示为Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks加密

2、用OllyDbg 1.10版打开程序supmail.exe后,OD停在:

00578049 <模块入口点> /$ 55 PUSH EBP  ;停在这里!
0057804A |. 8BEC MOV EBP,ESP
0057804C |. 6A FF PUSH -1
0057804E |. 68 48D25900 PUSH supmail.0059D248
00578053 |. 68 907A5700 PUSH supmail.00577A90 ; SE   handler installation
00578058 |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0057805E |. 50 PUSH EAX

上面看到的00578049<模块入口点>并不是真正的程序入口地址!然后用插件隐身OD,并且在 选项->调试设置->异常 里忽略所有异常。

3、用命令行插件下断 BP OpenMutexA,按F9运行程序,不出意外的话,程序应该在一个OpenMutexA断点出停住,得到的汇编代码如下:

7C80EC1B OpenMutexA 8BFF MOV EDI,EDI  ;中断在这里!
7C80EC1D 55 PUSH EBP
7C80EC1E 8BEC MOV EBP,ESP
7C80EC20 51 PUSH ECX
7C80EC21 51 PUSH ECX
7C80EC22 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
7C80EC26 56 PUSH ESI
7C80EC27 0F84 7A500300 JE kernel32.7C843CA7
7C80EC2D 64:A1 18000000 MOV EAX,DWORD PTR FS:[18]
7C80EC33 FF75 10 PUSH DWORD PTR SS:[EBP+10]

按下alt+k 打开堆栈查看:

调用堆栈: 主线程
地址 堆栈 函数过程 / 参数 调用来自 结构
0012F798 07CC90F5 kernel32.OpenMutexA GameServ.07CC90EF 0012FF00
0012F79C 001F0001 Access = 1F0001
0012F7A0 00000000 Inheritable = FALSE
0012F7A4 0012FDD8 MutexName = "474:A22D56583"
0012FF04 07CC986C GameServ.07CC904B GameServ.07CC9867 0012FF00
0012FF0C 07CCA086 GameServ.07CC9864 GameServ.07CCA081 0012FF08
0012FF38 07CDD6B1 GameServ.07CC9D60 GameServ.<模块入口点>+0C9 0012FF34
0012FF3C 00400000 Arg1 = 00400000
0012FF40 00000000 Arg2 = 00000000
0012FF44 00141F23 Arg3 = 00141F23
0012FF48 0000000A Arg4 = 0000000A

记录地址:0012FF48 当然大家的都不一样~~

4, 按下Ctrl+G 进行表达式的跟随 ,选择空间:00401000 找到无数据区 :

00401000 0000 add [eax], al
00401002 0000 add [eax], al
00401004 0000 add [eax], al
00401006 0000 add [eax], al
00401008 0000 add [eax], al
0040100A 0000 add [eax], al
0040100C 0000 add [eax], al
0040100E 0000 add [eax], al
00401010 0000 add [eax], al
00401012 0000 add [eax], al
00401014 0000 add [eax], al
00401016 0000 add [eax], al

然后开始对刚才的堆栈进行修改 ,点中地址为00401000的行后,用Ctrl+E命令,修改这一片连续地址内容,输入一下内容:

00401000 60 PUSHAD
00401001 9C PUSHFD
00401002 68 F0FB1200 PUSH 12FF48 ;其中的12FF48,这是堆栈中看到的值,注意这里可以去了地址前的00
00401007 33C0 XOR EAX,EAX
00401009 50 PUSH EAX
0040100A 50 PUSH EAX
0040100B E8 2FDB407C CALL kernel32.CreateMutexA
00401010 9D POPFD
00401011 61 POPAD
00401012 - E9 04DC407C JMP kernel32.OpenMutexA

修改完毕后,开始在刚才修改的地址00401000处做处理,在地址00401000处单击右键,选择“此为新起源”(也有可能显示新EIP)的,

弹出对话框点击确定即可。然后按F9,再次回到断点处:


7C80EC1B OpenMutexA 8BFF MOV EDI,EDI  ;再次中断在这里!
7C80EC1D 55 PUSH EBP
7C80EC1E 8BEC MOV EBP,ESP
7C80EC20 51 PUSH ECX
7C80EC21 51 PUSH ECX
7C80EC22 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
7C80EC26 56 PUSH ESI
7C80EC27 0F84 7A500300 JE kernel32.7C843CA7
7C80EC2D 64:A1 18000000 MOV EAX,DWORD PTR FS:[18]
7C80EC33 FF75 10 PUSH DWORD PTR SS:[EBP+10]

5、好下面来取消,按F2进行取消,再次按下Ctrl+G 进行表达式的跟随,来到刚才修改的00401000处,把刚才所做的修改再改回去,输入:

add [eax], al 来填充,恢复那些零值。然后再次在命令行下断点:BP GetModuleHandleA ,然后按F9,执行来到这里

7C80B529 GetModuleHan> 8BFF MOV EDI,EDI  ;在这设置的中断,再次按下F2取消这里的中断!!
7C80B52B 55 PUSH EBP
7C80B52C 8BEC MOV EBP,ESP
7C80B52E 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
7C80B532 74 18 JE SHORT kernel32.7C80B54C  ;重新在这里下断,按F2下断!!
7C80B534 FF75 08 PUSH DWORD PTR SS:[EBP+8]

再次按F9运行,此时注意右下角堆栈窗口,直到出现类似一下代码时才可以停住:

0012D288 /0012D514
0012D28C |00CB519B RETURN to 00CB519B from kernel32.GetModuleHandleA ;这里kernel32.GetModuleHandleA是重要信息!!
0012D290 |0012D3C8 ASCII "kernel32.dll"

这里来判断停下的时候的依据是:0012D290地址数组和0012D3C8都在0012D的区间里,相差小的为最好时机!!你可看仔细观察,在你按F9的其
它时候,这两组数相差甚大。

6、现在取消断点,在停止后按下F2,再用Alt+F9返回刚才的用户执行代码处。
呵呵 那个神奇的万能跳转马上就来了,Magic Jump我爱你!,返回后我们来到这里:

004015CC /EB 10 JMP SHORT supmail.004015DE  ;按F2中断在此!!!
004015CE |66:623A BOUND DI,DWORD PTR DS:[EDX]
004015D1 |43 INC EBX
004015D2 |2B2B SUB EBP,DWORD PTR DS:[EBX]
004015D4 |48 DEC EAX
004015D5 |4F DEC EDI
004015D6 |4F DEC EDI
004015D7 |4B DEC EBX
004015D8 |90 NOP
004015D9 -|E9 98605000 JMP 00907676

呵呵 这个004015CC就是解开这个壳壳的关键处,可以得到真正的OEP=004015CC-00400000=000015CC。

8、打开软件LordPE,点开在path里找到gameserver.exe的进程,对它的脸上点右建,选择dump full,开始脱壳啦!这里LordPE会有个对话框
,请选择你要脱壳后文件的放置位置就行。完成后,还是选择gameserver.exe的进程,按下右边的PE Editor,选择你刚才脱好的程序,就是

dumped文件,修改OEP就是入口点为:(000015CC)要去所有的“0”哦!!

9、刚才调试了半天的OD没关吧(什么你关了?手还真快啊!重来!),再打开一个新的OD,载入刚刚用LordPE脱掉的dumped.exe,这次程序就
该停止了我们修改后的模块入口,得到的汇编代码如下:


004015CC <模块入口点> /EB 10 JMP SHORT dumped.004015DE  ;中断在这里哦!!
004015CE |66:623A BOUND DI,DWORD PTR DS:[EDX]
004015D1 |43 INC EBX
004015D2 |2B2B SUB EBP,DWORD PTR DS:[EBX]
004015D4 |48 DEC EAX
004015D5 |4F DEC EDI
004015D6 |4F DEC EDI
004015D7 |4B DEC EBX
004015D8 |90 NOP
004015D9 -|E9 98605000 JMP 00907676

10、按F8单步运行至004015EE处,再点F7跟进,会发现来到这里:

00505394 - FF25 C4235200 JMP DWORD PTR DS:[5223C4] ; kernel32.GetModuleHandleA
0050539A - FF25 C8235200 JMP DWORD PTR DS:[5223C8] ; kernel32.GetOEMCP 对OEMCP的修改
005053A0 - FF25 CC235200 JMP DWORD PTR DS:[5223CC] ; kernel32.GetPrivateProfileStringA
005053A6 - FF25 D0235200 JMP DWORD PTR DS:[5223D0] ; kernel32.GetProcAddress
005053AC - FF25 D4235200 JMP DWORD PTR DS:[5223D4] ; kernel32.GetProcessHeap

下面开始计算IAT,看见DWORD PTR的参数了么:5223C4,来拿出计算器,开始:5223C4-401000=1213C4 这里我们取121000!!

11、此时可以关闭第二个对dumped修改的OD,打开ImportREC,在左下角的输入:

OEP:000015CC  RVA:00121000  Size:00001000

然后点击“Get Import”得到输入表,然后点击右侧的“Show Invalid”得到无效指针,之后单击右键,选择“Trace Level1(Disasm)”,然
后单击右键选择“Cut Thunk(s)”最后点击下方的“Fix Dump”选择文件dumped.exe,在Log窗口显示修复dumped成功,并生成dump_.exe文件。
呵呵 来运行吧 只要你前面的步骤都对了,这里就OK了~!!
栏目列表