yanyisong 发表于 2006-3-21 12:36:07

科隆某外挂去自校验去验证

此文章我首发于看雪。。。。
再发到这里来,顺便申请入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 编辑 ]

初出江湖 发表于 2006-3-28 23:12:08

好东西就要大家看,大家学

honghe 发表于 2008-1-22 08:39:20

支持楼主,支持原创

yybns 发表于 2008-2-13 17:44:34

支持楼主,支持原创

anson2416 发表于 2008-2-13 22:02:11

支持楼主,支持原创

ggyy3000 发表于 2008-2-14 01:52:33

谢谢楼主,好破文学习了~~

coolher 发表于 2008-2-14 11:34:07

我也好好学习,我要学习网络验证

三月樱花恋 发表于 2008-2-19 10:07:45

求教

求教~
哪位大哥发个破解诛仙外挂的帖子啊~
看半天看不懂~顺便把要用的软件写下~一篇文章写下来~我们菜鸟都不知道怎么弄出来的那些函数~什么东东~肯定郁闷~你们高手写的确实不错~但是对菜鸟来说是天书~你们看到回帖应该知道~大部分回答都是~看不懂~!!!!!

月光恋人 发表于 2008-3-20 15:19:25

不错。。学习下。。感谢提供

jfeicom 发表于 2008-3-25 11:50:28

回复 1# 的帖子

又学习了,谢谢楼主
页: [1] 2
查看完整版本: 科隆某外挂去自校验去验证