Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14498065
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:58:54

下载本文示例代码
  简介:   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进行拦截例子来说明: 共2页。 1 2 :   简介:   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进行拦截例子来说明: 共2页。 1 2 : 下载本文示例代码


Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析Windows 2000下Api函数的拦截分析
阅读(81) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~