当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

Api函数的拦截实例分析

本文一介绍第二种方法在Win2k下的使用。第二种方法,Win98/me 下因为进入Ring0级的方法很多,有LDT,IDT,Vxd等方法,很容易在内存中动态修改代码,但在Win2k下,这些方法都不能用,写WDM太过复杂,表面上看来很难实现,其实不然。Win2k为我们提供了一个强大的内存Api操作函数---VirtualProtectEx,WriteProcessMemeory,ReadProcessMemeory,有了它们我们就能在内存中动态修改代码了,其原型为: 

BOOL VirtualProtectEx( 
 HANDLE hProcess, // 要修改内存的进程句柄 
 LPVOID lpAddress, // 要修改内存的起始地址 
 DWORD dwSize, // 修改内存的字节 
 DWORD flNewProtect, // 修改后的内存属性 
 PDWORD lpflOldProtect // 修改前的内存属性的地址 
); 
BOOL WriteProcessMemory( 
 HANDLE hProcess, // 要写进程的句柄 
 LPVOID lpBaseAddress, // 写内存的起始地址 
 LPVOID lpBuffer, // 写入数据的地址 
 DWORD nSize, // 要写的字节数 
 LPDWORD lpNumberOfBytesWritten // 实际写入的子节数 
); 
BOOL ReadProcessMemory( 
 HANDLE hProcess, // 要读进程的句柄 
 LPCVOID lpBaseAddress, // 读内存的起始地址 
 LPVOID lpBuffer, // 读入数据的地址 
 DWORD nSize, // 要读入的字节数 
 LPDWORD lpNumberOfBytesRead // 实际读入的子节数 
); 

  具体的参数请参看MSDN帮助。在Win2k下因为Dll和所属进程在同一地址空间,这点又和Win9x/me存在所有进程存在共享的地址空间不同,因此,必须通过钩子函数和远程注入进程的方法,现以一个简单采用钩子函数对MessageBoxA进行拦截例子来说明:  
相关内容
赞助商链接