编写自己的驱动过游戏保护-需要具备的理论知识

A、了解SSDT结构

        B、由SSDT索引号获取当前函数地址       

        C、如何获取索引号

        D、获取起源地址-判断SSDT是否被HOOK

        E、如何向内核地址写入自己代码

 

 A、了解SSDT结构

SSDT的全称是System Services Descriptor Table,系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable 这个表

typedef struct ServiceDescriptorTable {
   PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
   PVOID ServiceCounterTable(0);

 //包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。
   unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。
   PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
   } 
  用windbg 了解SSDT结构:

  windbg符号路径设置: srv*D:\WINDDK\symbols*http://msdl.microsoft.com/download/symbols

 

 poi

 

 B、由SSDT索引号获取当前函数地址 

  [[KeServiceDescriptorTable]+index*4]  

 C、如何获取索引号

 用工具

 D、获取起源地址-判断SSDT是否被HOOK

 MmGetSystemRoutineAddress

 E、如何向内核地址写入自己代码

   mov [xxx],xx //

   1、如何向SSDT表写入内容呢,这个表是被保护的 正常情况不能被写入

  方法有三

(1) 更改注册表 -最简单的做法

HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\

EnforceWriteProtection=0

HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\

DisablePagingExecutive=1


(2)改变CR0寄存器的第1位wp位 置0-常用

(3)通过Memory Descriptor List(MDL)-正规做法
MmCreateMdl

你可能感兴趣的:(驱动)