科隆某外挂去自校验去验证
此文章我首发于看雪。。。。再发到这里来,顺便申请入PYG
【文章标题】: 科隆某外挂去自校验去验证
【文章作者】: 松松
【作者邮箱】: [email protected]
【软件名称】: XX科隆VIP版 2.0f
【软件大小】: 530
【下载地址】: 自己搜索下载
【加壳方式】: ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov
【保护方式】: ASPr+自校验
【编写语言】: VC
【使用工具】: OD
【软件介绍】: 某游戏外挂
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1、PEID查壳 :ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov 这里PEID分析的不对,估计是1.3X的壳,很快脱之
2、正式入题
运行,闪了一下就没了。估计里面有自校验,用OD打开,bp GetFileSize 没发现什么线索。到是OD说MSVRCT.dll加壳了。
再试其它办法bp CreateFileA
一次一次的中断,发现堆栈窗口如下
0012EC90 6BC864E8/CALL 到 CreateFileA 来自 mfc42.6BC864E2
0012EC94 0012EE8C|FileName = "C:\WINNT\system32\MSVRCT.DLL"
0012EC98 40000000|Access = GENERIC_WRITE
0012EC9C 00000000|ShareMode = 0
0012ECA0 0012EDC0|pSecurity = 0012EDC0
0012ECA4 00000002|Mode = CREATE_ALWAYS
0012ECA8 00000080|Attributes = NORMAL
0012ECAC 00000000\hTemplateFile = NULL
ALT+F9返回到程序领空
004097B9|.56 PUSH ESI返回到这里
004097BA|.53 PUSH EBX
004097BB|.8D4C24 18 LEA ECX,DWORD PTR SS:
004097BF|.E8 BE520000 CALL <JMP.&mfc42.#6385_?Write@CFile@@UAE>
004097C4|.8D4C24 10 LEA ECX,DWORD PTR SS:
004097C8|.E8 AF520000 CALL <JMP.&mfc42.#2803_?Flush@CFile@@UAE>
004097CD|.8D4C24 10 LEA ECX,DWORD PTR SS:
004097D1|.E8 A0520000 CALL <JMP.&mfc42.#1979_?Close@CFile@@UAE>
004097D6|.8D4C24 10 LEA ECX,DWORD PTR SS:
004097DA|.C74424 28 FFF>MOV DWORD PTR SS:,-1
004097E2|.E8 89520000 CALL <JMP.&mfc42.#665_??1CFile@@UAE@XZ>
004097E7|>B8 01000000 MOV EAX,1
004097EC|>8B4C24 20 MOV ECX,DWORD PTR SS:
004097F0|.5F POP EDI
004097F1|.5E POP ESI
004097F2|.5D POP EBP
004097F3|.5B POP EBX
发现它自已写了一个MSVRCT.DLL 到system32目录下。 刚下完后我就在纳闷,一般来说,一个外挂都是带一个DLL的。
DLL负责进行进程插入到游戏进程里,完成一API HOOK一系列的动作,这个外挂怎么没有,原来是放在资源里,动态生成的。
呵呵,把DLL拷出,查壳结果,和主程序一样,顺手脱之。继续。
0040998F|> \8D5424 34 LEA EDX,DWORD PTR SS:
00409993|.6A 15 PUSH 15 ; /Arg2 = 00000015
00409995|.52 PUSH EDX ; |Arg1
00409996|.8BCB MOV ECX,EBX ; |
00409998|.E8 937DFFFF CALL _Tomato.00401730 ; \_Tomato.00401730
0040999D|.8D4424 70 LEA EAX,DWORD PTR SS:
004099A1|.50 PUSH EAX ; /FileName
004099A2|.FF15 E4924800 CALL DWORD PTR DS:[<&kernel32.LoadLibrar>; \LoadLibraryA来到这里
004099A8|.8D4C24 4C LEA ECX,DWORD PTR SS:
004099AC|.6A 23 PUSH 23 ; /Arg2 = 00000023
004099AE|.51 PUSH ECX ; |Arg1
004099AF|.8BCB MOV ECX,EBX ; |
004099B1|.8BF0 MOV ESI,EAX ; |
004099B3|.E8 787DFFFF CALL _Tomato.00401730 ; \_Tomato.00401730
004099B8|.8D5424 4C LEA EDX,DWORD PTR SS:
004099BC|.52 PUSH EDX ; /ProcNameOrOrdinal
004099BD|.56 PUSH ESI ; |hModule
004099BE|.FF15 C0924800 CALL DWORD PTR DS:[<&kernel32.GetProcAdd>; \GetProcAddress
004099C4|.FFD0 CALL EAX
。。。LoadlibraryA后就出错了。还真麻烦,由于DLL加了壳,无法调试了。重新开始程序,断在004099A1 ,
到system32下把MSVRCT32.dll删除,把刚才脱完壳的DLL复制进去,OK,继续调试
堆栈窗口
0012EF04 0040123E/CALL 到 CreateFileA 来自 _Tomato.0040123C
0012EF08 0012EF40|FileName = "\\.\SICE"
0012EF0C C0000000|Access = GENERIC_READ|GENERIC_WRITE
0012EF10 00000003|ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012EF14 00000000|pSecurity = NULL
0012EF18 00000003|Mode = OPEN_EXISTING
0012EF1C 00000080|Attributes = NORMAL
0012EF20 00000000\hTemplateFile = NULL
0012EF04 0040126F/CALL 到 CreateFileA 来自 _Tomato.0040126D
0012EF08 0012EF54|FileName = "\\.\NTICE"
0012EF0C C0000000|Access = GENERIC_READ|GENERIC_WRITE
0012EF10 00000003|ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012EF14 00000000|pSecurity = NULL
0012EF18 00000003|Mode = OPEN_EXISTING
0012EF1C 00000080|Attributes = NORMAL
0012EF20 00000000\hTemplateFile = NULL
一大堆检测Softice,还有TRW,嘿嘿,我用的是OD,查不到我。没想到,程序自已关闭了。
看来是到地头了。重新开始,来到这里
00408209 .8BCF MOV ECX,EDI
0040820B .E8 2091FFFFCALL _Tomato.00401330
00408210 .85C0 TEST EAX,EAX
00408212 .74 10 JE SHORT _Tomato.00408224 <改JMP
00408214 .6A 00 PUSH 0 ; /ExitCode = 0
00408216 .FF15 989D480>CALL DWORD PTR DS:[<&user32.PostQuitMess>; \PostQuitMessage
0040821C .6A 00 PUSH 0 ; /status = 0
0040821E .FF15 409B480>CALL DWORD PTR DS:[<&msvcrt.exit>] ; \exit
00408224 >8B16 MOV EDX,DWORD PTR DS:
00408226 .8BCE MOV ECX,ESI
00408228 .FF52 60 CALL DWORD PTR DS:
0040822B .8BCF MOV ECX,EDI
0040822D .E8 CE90FFFFCALL _Tomato.00401300
00408232 .85C0 TEST EAX,EAX
00408234 .74 19 JE SHORT _Tomato.0040824F <<<这里也是
00408236 .6A 05 PUSH 5 ; /Arg1 = 00000005
00408238 .8BCD MOV ECX,EBP ; |
0040823A .E8 C1210000CALL _Tomato.0040A400 ; \_Tomato.0040A400
0040823F .6A 00 PUSH 0 ; /ExitCode = 0
00408241 .FF15 989D480>CALL DWORD PTR DS:[<&user32.PostQuitMess>; \PostQuitMessage
00408247 .6A 00 PUSH 0 ; /status = 0
00408249 .FF15 409B480>CALL DWORD PTR DS:[<&msvcrt.exit>] ; \exit
0040824F >8BCF MOV ECX,EDI
00408251 .E8 CA90FFFFCALL _Tomato.00401320
00408256 .85C0 TEST EAX,EAX
00408258 .74 19 JE SHORT _Tomato.00408273 <<<这里
0040825A .6A 06 PUSH 6 ; /Arg1 = 00000006
0040825C .8BCD MOV ECX,EBP ; |
0040825E .E8 9D210000CALL _Tomato.0040A400 ; \_Tomato.0040A400
00408263 .6A 00 PUSH 0 ; /ExitCode = 0
00408265 .FF15 989D480>CALL DWORD PTR DS:[<&user32.PostQuitMess>; \PostQuitMessage
0040826B .6A 00 PUSH 0 ; /status = 0
0040826D .FF15 409B480>CALL DWORD PTR DS:[<&msvcrt.exit>] ; \exit
00408273 >E8 081B0000CALL _Tomato.00409D80
全改完,保存,至此,程序乖乖的运行了。呵呵,用Sinffer软件看了一下,验证是用HTTP,还是
bp CreateFileA。填入ID,乱打的,然后点登陆。
堆栈窗口
0012CD48 0040C4CB/CALL 到 CreateFileA 来自 _Tomato2.0040C4C5
0012CD4C 0223945C|FileName = "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\~ex48.tmp"
0012CD50 C0000000|Access = GENERIC_READ|GENERIC_WRITE
0012CD54 00000000|ShareMode = 0
0012CD58 00000000|pSecurity = NULL
0012CD5C 00000002|Mode = CREATE_ALWAYS
0012CD60 00000080|Attributes = NORMAL
0012CD64 00000000\hTemplateFile = NULL
写临时文件了,第一次写,第二次是读,不管,再断一次,
第2次中断后返回,CTRL+F9让它读完,读完后就是关键了。
0040C2E6|.E8 D5050000CALL _Tomato2.0040C8C0 这里开始验证了
0040C2EB|.84C0 TEST AL,AL
0040C2ED|.74 26 JE SHORT _Tomato2.0040C315
0040C2EF|.68 0C4B4100PUSH _Tomato2.00414B0C
0040C2F4|.68 DC4A4100PUSH _Tomato2.00414ADC
0040C2F9|.8BCD MOV ECX,EBP
0040C2FB|.C685 1D01000>MOV BYTE PTR SS:,0
0040C302|.E8 D9050000CALL _Tomato2.0040C8E0
0040C307|.5F POP EDI
0040C308|.5E POP ESI
0040C309|.32C0 XOR AL,AL
0040C30B|.5D POP EBP
0040C30C|.81C4 0401000>ADD ESP,104
0040C312|.C2 1400 RETN 14
0040C315|>8BCD MOV ECX,EBP
0040C317|.E8 64050000CALL _Tomato2.0040C880 <关键F7跟进
0040C31C|.84C0 TEST AL,AL
0040C31E|.74 28 JE SHORT _Tomato2.0040C348
0040C320|.8B55 08 MOV EDX,DWORD PTR SS:
0040C323|.C685 1D01000>MOV BYTE PTR SS:,0
0040C32A|.68 1C4B4100PUSH _Tomato2.00414B1C
0040C32F|.8BCD MOV ECX,EBP
0040C331|.8B42 0C MOV EAX,DWORD PTR DS:
0040C334|.50 PUSH EAX
0040C335|.E8 A6050000CALL _Tomato2.0040C8E0
0040C33A|.5F POP EDI
0040C33B|.5E POP ESI
0040C33C|.32C0 XOR AL,AL
0040C33E|.5D POP EBP
0040C33F|.81C4 0401000>ADD ESP,104
0040C345|.C2 1400 RETN 14
0040C87F 90 NOP
0040C880/$8B41 08 MOV EAX,DWORD PTR DS:
0040C883|.8B48 08 MOV ECX,DWORD PTR DS:
0040C886|.51 PUSH ECX ; /s2 = "Failed"
0040C887|.68 704C4100PUSH _Tomato2.00414C70 ; |s1 = "Failed"
0040C88C|.FF15 389B480>CALL DWORD PTR DS:[<&msvcrt._strcmpi>] ; \_stricmp
0040C892|.83C4 08 ADD ESP,8
0040C895|.85C0 TEST EAX,EAX <比较是不是验证失败 这里NOP掉
0040C897|.0F94C0 SETE AL 这里也是NOP
0040C89A\.C3 RETN
保存。。。。继续跟下去也没发现什么东西了。
由于没有这个游戏,也没办法验证到底还有没有暗桩。
收工。
--------------------------------------------------------------------------------
【经验总结】
这个程序把DLL隐藏在自身,运行时释放。由于壳的原因,会让OD无法继续跟踪,呵呵,只能取巧,在它
释放后没有调用前把脱壳后的DLL替换,虽然我注册的还是比较早的,但还是第一次写破文,也没什么技术含量,大家将就
着看看吧。另外问一下各位大大,能不能给我一个龙族联盟的邀请号,谢谢。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年03月21日 11:13:11
[ 本帖最后由 tigerisme 于 2006-8-26 21:29 编辑 ] 好东西就要大家看,大家学 支持楼主,支持原创 支持楼主,支持原创 支持楼主,支持原创 谢谢楼主,好破文学习了~~ 我也好好学习,我要学习网络验证
求教
求教~哪位大哥发个破解诛仙外挂的帖子啊~
看半天看不懂~顺便把要用的软件写下~一篇文章写下来~我们菜鸟都不知道怎么弄出来的那些函数~什么东东~肯定郁闷~你们高手写的确实不错~但是对菜鸟来说是天书~你们看到回帖应该知道~大部分回答都是~看不懂~!!!!! 不错。。学习下。。感谢提供
回复 1# 的帖子
又学习了,谢谢楼主
页:
[1]
2