【文章标题】: 新魔界精灵 Ver3.6.0(会员超级版) 脱壳+优化+破解
【文章作者】: 小彻小悟
【作者邮箱】: 妈妈不让说
【作者主页】: 妈妈不让说
【作者QQ号】: 妈妈不让说
【软件名称】: 新魔界精灵 Ver3.6.0(会员超级版)
【软件大小】: 2.66MB
【下载地址】: 自己搜索下载
【加壳方式】: Armadillo 4.xx
【保护方式】: ProtectProtection system (Professional)
【编写语言】: C++
【使用工具】: ArmaFP PEID FI Imprec 1.6F
【操作平台】: Windows Sp2
【软件介绍】: 一个功能全面,覆盖魔界外挂用户90%的全功能外挂.
【作者声明】: 看雪老大要求我提高骗技,特此又来灌水骗精华.
--------------------------------------------------------------------------------
【详细过程】
一、准备工作
老规矩设置Ollydbg忽略所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志。
1 侦壳:用PEiD查壳 Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
我们再用FI4.01a查一下 显示为 Armadillo 3.75a {glue}
这里如何判断到底哪个对呢?记得FLY大狭说过Armadillo V4.0新增的反跟踪手段:
OllyDbg在处理调式包含格式串的消息时存在问题,被跟踪的应用程序可以使OllyDbg崩溃,或可能以进程权限执行任意指令。OutputDebugString函数可发送字符串到调试器上,然后OllyDbg会在底端显示相关状态消息,但是如果包含格式串消息,就可能使OllyDbg崩溃。Armadillo以前的版本没有此种Anti,自V4.0始才有。
有他这句话我们就可以做如下判断了:
OD 载入
下断点 HE OutputDebugStringA
Shift+F9运行,中断下来。看堆栈:
0012EC48 00E75B30 /CALL 到 OutputDebugStringA 来自 00E75B2A
0012EC4C 0012F5C0 \String = "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
出现这个说明这个壳我们还是以 PDIE 查出的结果为准
2 判断进程:启动程序。然后在 Windows 任务管理器或LordPE里查看是单进程的Armadillo还是双进程的。
这个程序是单进程的,我们可以省略分离父子进程的过程。
二 、脱壳
清除断点后OD 重新载入
004CB000 > 60 PUSHAD //停在这里
004CB001 E8 00000000 CALL xmjjl.004CB006
004CB006 5D POP EBP
004CB007 50 PUSH EAX
1 避开IAT加密
下断点HE GetModuleHandleA
按F9运行中断后,看堆栈:
0012ECD4 7365D4A4 /CALL 到 GetModuleHandleA 来自 msctfime.7365D49E
0012ECD8 0012ECDC \pModule = "C:\windows\system32\ntdll.dll"
0012EE3C 5D175394 /CALL 到 GetModuleHandleA 来自 5D17538E
0012EE40 5D1753E0 \pModule = "kernel32.dll"
0012EEFC 77F45BD8 /CALL 到 GetModuleHandleA 来自 SHLWAPI.77F45BD2
0012EF00 77F4501C \pModule = "KERNEL32.DLL"
0012F714 004A28F3 /CALL 到 GetModuleHandleA 来自 xmjjl.004A28ED
0012F718 00000000 \pModule = NULL
00129500 00E77105 /CALL 到 GetModuleHandleA 来自 00E770FF
00129504 00E8BC1C \pModule = "kernel32.dll"
00129508 00E8CEC4 ASCII "VirtualAlloc"
00129500 00E77122 /CALL 到 GetModuleHandleA 来自 00E7711C
00129504 00E8BC1C \pModule = "kernel32.dll"
00129508 00E8CEB8 ASCII "VirtualFree"
如果出现错误窗口按确定后按Shift+F9继续运行
00129264 00E65FC9 /CALL 到 GetModuleHandleA 来自 00E65FC3
00129268 001293B4 \pModule = "kernel32.dll" ★注意!在这里清除硬件断点后Alt+F9返回程序
这里说下我判断返回的经验,我的经验是一般出现下面这两句就快到返回点了
00129500 00E77105 /CALL 到 GetModuleHandleA 来自 00E770FF
00129504 00E8BC1C \pModule = "kernel32.dll"
00129508 00E8CEC4 ASCII "VirtualAlloc" //这句VirtualAlloc
00129500 00E77122 /CALL 到 GetModuleHandleA 来自 00E7711C
00129504 00E8BC1C \pModule = "kernel32.dll"
00129508 00E8CEB8 ASCII "VirtualFree" //这句VirtualFree
这里如果说的不对就请大侠们指教了!
00E65FC9 8B0D AC40E900 MOV ECX,DWORD PTR DS:[E940AC] //返回到这里
00E65FCF 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00E65FD2 A1 AC40E900 MOV EAX,DWORD PTR DS:[E940AC]
00E65FD7 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
00E65FDA 75 16 JNZ SHORT 00E65FF2
00E65FDC 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00E65FE2 50 PUSH EAX
00E65FE3 FF15 BC62E800 CALL DWORD PTR DS:[E862BC] ; kernel32.LoadLibraryA
00E65FE9 8B0D AC40E900 MOV ECX,DWORD PTR DS:[E940AC]
00E65FEF 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00E65FF2 A1 AC40E900 MOV EAX,DWORD PTR DS:[E940AC]
00E65FF7 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
00E65FFA 0F84 2F010000 JE 00E6612F //改成为 JMP 00C05E47 修改这是为了避开IAT加密
00E66000 33C9 XOR ECX,ECX
00E66002 8B07 MOV EAX,DWORD PTR DS:[EDI]
00E66004 3918 CMP DWORD PTR DS:[EAX],EBX
00E66006 74 06 JE SHORT 00E6600E
00E66008 41 INC ECX
00E66009 83C0 0C ADD EAX,0C
00E6600C ^ EB F6 JMP SHORT 00E66004
00E6600E 8BD9 MOV EBX,ECX
00E66010 C1E3 02 SHL EBX,2
00E66013 53 PUSH EBX
注意,壳会检测是否修改过代码.所以.改JMP后,回车跟随到00e6612f,然后在
00E6612F 83C7 0C ADD EDI,0C //跟随到这里
00E66132 89BD 78FDFFFF MOV DWORD PTR SS:[EBP-288],EDI
00E66138 83C6 04 ADD ESI,4
00E6613B 395F FC CMP DWORD PTR DS:[EDI-4],EBX
00E6613E ^ 0F85 49FEFFFF JNZ 00E65F8D
00E66144 EB 03 JMP SHORT 00E66149 //在这里F2,Shift+F9运行到这里
00E66146 D6 SALC
00E66147 D6 SALC
00E66148 8F ??? ; 未知命令
00E66149 8B0D 6C8FE900 MOV ECX,DWORD PTR DS:[E98F6C]
00E6614F 3BCB CMP ECX,EBX
00E66151 74 13 JE SHORT 00E66166
然后回到修改的的JMP地方撤消修改!如果不修改 下面的步骤将会无法继续,死在一片红色的海洋!!
2 寻找入口点
继续下断点 bp GetCurrentThreadId
按F9运行中断后,看堆栈:
00128D10 75C67580 /CALL 到 GetCurrentThreadId 来自 urlmon.75C6757A7
0012878C 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
001285BC 77DAE900 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE8FA
0012857C 77DAEAB0 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAEAAA
0012878C 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
001287AC 77DAE80D /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE807
0012F574 77D6B4FA /CALL 到 GetCurrentThreadId 来自 USER32.77D6B4F4
0012F6F8 00E663D4 /CALL 到 GetCurrentThreadId 来自 00E663CE ; ★注意!在这里清除断点后Alt+F9返回程序
这里说下我判断返回的经验,我的经验是 00E663CE 跟上面跨段很大。前面都是7开头的,而这个是00e 开始的。
并且,前面都是有函数的这个没!这里如果说的不对就请大侠们指教了。
00E663D4 50 PUSH EAX //返回到这里,我们F8跟下去
00E663D5 FF75 FC PUSH DWORD PTR SS:[EBP-4]
00E663D8 E8 05000000 CALL 00E663E2
00E663DD 83C4 0C ADD ESP,0C
00E663E0 C9 LEAVE
00E663E1 C3 RETN //返回到 00E7F8D5
00E7F8D5 33DB XOR EBX,EBX ; xmjjl.004B7C43 //返回到这里
00E7F8D7 53 PUSH EBX //继续F8向下走
00E7F8D8 E8 92CBFEFF CALL 00E6C46F
00E7F8DD 59 POP ECX
00E7F8DE BE 98FAE800 MOV ESI,0E8FA98
00E7F8E3 8BCE MOV ECX,ESI
00E7F8E5 E8 1693FDFF CALL 00E58C00
00E7F8EA 84C0 TEST AL,AL
00E7F8EC 75 09 JNZ SHORT 00E7F8F7
00E7F8EE 6A 01 PUSH 1
00E7F8F0 8BCE MOV ECX,ESI
00E7F8F2 E8 DBE2FDFF CALL 00E5DBD2
00E7F8F7 C705 E0C0E800 D>MOV DWORD PTR DS:[E8C0E0],0E8CFD8
00E7F901 B9 00ECE800 MOV ECX,0E8EC00
00E7F906 E8 1DF2FFFF CALL 00E7EB28
00E7F90B 53 PUSH EBX
00E7F90C E8 17F2FFFF CALL 00E7EB28
00E7F911 59 POP ECX
00E7F912 33D2 XOR EDX,EDX
00E7F914 8955 DC MOV DWORD PTR SS:[EBP-24],EDX
00E7F917 895D FC MOV DWORD PTR SS:[EBP-4],EBX
00E7F91A A0 BC00E900 MOV AL,BYTE PTR DS:[E900BC]
00E7F91F 8845 C8 MOV BYTE PTR SS:[EBP-38],AL
00E7F922 84C0 TEST AL,AL
00E7F924 75 47 JNZ SHORT 00E7F96D
00E7F926 A1 E400E900 MOV EAX,DWORD PTR DS:[E900E4]
00E7F92B 8B48 34 MOV ECX,DWORD PTR DS:[EAX+34]
00E7F92E 894D C4 MOV DWORD PTR SS:[EBP-3C],ECX
00E7F931 894D D0 MOV DWORD PTR SS:[EBP-30],ECX
00E7F934 8B0D FC00E900 MOV ECX,DWORD PTR DS:[E900FC] ; xmjjl.00400000
00E7F93A 894D C0 MOV DWORD PTR SS:[EBP-40],ECX
00E7F93D 8B70 54 MOV ESI,DWORD PTR DS:[EAX+54]
00E7F940 3370 50 XOR ESI,DWORD PTR DS:[EAX+50]
00E7F943 3370 3C XOR ESI,DWORD PTR DS:[EAX+3C]
00E7F946 03F1 ADD ESI,ECX
00E7F948 8975 D4 MOV DWORD PTR SS:[EBP-2C],ESI
00E7F94B 8B58 58 MOV EBX,DWORD PTR DS:[EAX+58]
00E7F94E 3358 44 XOR EBX,DWORD PTR DS:[EAX+44]
00E7F951 3358 18 XOR EBX,DWORD PTR DS:[EAX+18]
00E7F954 895D A8 MOV DWORD PTR SS:[EBP-58],EBX
00E7F957 8D4D D0 LEA ECX,DWORD PTR SS:[EBP-30]
00E7F95A E8 A116FDFF CALL 00E51000
00E7F95F 33D2 XOR EDX,EDX
00E7F961 F7F3 DIV EBX
00E7F963 03D6 ADD EDX,ESI
00E7F965 8955 CC MOV DWORD PTR SS:[EBP-34],EDX
00E7F968 8B12 MOV EDX,DWORD PTR DS:[EDX]
00E7F96A 8955 DC MOV DWORD PTR SS:[EBP-24],EDX
00E7F96D 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
00E7F971 EB 11 JMP SHORT 00E7F984
00E7F973 6A 01 PUSH 1
00E7F975 58 POP EAX
00E7F976 C3 RETN
00E7F977 8B65 E8 MOV ESP,DWORD PTR SS:[EBP-18]
00E7F97A 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
00E7F97E 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8]
00E7F981 8B55 DC MOV EDX,DWORD PTR SS:[EBP-24]
00E7F984 A1 E400E900 MOV EAX,DWORD PTR DS:[E900E4]
00E7F989 3150 34 XOR DWORD PTR DS:[EAX+34],EDX
00E7F98C A1 E400E900 MOV EAX,DWORD PTR DS:[E900E4]
00E7F991 3150 34 XOR DWORD PTR DS:[EAX+34],EDX
00E7F994 A1 E400E900 MOV EAX,DWORD PTR DS:[E900E4]
00E7F999 8B88 80000000 MOV ECX,DWORD PTR DS:[EAX+80]
00E7F99F 3348 5C XOR ECX,DWORD PTR DS:[EAX+5C]
00E7F9A2 3348 44 XOR ECX,DWORD PTR DS:[EAX+44]
00E7F9A5 030D FC00E900 ADD ECX,DWORD PTR DS:[E900FC] ; xmjjl.00400000
00E7F9AB 8B17 MOV EDX,DWORD PTR DS:[EDI]
00E7F9AD 85D2 TEST EDX,EDX
00E7F9AF 75 18 JNZ SHORT 00E7F9C9 //这里将会跳过OEP 修改Z标志就可以单步过去拉!
00E7F9B1 FF77 18 PUSH DWORD PTR DS:[EDI+18]
00E7F9B4 FF77 14 PUSH DWORD PTR DS:[EDI+14]
00E7F9B7 FF77 10 PUSH DWORD PTR DS:[EDI+10]
00E7F9BA 8B50 60 MOV EDX,DWORD PTR DS:[EAX+60]
00E7F9BD 3350 44 XOR EDX,DWORD PTR DS:[EAX+44]
00E7F9C0 3350 1C XOR EDX,DWORD PTR DS:[EAX+1C]
00E7F9C3 2BCA SUB ECX,EDX
00E7F9C5 FFD1 CALL ECX //F7进 就是OEP了
00E7F9C7 EB 1D JMP SHORT 00E7F9E6
00E7F9C9 83FA 01 CMP EDX,1
0041607E 55 PUSH EBP //OEP
0041607F 8BEC MOV EBP,ESP
00416081 6A FF PUSH -1
00416083 68 E88C4400 PUSH xmjjl.00448CE8
00416088 68 E4C24100 PUSH xmjjl.0041C2E4
0041608D 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00416093 50 PUSH EAX
00416094 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
0041609B 83EC 58 SUB ESP,58
0041609E 53 PUSH EBX
0041609F 56 PUSH ESI
004160A0 57 PUSH EDI
004160A1 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
004160A4 FF15 90524400 CALL DWORD PTR DS:[445290] ; kernel32.GetVersion
004160AA 33D2 XOR EDX,EDX
004160AC 8AD4 MOV DL,AH
004160AE 8915 347A4700 MOV DWORD PTR DS:[477A34],EDX
004160B4 8BC8 MOV ECX,EAX
004160B6 81E1 FF000000 AND ECX,0FF
004160BC 890D 307A4700 MOV DWORD PTR DS:[477A30],ECX
004160C2 C1E1 08 SHL ECX,8
004160C5 03CA ADD ECX,EDX
004160C7 890D 2C7A4700 MOV DWORD PTR DS:[477A2C],ECX
004160CD C1E8 10 SHR EAX,10
004160D0 A3 287A4700 MOV DWORD PTR DS:[477A28],EAX
004160D5 6A 01 PUSH 1
004160D7 E8 8D4F0000 CALL xmjjl.0041B069
三、修复IAT
现在可以用 LordPE DUMP了。完整转存后用 ImportREC v1.6F 修复IAT,OEP处填1607e 自动搜索IAT 获取输入表 显示无效函数
把无效指针全部CUT掉。修复抓取文件
最后可以给文件做个减肥。用 LordPE 打开脱壳后的文件。把 text1 adata data1 padtat 这4个区段删除掉。然后重建PE文件
二 破解
OD载入 dumped_.exe
0041607E > 55 PUSH EBP //停在这里
0041607F 8BEC MOV EBP,ESP
00416081 6A FF PUSH -1
00416083 68 E88C4400 PUSH dumped_.00448CE8
00416088 68 E4C24100 PUSH dumped_.0041C2E4
0041608D 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00416093 50 PUSH EAX
00416094 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
0041609B 83EC 58 SUB ESP,58
下断 BP MessageBoxA F9运行
输入帐号 点登陆
看堆载
0012F2A0 00437FA5 /CALL 到 MessageBoxA 来自 dumped_.00437F9F
0012F2A4 004F048E |hOwner = 004F048E (class='#32770',parent=022A03FE)
0012F2A8 00455314 |Text = "新魔界精灵更新了,老版本已经不可以用了,请去www.mwowg.com下载新的版本"
0012F2AC 0045535C |Title = "提示"
0012F2B0 00000000 \Style = MB_OK|MB_APPLMODAL
0012F2B4 00445608 ASCII "hoD"
0012F2B8 0040206C 返回到 dumped_.0040206C 来自 dumped_.00437F77 //这里鼠标又键,反汇编窗口跟随
00402042 /75 04 JNZ SHORT dumped_.00402048
00402044 |74 02 JE SHORT dumped_.00402048
00402046 |9A E883BD74 FFF>CALL FAR FFFF:74BD83E8 ; 远调用
0040204D FF09 DEC DWORD PTR DS:[ECX]
0040204F 0F85 A7000000 JNZ dumped_.004020FC //改JMP跳过提示
00402055 6A 00 PUSH 0
00402057 68 5C534500 PUSH dumped_.0045535C
0040205C 68 14534500 PUSH dumped_.00455314
00402061 8B8D 98F9FFFF MOV ECX,DWORD PTR SS:[EBP-668]
00402067 E8 0B5F0300 CALL dumped_.00437F77 //返回到这里
输入任意ID 提示 “版本过时了,请下载www.mwowg.com下载新版本”
呵呵 继续 载入修改后的“123.exe”
依然下断 BP MessageBoxA F9运行
输入任意ID 看堆载
0012F2B0 0040C116 /CALL 到 MessageBoxA 来自 123.0040C110
0012F2B4 00000000 |hOwner = NULL
0012F2B8 00455B2C |Text = "版本过时了,请下载www.mwowg.com下载新版本"
0012F2BC 00455694 |Title = "信息"
0012F2C0 00000000 \Style = MB_OK|MB_APPLMODAL
0012F2C4 0040211B 返回到 123.0040211B 来自 123.0040C030 //鼠标又键,在反汇编窗口中跟随
004020F7 /E9 EB080000 JMP 123.004029E7
004020FC |75 04 JNZ SHORT 123.00402102
004020FE |74 02 JE SHORT 123.00402102
00402100 |9A E883BD74 FFF>CALL FAR FFFF:74BD83E8 ; 远调用
00402107 |FF00 INC DWORD PTR DS:[EAX]
00402109 |74 15 JE SHORT 123.00402120 //修改JMP 就爆破了^-^
0040210B |8B85 74FFFFFF MOV EAX,DWORD PTR SS:[EBP-8C]
00402111 |A3 1C5A4500 MOV DWORD PTR DS:[455A1C],EAX
00402116 |E8 159F0000 CALL 123.0040C030
0040211B |E9 C7080000 JMP 123.004029E7 //返回到这里
点登陆
外挂下面提示,验证成功,启动游戏后按Home呼出外挂!
感谢 peaceclub KanXue Fly 大彻大悟 machenglin wynney laomms xxdoc forgot monkeycz 一直以来对我的帮助
祝大家2007新的一年 身体健康 万事如意 金猪大发
引用forgot老大的一句名言 写破文比脱壳难-,-
--------------------------------------------------------------------------------
【经验总结】
写这个教程的时候,外挂更新到3.61 郁闷的很,写了一半又要重新开始.
3.61作者已经改用了themida 1.0.0.5壳,聪明的你,应该知道知道带壳破它了:)
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!