科隆某外挂去自校验去验证
【文章标题】: 科隆某外挂去自校验去验证【文章作者】: 松松
【作者邮箱】: 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
一次一次的中断,发现堆栈窗口如下
0012EC906BC864E8 /CALL 到 CreateFileA 来自 mfc42.6BC864E2
0012EC940012EE8C |FileName = "C:\WINNT\system32\MSVRCT.DLL"
0012EC9840000000 |Access = GENERIC_WRITE
0012EC9C00000000 |ShareMode = 0
0012ECA00012EDC0 |pSecurity = 0012EDC0
0012ECA400000002 |Mode = CREATE_ALWAYS
0012ECA800000080 |Attributes = NORMAL
0012ECAC00000000 \hTemplateFile = NULL
ALT+F9返回到程序领空
004097B9 |. 56 PUSH ESI 返回到这里
004097BA |. 53 PUSH EBX
004097BB |. 8D4C24 18 LEA ECX,DWORD PTR SS:
004097BF |. E8 BE520000CALL <JMP.&mfc42.#6385_?Write@CFile@@UAE>
004097C4 |. 8D4C24 10 LEA ECX,DWORD PTR SS:
004097C8 |. E8 AF520000CALL <JMP.&mfc42.#2803_?Flush@CFile@@UAE>
004097CD |. 8D4C24 10 LEA ECX,DWORD PTR SS:
004097D1 |. E8 A0520000CALL <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 89520000CALL <JMP.&mfc42.#665_??1CFile@@UAE@XZ>
004097E7 |> B8 01000000MOV 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 937DFFFFCALL _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 787DFFFFCALL _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,继续调试
堆栈窗口
0012EF040040123E /CALL 到 CreateFileA 来自 _Tomato.0040123C
0012EF080012EF40 |FileName = "\\.\SICE"
0012EF0CC0000000 |Access = GENERIC_READ|GENERIC_WRITE
0012EF1000000003 |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012EF1400000000 |pSecurity = NULL
0012EF1800000003 |Mode = OPEN_EXISTING
0012EF1C00000080 |Attributes = NORMAL
0012EF2000000000 \hTemplateFile = NULL
0012EF040040126F /CALL 到 CreateFileA 来自 _Tomato.0040126D
0012EF080012EF54 |FileName = "\\.\NTICE"
0012EF0CC0000000 |Access = GENERIC_READ|GENERIC_WRITE
0012EF1000000003 |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012EF1400000000 |pSecurity = NULL
0012EF1800000003 |Mode = OPEN_EXISTING
0012EF1C00000080 |Attributes = NORMAL
0012EF2000000000 \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:
00408226. 8BCE MOV ECX,ESI
00408228. FF52 60 CALL DWORD PTR DS:
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,乱打的,然后点登陆。
堆栈窗口
0012CD480040C4CB /CALL 到 CreateFileA 来自 _Tomato2.0040C4C5
0012CD4C0223945C |FileName = "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\~ex48.tmp"
0012CD50C0000000 |Access = GENERIC_READ|GENERIC_WRITE
0012CD5400000000 |ShareMode = 0
0012CD5800000000 |pSecurity = NULL
0012CD5C00000002 |Mode = CREATE_ALWAYS
0012CD6000000080 |Attributes = NORMAL
0012CD6400000000 \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:,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:
0040C323 |. C685 1D01000>MOV BYTE PTR SS:,0
0040C32A |. 68 1C4B4100 PUSH _Tomato2.00414B1C
0040C32F |. 8BCD MOV ECX,EBP
0040C331 |. 8B42 0C MOV EAX,DWORD PTR DS:
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:
0040C883 |. 8B48 08 MOV ECX,DWORD PTR DS:
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替换,虽然我注册的还是比较早的,但还是第一次写破文,也没什么技术含量,大家将就
着看看吧。另外问一下各位大大,能不能给我一个龙族联盟的邀请号,谢谢。 晕晕的看不懂下米东西?` 嘿嘿,看的哟些晕!~ 现在这个游戏好像关F了吧 多转点精典的破解教程来到是挺好的。最好是新的。 学习了,谢谢 还是蛮深奥的 每帖必看,你说了半天,我知道了,就是他把dll加壳了,我记着有这回事了,我现在是爆破水平,建议以后把软件也带上,让我也照着练习练习
页:
[1]