【文章标题】: 科隆某外挂去自校验去验证
【文章作者】: 松松
【作者邮箱】: dongmenbianxue@163.com
【软件名称】: 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:[ESP+18]
004097BF |. E8 BE520000 CALL <JMP.&mfc42.#6385_?Write@CFile@@UAE>
004097C4 |. 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
004097C8 |. E8 AF520000 CALL <JMP.&mfc42.#2803_?Flush@CFile@@UAE>
004097CD |. 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
004097D1 |. E8 A0520000 CALL <JMP.&mfc42.#1979_?Close@CFile@@UAE>
004097D6 |. 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
004097DA |. C74424 28 FFF>MOV DWORD PTR SS:[ESP+28],-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:[ESP+20]
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:[ESP+34]
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:[ESP+70]
004099A1 |. 50 PUSH EAX ; /FileName
004099A2 |. FF15 E4924800 CALL DWORD PTR DS:[<&kernel32.LoadLibrar>; \LoadLibraryA 来到这里
004099A8 |. 8D4C24 4C LEA ECX,DWORD PTR SS:[ESP+4C]
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:[ESP+4C]
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 2091FFFF CALL _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:[ESI]
00408226 . 8BCE MOV ECX,ESI
00408228 . FF52 60 CALL DWORD PTR DS:[EDX+60]
0040822B . 8BCF MOV ECX,EDI
0040822D . E8 CE90FFFF CALL _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 C1210000 CALL _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 CA90FFFF CALL _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 9D210000 CALL _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 081B0000 CALL _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 D5050000 CALL _Tomato2.0040C8C0 这里开始验证了
0040C2EB |. 84C0 TEST AL,AL
0040C2ED |. 74 26 JE SHORT _Tomato2.0040C315
0040C2EF |. 68 0C4B4100 PUSH _Tomato2.00414B0C
0040C2F4 |. 68 DC4A4100 PUSH _Tomato2.00414ADC
0040C2F9 |. 8BCD MOV ECX,EBP
0040C2FB |. C685 1D01000>MOV BYTE PTR SS:[EBP+11D],0
0040C302 |. E8 D9050000 CALL _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 64050000 CALL _Tomato2.0040C880 <关键F7跟进
0040C31C |. 84C0 TEST AL,AL
0040C31E |. 74 28 JE SHORT _Tomato2.0040C348
0040C320 |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
0040C323 |. C685 1D01000>MOV BYTE PTR SS:[EBP+11D],0
0040C32A |. 68 1C4B4100 PUSH _Tomato2.00414B1C
0040C32F |. 8BCD MOV ECX,EBP
0040C331 |. 8B42 0C MOV EAX,DWORD PTR DS:[EDX+C]
0040C334 |. 50 PUSH EAX
0040C335 |. E8 A6050000 CALL _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:[ECX+8]
0040C883 |. 8B48 08 MOV ECX,DWORD PTR DS:[EAX+8]
0040C886 |. 51 PUSH ECX ; /s2 = "Failed"
0040C887 |. 68 704C4100 PUSH _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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!