Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15210524
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-31 09:11:37

本文一介绍第二种方法在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进行拦截例子来说明: 
阅读(396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~