目前使用的版本是 2.6.5,国内最有名的对战平台.
1. 先用PEiD查看VSClient.exe,发现如下信息:
UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
原来是UPX加壳,直接用UPX -d脱壳
2. VS有一些反Debug的机制,为ollydbg加上Phant0m插件,把OD隐藏起来
用OD加载VSClient.exe,用窗口方式启动war3.exe(参数-window),然后启动WarMHVIP3.5,
这时VS会弹出一个窗口: VS请您停止使用作弊软件!
好吧,重新加载VSClient.exe,ctrl+G,输入"TerminateProcess",F2设置断点,
再启动WarMHVIP3.5,走到断点:
0045B5C4 . 817C24 18 030>cmp dword ptr [esp+18], 103
0045B5CC . 75 09 jnz short 0045B5D7
0045B5CE . 6A 08 push 8 ; /ExitCode = 8
0045B5D0 . 56 push esi ; |hProcess
0045B5D1 . FF15 F4EA5400 call dword ptr [<&KERNEL32.TerminateP>; \TerminateProcess
0045B5D7 > 6A 00 push 0 ; /timer = NULL
原来是这里...但是VS从哪里开始检测的呢?如何获得WarMHVIP3.5的句柄?
继续测试,先启动WarMHVIP3.5,再启动VS,发现VS没有报作弊软件.
往上翻到456647处,看到了如下代码:
00456606 > \FF15 40F95400 call dword ptr [<&USER32.GetForegroun>; [GetForegroundWindow
0045660C . 8BF0 mov esi, eax
0045660E . 8D45 E4 lea eax, dword ptr [ebp-1C]
00456611 . 50 push eax ; /pProcessID
00456612 . 56 push esi ; |hWnd
00456613 . 8975 D4 mov dword ptr [ebp-2C], esi ; |
00456616 . FF15 30F95400 call dword ptr [<&USER32.GetWindowThr>; \GetWindowThreadProcessId
0045661C . FF75 E4 push dword ptr [ebp-1C] ; /ProcessId
0045661F . 6A 00 push 0 ; |Inheritable = FALSE
00456621 . 68 10040000 push 410 ; |Access = VM_READ|QUERY_INFORMATION
00456626 . FF15 24EB5400 call dword ptr [<&KERNEL32.OpenProces>; \OpenProcess
0045662C . 8945 EC mov dword ptr [ebp-14], eax
0045662F . 8B45 E4 mov eax, dword ptr [ebp-1C]
00456632 . 3B05 A00B5400 cmp eax, dword ptr [540BA0]
00456638 . 0F84 4B020000 je 00456889
0045663E . FF15 20EB5400 call dword ptr [<&KERNEL32.GetCurrent>; [GetCurrentProcessId
00456644 . 3945 E4 cmp dword ptr [ebp-1C], eax
00456647 . 0F84 3C020000 je 00456889
0045664D . 80A5 C0FAFFFF>and byte ptr [ebp-540], 0
我一下就想到了,原来是用GetForegroundWindow来获取句柄,所以解决办法就非常多了
直接修改地址456647的跳转,让程序走到不会检测下去的分支(VS会认为那个进程是它自己)
00456647 . 0F84 3C020000 je 00456889
修改为->
00456647 /E9 3D020000 jmp 00456889
0045664C |90 nop
保存,退出;
直接启动VSClient.exe,war.exe,WarMHVIP3.5.exe,发现不再提示有作弊软件!
继续看代码,发现原来VS做了很多检测,包括窗口类名,标题字符串,输出表等检测,
其中会忽略qq.exe,lsass.exe等进程,所以如果外挂用这些名字也可以避开检测....
另外VS也会定时对game.dll的部分代码段做校验,但是你总没办法对数据段做校验吧,
因为数据段是不断改变的.
基于以上资料,做个内存补丁方式的外挂,应该非常接近了吧。我的想法是,做个基于命令行
的外挂,运行在后台。至于内存补丁点嘛 ,跟踪目前能过VS的作弊软件,就能找到.
希望能给新人一点帮助
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!