设为首页 加入收藏

TOP

Windows 2000下Api函数的拦截分析(一)
2012-11-04 15:33:01 来源: 作者: 【 】 浏览:590
Tags:Windows 2000 Api 函数 拦截 分析
  简介:

  Api拦截并不是一个新的技术,很多商业软件都采用这种技术。对windows的Api函数的拦截,不外乎两种方法,第一种是Mr. Jeffrey Richter 的修改exe文件的模块输入节,种方法,很安全,但很复杂,而且有些exe文件,没有Dll的输入符号的列表,有可能出现拦截不到的情况。第二种方法就是常用的JMP XXX的方法,虽然很古老,却很简单实用。

  本文一介绍第二种方法在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进行拦截例子来说明:

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇二、Windows简史 下一篇VC++下借助DBGird控件显示数据库..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: