首页
社区
课程
招聘
[原创]科隆某外挂去自校验去验证
发表于: 2006-3-21 11:07 5945

[原创]科隆某外挂去自校验去验证

2006-3-21 11:07
5945
【文章标题】: 科隆某外挂去自校验去验证
【文章作者】: 松松
【作者邮箱】: 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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
番茄科隆
2006-3-21 11:12
0
雪    币: 221
活跃值: (44)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
.....不讨论软件名称。。。。
2006-3-21 11:16
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
太强了,可以发这个外挂给我么?我太太太想要了,我就是为了这个挂才想学破解的。不过学破解好难啊,继续学怎么用OllyDBG。。。。
2006-3-21 14:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你好啊 楼主 我也是遇到了 验证上的问题 我的QQ号 8953039 是否可以加我 或者告诉我 你得号码 谢谢啦
2006-3-22 16:41
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主,我是龙族联盟论坛的会员,你要的邀请是什么意思呀?
我想帮你,但不太懂,加我的QQ吧,我试试看能不能帮到你
QQ:316863625
2006-3-22 17:27
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
楼主 你的这个壳什么怎么脱的呢 在论坛上 发个脱壳过程出来看下啊
2006-3-23 12:47
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
保存。。。。继续跟下去也没发现什么东西了。
  由于没有这个游戏,也没办法验证到底还有没有暗桩。
  收工。

有   不搞完 进去后F12呼不出外挂 搞了部分 就算外挂呼出来 部分功能不可用
这样破解是最初番茄1.5E 版本的方法 到以后就变了
现在都是2.0X了
2006-4-5 18:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这是我以前1.5FII 记的笔记  可以正常使用的 不过现在对2.0F失效了吧

番茄1.5FII
先打开番茄 ID随便填 然后打开OD  点文件附加 载入番茄
bp MessageBoxExA 下错误消息窗口的断点
番茄点登陆 OD断下来  双击取消断点 然后ctrl+f9执行到返回
番茄错误窗口跳出来了  点确定
OD中断在系统领空  然后F8 单步走几步
0040C302     C2 1400             retn 14
0040C305     8BCD                mov ecx,ebp
0040C307     E8 44050000         call corum1_5.0040C850
0040C30C     84C0                test al,al
0040C30E     74 28               je short corum1_5.0040C338
0040C310     8B55 08             mov edx,dword ptr ss:[ebp+8]
0040C313     C685 1D010000 00    mov byte ptr ss:[ebp+11D],0
0040C31A     68 CC4A4100         push corum1_5.00414ACC
0040C31F     8BCD                mov ecx,ebp
0040C321     8B42 0C             mov eax,dword ptr ds:[edx+C]
0040C324     50                  push eax
0040C325     E8 86050000         call corum1_5.0040C8B0
0040C32A     5F                  pop edi                              ; 0012DCAD

到这里 上一个call应该就是messagebox函数调用了 然后往上找第一个跳转 0040c30e
在往上0040c307 这个应该就是关键call了
好了 基本上找到地方了  F9让程序运行 然后在0040c305 F2下断点
点番茄登陆断下来
F8开始跟
0040C305     8BCD                mov ecx,ebp
0040C307     E8 44050000         call corum1_5.0040C850               ; 关键call F7跟进去
0040C30C     84C0                test al,al
0040C30E     74 28               je short corum1_5.0040C338
0040C310     8B55 08             mov edx,dword ptr ss:[ebp+8]

跟进的call
0040C850     8B41 04             mov eax,dword ptr ds:[ecx+4]         ; 08是服务器的 04是本地的吧 因为服务器验证是错的 所以这里改为本地的 改04
0040C853     8B50 08             mov edx,dword ptr ds:[eax+8]         ; eax+8这个机器码很重要 以后都是根据这个机器码比较的 用个记事本记下来 我这里是98069ce43a0c8fa247d6d2058ac8095d  可能每台机器都不一样
0040C856     8B41 04             mov eax,dword ptr ds:[ecx+4]
0040C859     52                  push edx
0040C85A     8B48 08             mov ecx,dword ptr ds:[eax+8]
0040C85D     51                  push ecx
0040C85E     FF15 18C5AA00       call dword ptr ds:[AAC518]           ; stricmp对两字符串进行小写形式的对比, 返回为0表示完全一致
0040C864     83C4 08             add esp,8
0040C867     85C0                test eax,eax                         ; 这里也可以做为一个破解点 xor eax,eax
0040C869     0F95C0              setne al                             ; 这里也可以 改sete al
0040C86C     C3                  retn

以上三处改哪里都可以
出call
0040C30C     84C0                test al,al
0040C30E     74 28               je short corum1_5.0040C338           ; 这里跳
0040C310     8B55 08             mov edx,dword ptr ss:[ebp+8]
0040C313     C685 1D010000 00    mov byte ptr ss:[ebp+11D],0
0040C31A     68 CC4A4100         push corum1_5.00414ACC
...............省略一部分  来到这里
0040D4AA    /7E 0F               jle short corum1_5.0040D4BB
0040D4AC    |803410 02           xor byte ptr ds:[eax+edx],2          ; 取每一个机器码的acciss码和2做异或运算
0040D4B0    |40                  inc eax                              ; 记数器
0040D4B1    |3BC1                cmp eax,ecx
0040D4B3   ^|7C F7               jl short corum1_5.0040D4AC           ; 这里是一个循环
0040D4B5    |8B2D D8524100       mov ebp,dword ptr ds:[4152D8]        ; 这里设置断点 F9跳过循环
0040D4BB    \8B56 04             mov edx,dword ptr ds:[esi+4]         ; 这里又是取服务器的错误信息 给他换成本地的 04
0040D4BE     8B85 14010000       mov eax,dword ptr ss:[ebp+114]
0040D4C4     85C0                test eax,eax
0040D4C6     8B7A 08             mov edi,dword ptr ds:[edx+8]         ; 这里edx+8就是刚才加密出来的机器码了
好了 继续F8往下跟 省略一些
0040D502     8B56 04             mov edx,dword ptr ds:[esi+4]         ; 还是老样子 又一次度读取错误信息 继续换04
0040D505     8B52 08             mov edx,dword ptr ds:[edx+8]         ; 加密后的机器码
0040D508     8BFA                mov edi,edx
0040D50A     F2:AE               repne scas byte ptr es:[edi]
0040D50C     F7D1                not ecx
0040D50E     49                  dec ecx
0040D50F     85C9                test ecx,ecx
0040D511     7E 09               jle short corum1_5.0040D51C
0040D513     803410 02           xor byte ptr ds:[eax+edx],2
0040D517     40                  inc eax
0040D518     3BC1                cmp eax,ecx
0040D51A   ^ 7C F7               jl short corum1_5.0040D513           ; 这里的循环机器码是把刚才加密的还原回来了 我是没理解他这样做的意思
0040D51C     8B46 08             mov eax,dword ptr ds:[esi+4]         ; 这里又一次验证 老样子 改04
0040D51F     8B0D D8524100       mov ecx,dword ptr ds:[4152D8]
0040D525     81C1 A4010000       add ecx,1A4
0040D52B     8B40 08             mov eax,dword ptr ds:[eax+8]
0040D52E     50                  push eax                             ;这里把98069ce43a0c8fa247d6d2058ac8095d这个机器码压入堆栈

好了 就这5个验证的地方  全部验证都是围绕0048c053这里的这个机器码来完成
总结一下5个地址
     WriteProcessMemory DRProcessHandle, &H40C852, &H4, 1, 0&
    WriteProcessMemory DRProcessHandle, &H40D49A, &H4, 1, 0&
    WriteProcessMemory DRProcessHandle, &H40D4BD, &H4, 1, 0&
    WriteProcessMemory DRProcessHandle, &H40D504, &H4, 1, 0&
    WriteProcessMemory DRProcessHandle, &H40D51E, &H4, 1, 0&

用VB生成程序  然后进游戏 F12就能呼出界面了
2006-4-5 19:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主
厉害啊
好好向你学习,多来看你的帖子了
2006-4-5 20:03
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
厉害!要好好学习了!
2006-4-5 21:41
0
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
支持!!!
2006-4-5 22:02
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵,怎么看上去这么熟呢
2006-4-11 01:41
0
游客
登录 | 注册 方可回帖
返回
//