用CreateFile为例子,讲解一下Ring3下的Inline Hook API,基本原理很简单
1、获取CreateFile函数的地址
2、读取CreateFile函数的前8个字节
3、将CreateFile函数的前8个字节,修改成mov eax,我的函数地址 jmp eax
4、进入我的函数地址之后,记得恢复CreateFile函数原来的8个字节,不然没法正常使用CreateFile
代码如下:
#include <windows.h> #include <stdio.h> #include <iostream.h> #include <tchar.h> //修改API入口为 mov eax, 00400000;jmp eax是程序能跳转到自己的函数 BYTE NewBytes[8] = {0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0}; BYTE OldBytes[8] = {0}; FARPROC CreateFile_Addr; HANDLE WINAPI MyCreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in HANDLE hTemplateFile ) { MessageBox(0,"MyCreateFile",0,0); //恢复API头8个字节 WriteProcessMemory( INVALID_HANDLE_VALUE, (void*)CreateFile_Addr, (void*)OldBytes, 8, NULL); printf("lpFileName is %s\n",lpFileName); //调用正确的函数 HANDLE hFile=CreateFileA(lpFileName,dwDesiredAccess,dwShareMode, lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile); //写入跳转语句,继续Hook WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)CreateFile_Addr, (void*)NewBytes, 8, NULL); return hFile; } void main() { HMODULE hModule_Kernel32 = LoadLibrary("Kernel32.dll"); CreateFile_Addr = GetProcAddress(hModule_Kernel32, "CreateFileA"); printf("CreateFileA_Addr is %x\n",CreateFile_Addr); printf("MyCreateFile Addr is %x\n",MyCreateFile); //读CreateFile函数的前8个字节 if(ReadProcessMemory(INVALID_HANDLE_VALUE,CreateFile_Addr,OldBytes,8,NULL)==0) { printf("ReadProcessMemory error\n"); return; } printf("OldBytes is %x%x%x%x%x%x%x%x\n",OldBytes[0],OldBytes[1],OldBytes[2], OldBytes[3],OldBytes[4],OldBytes[5],OldBytes[6],OldBytes[7]); //将NewBytes改成My函数地址 *(DWORD*)(NewBytes + 1) = (DWORD)MyCreateFile; printf("NewBytes is %x%x%x%x%x%x%x%x\n",NewBytes[0],NewBytes[1],NewBytes[2],NewBytes[3], NewBytes[4],NewBytes[5],NewBytes[6],NewBytes[7]); //写入跳转,开始Hook WriteProcessMemory(INVALID_HANDLE_VALUE,CreateFile_Addr,NewBytes,8,NULL); //调用CreateFileA测试一下。 HANDLE hFile=CreateFileA("C:\\1.txt",GENERIC_ALL,FILE_SHARE_READ,0,CREATE_ALWAYS,0,0); CloseHandle(hFile); }