A、保护情况分析
B、猜测相关原理
C、过保护让CE能查找到数据的相关分析
D、过保护让CE能修改数据的相关分析
A 保护情况分析
游戏1:CE找不到游戏数据
游戏2:CE查找不到游戏数据
122//NtOpenProcess ssdt=0x805cc3FA //OpenProcss jmp 0x805cc3FA
//NtReadVirtualMemory ssdt=0x805b526E //ReadProcessMemory
//NtWriteVirtualMemory ssdt=0x805B5378//WriteProcessMemory
const GameCaption='游戏标题';
procedure TForm1.Button1Click(Sender: TObject);
var
h:hwnd;
PMessageBoxA:PDWORD;
s,s2:string;
pid:Thandle;
Game_PH,data,i,forRead:DWORD;
c1,c2:string;
begin
c1:='c1';
c2:='c2';
h:=FindWindow(nil,GameCaption);
s:=intToHex(h,8);
self.Memo1.Lines.Add('Game_HWND='+s);
windows.GetWindowThreadProcessId(h,pid);
s:=intToHex(pid,8);
s2:=intTostr(pid);
self.Memo1.Lines.Add('Game_PID='+s+','+s2);
Game_PH:=windows.OpenProcess(windows.PROCESS_ALL_ACCESS,false,pid);
self.Memo1.Lines.Add('过保护测试 成功') ;
s:=intToHex(Game_PH,8);
s2:=intTostr(Game_PH);
PMessageBoxA:=Windows.GetProcAddress(GetModuleHandle(windows.user32),'MessageBoxA');
//正常情况 PMessageBoxA^=$8B55FF8B;
self.Memo1.Lines.Add('Game_PH='+s+','+s2+',PMessageBoxA^='+intToHex(PMessageBoxA^,8));
ReadProcessMemory(Game_PH,Pointer(@MessageBoxA),@data,20*4,forRead);
if (data=$8B55FF8B) then self.Memo1.Lines.Add('过保护测试 成功')
else self.Memo1.Lines.Add('过保护测试 失败');
end;
push [ebp-38]
push [ebp-24]
0x805CC619
0x805CC61E call ObOpenObjectByPointer
call A63DFD9C
/////分析结果
0x805CC89A
call 805BCC5C
0x805CC89A
//ff 75 cc ff 75 e0
FF75 CC push [ebp-34]
FF75 E0 push [ebp-20]
call ObOpenObjectByPointer
u 0x805CC61A
kd> u 0x805CC61A
nt!NtOpenProcess+0x21e:
805cc61a ff75c8 push dword ptr [ebp-38h]
805cc61d ff75dc push dword ptr [ebp-24h]
805cc620 e84706ffff call nt!ObOpenObjectByPointer (805bcc6c)
805cc625 8bf8 mov edi,eax
805cc627 8d8548ffffff lea eax,[ebp-0B8h]
u 0x805CC89A +8-6
nt!NtOpenThread+0x214:
805cc89c ff75cc push dword ptr [ebp-34h]
805cc89f ff75e0 push dword ptr [ebp-20h]
805cc8a2 e8c503ffff call nt!ObOpenObjectByPointer (805bcc6c)
805cc8a7 8bf8 mov edi,eax
805cc8a9 8d854cffffff lea eax,[ebp-0B4h]
805cc8af 50 push eax
805cc8b0 e8c5520200 call nt!SeDeleteAccessState (805f1b7a)
805cc8b5 8b4de0 mov ecx,dword ptr [ebp-20h]
=========================================================
笔记:
太激动人心了,终于要实例分析XXXX和XXX游戏了
A部分:首先看一下XXXX游戏,在系统服务描述符表里里面修改了3个函数,用CE扫描任何数据都无显示.我们记一下原有的地址,然后用工具将第1个地址JMP回原有地址,再看一下系统内存出错了,打开任何程序都提示无效.哦原来是刚才地址改错了,再改一下已经正确了,还有2个地址也得改回来,CE已经能够正常的运行了.
B部分:与A部分完全相同,这老师也太粗心大意了啊!
C部分:刚刚因为更改了驱动代码必须从新启动电脑,这次调试XXX游戏, 这款游戏比刚才那款还在厉害些,有包含对CE/XT驱动工具等工具的检测,还好我们可以用KD驱动工具,找开KD后并没有发现HOOK,只是在系统通知回调中发现了其SYS文件.那么为什么KD工具没有看出来呢,因为它只检测驱动头部的前几个字节,如果更深层一些就不知道了,那么如何判断呢?我们可以靠猜的~ 打开DELPHI写好一段代码,测试作用是看指定的内存是否被正确的读取(代码在教案中).也就是通过MessBoxA函数的地址进行读取看是否值正确.读取一下果然是失败了,也就是说OpenProcess或ReadMemory被HOOK了,看来这款游戏保护很强啊.还是用KD工具打开NtOpenProcess函数,保存其中的二进制数据,也就是里面的代码.将游戏退出后保护就被取消了,此时再打开KD工具保存未被HOOK的数据,将两个数据用UltraCompare来比较看哪里不同.
D部分:刚才是UltraCompare路径放错了没比较好,再新来一次,这次对比出来在254也就是75行出现不同0x805CC8A0,那么用工具转到该地址查看一下究竟是一段什么样的代码,原来是直接CALL到另外一个地址,也就是修改了4个字节.将代码记下后再次打开游戏,看到游戏的保护确实有这样的过滤函数.我们改回一下被HOOK的地址,再用我们自己的DELHI工具测试一下仍然是不行.再看一下其它的位置是否也有被修改的…老师在代码中翻来翻去的,我都看晕了.好,又找到一个地址也被HOOK了.再用UltraCompare仔细查看一下差别.总共查到了2个HOOK……
E部分: 刚才改了代码却死机了,在虚拟机下对函数进行分析,为什么不在虚拟机下开启游戏呢?因为保护程序都防止在虚拟机下打开。将虚拟机下的数据与本机进行比较。
F部分:游戏是在函数的关键跳地址进行了检测,那么我们在其之前进行HOOK然后再返回来跳过他的HOOK继续执行。如果游戏保护检测的比较多怎么办呢?那我们也可以先备份一下然后慢慢的想办法。
随记:过保护真的很不容易,蓝屏、死机时刻伴随,就连老师都死机好几次,本节课也只是看了一下保护的大概,并没有真正过保护。 |