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

Win2K下的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进行拦截例子来说明:
    其中Dll文件为:
    //---------------------------------------------------------------------------

    #include <windows.h>
    //---------------------------------------------------------------------------
    //   Important note about DLL memory management when your DLL uses the
    //   static version of the RunTime Library:
    //
    //   If your DLL eXPorts any functions that pass String objects (or strUCts/
    //   classes containing nested Strings) as parameter or function results,
    //   you will need to add the library MEMMGR.LIB to both the DLL project and
    //   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
    //   if any other projects which use the DLL will be performing new or delete
    //   operations on any non-TObject-derived classes which are exported from the


 

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接