|
手把手教你脱翎风M2server引擎程序上午看到快刀浪子发的一个翎风某年某月某日的m2server引擎程序,很久没动手了,既然是新的,俺也来玩玩吧,全当是过把瘾.有段时间没有这么放松的感觉了,工作实在太忙呀!没做录像,说实在的有点可惜,但实在没有时间,所以我就把我脱壳的过程记了下来,基本可以算得上手把手了,只有你有一点加壳与脱壳的基本常识,按着下面的来做就不会有问题.
说实话,翎风的壳实在太脆弱了,也正因此给了大家提供了更多的学习机会.壳虽然很弱,但是翎风的产品确实很强大.并且它的网络认证功能也是近几年来非常流行的,而且实用,所以说虽然可以把它脱得一丝不挂,但要免费使用它还是要做一些工作的.好在翎风这次发布的版本是300用户免费使用的.(有点感觉象乐剑,这家伙学了一个翎风M2,一开始就搞得300用户免费使用,这对中小私服业主来说应该是完全够用了.)好了,闲话说得太多了,时间宝贵,就让我们开始吧!
只提供给大家学习脱壳之用,请勿用做他途!
所需工具:Ollydbg,peid 0.94,exesc6.5,ImportREC 1.6 这些工具网上都有下载,大家搜索吧,有机会我会上传给脱壳爱好者.
第一步还是探壳EID 探测为 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay]
设置Ollydbg忽略所有的异常选项,用IsDebug 1.4插件去掉Ollydbg的调试器标志。
004C3999 >/$ 55 PUSH EBP ;OD载入后停留在这里
004C399A |. 8BEC MOV EBP,ESP
004C399C |. 6A FF PUSH -1
004C399E |. 68 503C4E00 PUSH GameCent.004E3C50
004C39A3 |. 68 80334C00 PUSH GameCent.004C3380 ; SE 处理程序安装
004C39A8 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
004C39AE |. 50 PUSH EAX
004C39AF |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
一、欺骗代码
下断:BP OpenMutexA,F9运行
7C80EC1B > 8BFF MOV EDI,EDI 中断在这里
7C80EC1D 55 PUSH EBP
7C80EC1E 8BEC MOV EBP,ESP
堆栈友好提示:
0013F59C 004A55F1 /CALL 到 OpenMutexA 来自 GameCent.004A55EB
0013F5A0 001F0001 |Access = 1F0001
0013F5A4 00000000 |Inheritable = FALSE
0013F5A8 0013FBDC \MutexName = "A64:A5B2BDB49" ;这个很关键,要记下来:13FBDC,后面要用到.
CTRL+G来到 401000
00401000 0000 ADD BYTE PTR DS:[EAX],AL ;来到这里.
00401002 0000 ADD BYTE PTR DS:[EAX],AL
写入如下代码右键,"编辑",单个复制过去就可以了,比较省事!)
00401000 60 pushad
00401001 9C pushfd
00401002 68 F0FB1200 push 13FBDC (13DBDC)
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处单击右键,选"在此处新建EIP",确定。然后F9运行,断在OpenMutexA 断点处(同上):
7C80EC1B > 8BFF MOV EDI,EDI
7C80EC1D 55 PUSH EBP
7C80EC1E 8BEC MOV EBP,ESP
二、避开IAT加密
F2取消断点并Ctrl+G定位到00401000处,取消先前的修改。之后下断点:He GetModuleHandleA ,F9运行:
7C80B529 > 8BFF MOV EDI,EDI 断在这里.
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
7C80B534 FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C80B537 E8 682D0000 CALL kernel32.7C80E2A4
7C80B53C 85C0 TEST EAX,EAX
7C80B53E 74 08 JE SHORT kernel32.7C80B548
注意堆栈变化:
0013EC6C 5D175394 /CALL 到 GetModuleHandleA 来自 5D17538E
0013EC70 5D1753E0 \pModule = "kernel32.dll"
0013ED2C 77F45BD8 /CALL 到 GetModuleHandleA 来自 SHLWAPI.77F45BD2
0013ED30 77F4501C \pModule = "KERNEL32.DLL"
0013F540 004A47ED /CALL 到 GetModuleHandleA 来自 GameCent.004A47E7
0013F544 00000000 \pModule = NULL
0013BF20 00B7C807 /CALL 到 GetModuleHandleA 来自 00B7C801
0013BF24 00B8D6C8 \pModule = "kernel32.dll"
0013BF28 00B8E67C ASCII "VirtualAlloc"
0013BF20 00B7C824 /CALL 到 GetModuleHandleA 来自 00B7C81E
0013BF24 00B8D6C8 \pModule = "kernel32.dll"
0013BF28 00B8E670 ASCII "VirtualFree"
0013EA5C 00B85533 /CALL 到 GetModuleHandleA 来自 00B8552D
0013EA60 00000000 \pModule = NULL
0013EA90 00B85184 /CALL 到 GetModuleHandleA 来自 00B85182
0013EA94 00000000 \pModule = NULL
0013DC3C 7C341897 /CALL 到 GetModuleHandleA 来自 7C341891
0013DC40 7C37A298 \pModule = "kernel32.dll"
0013DC7C 7C34193C /CALL 到 GetModuleHandleA 来自 7C341936
0013DC80 7C37A298 \pModule = "kernel32.dll"
0013D78C 74683BEE /CALL 到 GetModuleHandleA 来自 74683BE8
0013D790 0013D794 \pModule = "C:\WINDOWS\system32\ntdll.dll" 看到这里注意了,这中间有个跳转比较明显,这是返回的最佳时机.
取消断点,Alt+F9返回到这里:
00DF799B 8B0D E011E200 MOV ECX,DWORD PTR DS:[E211E0]
00DF79A1 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00DF79A4 A1 E011E200 MOV EAX,DWORD PTR DS:[E211E0]
00DF79A9 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00DF79AC 75 16 JNZ SHORT 00DF79C4
00DF79AE 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00DF79B4 50 PUSH EAX
00DF79B5 FF15 CC80E100 CALL DWORD PTR DS:[E180CC] ; kernel32.LoadLibraryA
00DF79BB 8B0D E011E200 MOV ECX,DWORD PTR DS:[E211E0]
00DF79C1 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00DF79C4 A1 E011E200 MOV EAX,DWORD PTR DS:[E211E0]
00DF79C9 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00DF79CC 0F84 AD000000 JE 00DF7A7F ★这就是大侠们说的那个Magic Jump,把她改成JMP 00DF7A7F
00DF79D2 33C9 XOR ECX,ECX
00DF79D4 8B03 MOV EAX,DWORD PTR DS:[EBX]
00DF79D6 3938 CMP DWORD PTR DS:[EAX],EDI
00DF79D8 74 06 JE SHORT 00DF79E0
00DF79DA 41 INC ECX
00DF79DB 83C0 0C ADD EAX,0C
00DF79DE ^ EB F6 JMP SHORT 00DF79D6
三、内存断点大法直抵OEP
Alt+M 查看内存,在401000段 下“内存访问断点”,F9运行:
呵呵,祖国江山一片红..........
00600C24 55 PUSH EBP 停在这里.用LordPE脱了她吧。脱壳后用lordPE的PE editor修改他的OEP为200C24
00600C25 8BEC MOV EBP,ESP
00600C27 83C4 F0 ADD ESP,-10
00600C2A B8 A4076000 MOV EAX,M2Server.006007A4
00600C2F E8 5C61E0FF CALL M2Server.00406D90
00600C34 A1 A4966000 MOV EAX,DWORD PTR DS:[6096A4]
00600C39 8B00 MOV EAX,DWORD PTR DS:[EAX]
00600C3B E8 C0A6E6FF CALL M2Server.0046B300
四、修复输入表
在不关闭OD的前提下,ImportREC 1.6,选择这个进程 OEP改为:200C24,点 自动查找 IAT, 获取输入表,显示无效指针,并cut掉.复制转储文件(选择你刚脱出来的文件就可以了)
处此就全部结束了,运行一下吧.OK~~~~~~~~~~~~
有4M多,自己找个压缩壳自己压缩一下就行了.
如果你想修改可以用exesc6.5,对delphi程序很有用.不过建议保留原作者版权!
|
|