免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

XX游戏驱动保护分析(实例A)

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继续执行。如果游戏保护检测的比较多怎么办呢?那我们也可以先备份一下然后慢慢的想办法。

随记:过保护真的很不容易,蓝屏、死机时刻伴随,就连老师都死机好几次,本节课也只是看了一下保护的大概,并没有真正过保护。

返回列表