15,471
社区成员
发帖
与我相关
我的任务
分享
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#pragma once
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CApiHook 类
class CApiHook
{
private:
PCSTR m_pszModName;
PCSTR m_pszApiName;
PVOID m_pvNew;
PVOID m_pvOrg;
CApiHook *m_pNext;
static CApiHook *m_pHead;
public:
static HMODULE m_hModule;
public:
template <typename T> operator T() {return (T) m_pvOrg;}
CApiHook(PCSTR pszModName, PCSTR pszApiName, PVOID pvNew);
~CApiHook();
public:
PVOID Hook(PBYTE pbModule);
static VOID Hook(HMODULE hModule);
static VOID Hook();
private:
static CApiHook m_ahLoadLibraryA;
static CApiHook m_ahLoadLibraryW;
static CApiHook m_ahLoadLibraryExA;
static CApiHook m_ahLoadLibraryExW;
static CApiHook m_ahGetProcAddress;
private:
static HMODULE WINAPI AHLoadLibraryA(PCSTR pszPath);
static HMODULE WINAPI AHLoadLibraryW(PCWSTR pwzPath);
static HMODULE WINAPI AHLoadLibraryExA(PCSTR pszPath, HANDLE hFile, DWORD dwFlags);
static HMODULE WINAPI AHLoadLibraryExW(PCWSTR pwzPath, HANDLE hFile, DWORD dwFlags);
static FARPROC WINAPI AHGetProcAddress(HMODULE hModule, PCSTR pszName);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "PoBind.h"
#include "ApiHook.h"
#include <TlHelp32.h>
#pragma warning(disable: 4312)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 成员变量
HMODULE CApiHook::m_hModule = NULL;
CApiHook *CApiHook::m_pHead = NULL;
CApiHook CApiHook::m_ahLoadLibraryA("Kernel32.dll", "LoadLibraryA", CApiHook::AHLoadLibraryA);
CApiHook CApiHook::m_ahLoadLibraryW("Kernel32.dll", "LoadLibraryW", CApiHook::AHLoadLibraryW);
CApiHook CApiHook::m_ahLoadLibraryExA("Kernel32.dll", "LoadLibraryExA", CApiHook::AHLoadLibraryExA);
CApiHook CApiHook::m_ahLoadLibraryExW("Kernel32.dll", "LoadLibraryExW", CApiHook::AHLoadLibraryExW);
CApiHook CApiHook::m_ahGetProcAddress("Kernel32.dll", "GetProcAddress", CApiHook::AHGetProcAddress);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 构造函数
CApiHook::CApiHook(PCSTR pszModName, PCSTR pszApiName, PVOID pvNew)
{
m_pszModName = pszModName;
m_pszApiName = pszApiName;
m_pvNew = pvNew;
m_pvOrg = GetProcAddress(GetModuleHandleA(pszModName), pszApiName);
m_pNext = m_pHead;
m_pHead = this;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 析购函数
CApiHook::~CApiHook()
{
CApiHook *p = m_pHead;
if (p == this)
{
m_pHead = p->m_pNext;
}
else
{
for (; p->m_pNext; p = p->m_pNext)
{
if (p->m_pNext == this)
{
p->m_pNext = m_pNext;
break;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 挂接函数
PVOID CApiHook::Hook(PBYTE pbModule)
{
PIMAGE_NT_HEADERS p = (PIMAGE_NT_HEADERS) (pbModule + ((PIMAGE_DOS_HEADER) pbModule)->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR q = (PIMAGE_IMPORT_DESCRIPTOR) (pbModule +
p->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
for (; q->Name; q++)
{
if (strcmpi(m_pszModName, (PCSTR) (pbModule + q->Name)) == 0)
{
for (PIMAGE_THUNK_DATA r = (PIMAGE_THUNK_DATA) (pbModule + q->FirstThunk); r->u1.Function; r++)
{
if ((FARPROC) r->u1.Function == m_pvOrg)
{
WriteProcessMemory(GetCurrentProcess(), &r->u1.Function, &m_pvNew, sizeof(PVOID), NULL);
return m_pvOrg;
}
}
}
}
return NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 挂接所有函数
VOID CApiHook::Hook(HMODULE hModule)
{
for (CApiHook *p = m_pHead; p; p = p->m_pNext)
{
if (p->m_pvOrg)
{
p->Hook((PBYTE) hModule);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 挂接所有模块
VOID CApiHook::Hook()
{
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
if (hSnap != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 meModule = {sizeof(MODULEENTRY32)};
for (BOOL bResult = Module32First(hSnap, &meModule); bResult; bResult = Module32Next(hSnap, &meModule))
{
if (meModule.hModule != m_hModule)
{
Hook(meModule.hModule);
}
}
CloseHandle(hSnap);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 载入
HMODULE WINAPI CApiHook::AHLoadLibraryA(PCSTR pszPath)
{
HMODULE hModule = LoadLibraryA(pszPath);
if (hModule)
{
Hook(hModule);
}
return hModule;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 载入
HMODULE WINAPI CApiHook::AHLoadLibraryW(PCWSTR pwzPath)
{
HMODULE hModule = LoadLibraryW(pwzPath);
if (hModule)
{
Hook(hModule);
}
return hModule;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 载入
HMODULE WINAPI CApiHook::AHLoadLibraryExA(PCSTR pszPath, HANDLE hFile, DWORD dwFlags)
{
HMODULE hModule = LoadLibraryExA(pszPath, hFile, dwFlags);
if (hModule && !(dwFlags & LOAD_LIBRARY_AS_DATAFILE))
{
Hook(hModule);
}
return hModule;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 载入
HMODULE WINAPI CApiHook::AHLoadLibraryExW(PCWSTR pwzPath, HANDLE hFile, DWORD dwFlags)
{
HMODULE hModule = LoadLibraryExW(pwzPath, hFile, dwFlags);
if (hModule && !(dwFlags & LOAD_LIBRARY_AS_DATAFILE))
{
Hook(hModule);
}
return hModule;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 获取地址
EXTERN_C PVOID _ReturnAddress();
FARPROC WINAPI CApiHook::AHGetProcAddress(HMODULE hModule, PCSTR pszName)
{
FARPROC pfn = GetProcAddress(hModule, pszName);
if (pfn)
{
MEMORY_BASIC_INFORMATION m = {0};
VirtualQuery(_ReturnAddress(), &m, sizeof(MEMORY_BASIC_INFORMATION));
if (hModule != (HMODULE) m.AllocationBase)
{
for (CApiHook *p = m_pHead; p; p = p->m_pNext)
{
if (p->m_pvOrg == NULL)
{
p->m_pvOrg = GetProcAddress(GetModuleHandleA(p->m_pszModName), p->m_pszApiName);
}
if (pfn == p->m_pvOrg)
{
pfn = (FARPROC) p->m_pvNew;
break;
}
}
}
}
return pfn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////