用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> #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); }