导入表注入(iathook)

头文件(hookMain.h)内容

cpp 复制代码
#pragma once
#include<Windows.h>

DWORD* g_iatAddr = NULL;
DWORD* g_unHookAddr = NULL;

BOOL InstallHook(); //安装钩子
BOOL UninstallHook(); //卸载钩子
DWORD* GetIatAddr(const char* dllName, const char* dllFuncName);

源文件(iatHookMain.cpp)内容

cpp 复制代码
#include "hookMain.h"

int WINAPI HookMessageBoxW( //必须指定调用约定,否则注入时会弹错误窗口
	HWND    hWnd,
	LPCWSTR lpText,
	LPCWSTR lpCaption,
	UINT    uType
)
{
	int result = MessageBoxA(0, "51hook", "提示", MB_OK);
	return result;
}

BOOL InstallHook() //安装钩子
{
	DWORD  dwOldProtect = 0;
	VirtualProtect(g_iatAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
	*g_iatAddr = (DWORD)HookMessageBoxW;
	VirtualProtect(g_iatAddr, 4, dwOldProtect, &dwOldProtect);
	return TRUE;
}

BOOL UninstallHook() //卸载钩子
{
	DWORD  dwOldProtect = 0;
	VirtualProtect(g_iatAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
	*g_iatAddr = (DWORD)g_unHookAddr;
	VirtualProtect(g_iatAddr, 4, dwOldProtect, &dwOldProtect);
	return TRUE;
}

DWORD* GetIatAddr(const char* dllName, const char* dllFuncName)
{
	HMODULE hModule = GetModuleHandleA(0); //获取当前进程exe文件模块句柄
	DWORD dwhModule = (DWORD)hModule;

	PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule; //获取dos头
	PIMAGE_NT_HEADERS  pNtHeader = (PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew + dwhModule); //获取NT头
	PIMAGE_OPTIONAL_HEADER pOptionHeader = &pNtHeader->OptionalHeader; //获取可选PE头
	IMAGE_DATA_DIRECTORY dataDirectory = pOptionHeader->DataDirectory[1]; //获取数据目录表
	PIMAGE_IMPORT_DESCRIPTOR pImageImportTable = (PIMAGE_IMPORT_DESCRIPTOR)(
		dataDirectory.VirtualAddress + dwhModule); //获取导入表
	while (pImageImportTable->Name) //	遍历导入表获取符合条件的函数
	{
		char* iatDllName = (char*)(pImageImportTable->Name + dwhModule);
		if (_stricmp(iatDllName, dllName) == 0)
		{
			PIMAGE_THUNK_DATA pInt = (PIMAGE_THUNK_DATA)(pImageImportTable->OriginalFirstThunk
				+ dwhModule); //获取导入名称表
			PIMAGE_THUNK_DATA pIat = (PIMAGE_THUNK_DATA)(pImageImportTable->FirstThunk
				+ dwhModule); //获取导入地址表

			while (pInt->u1.Function)
			{
				if ((pInt->u1.Ordinal & 0x8000000) == 0)
				{
					PIMAGE_IMPORT_BY_NAME pImportName = (PIMAGE_IMPORT_BY_NAME)(pInt->u1.Function + dwhModule);
					if (_stricmp(pImportName->Name, dllFuncName) == 0)
					{
						return (DWORD*)pIat;
					}
				}
				++pInt;
			}

		}

		++pImageImportTable;
	}
	return NULL;
}


BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD callReason, LPVOID lpReservered)
{
	if (callReason == DLL_PROCESS_ATTACH)
	{
		/**
		 * 1 获取iat表
		 * 2 保存要hook的函数地址
		 * 3 安装钩子
		 */
		g_iatAddr = GetIatAddr("user32.dll", "MessageBoxW");
		g_unHookAddr = (DWORD*)* g_iatAddr;
		InstallHook();
	}
	else if (callReason == DLL_PROCESS_DETACH)
	{
		UninstallHook();
	}
	return TRUE;
}
相关推荐
福建佰胜张工9 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop9 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
贾伟康13 小时前
【化学实验室|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
安全·移动开发·harmonyos·arkts·arkui
wangruofeng13 小时前
黑色十月:AI 找到的漏洞,两小时数十万次利用
人工智能·安全·php
万联WANFLOW14 小时前
LiteLLM 1.107.0 投毒排查实战:依赖、Docker、CI 环境分别怎么查?
安全·docker·llm
A1Book14 小时前
Win11 开机项治理方案:四层扫描、分级决策与可回滚落地
windows
hz5678915 小时前
企业视频会议系统方案:总部与分支机构高效协同如何落地?
运维·服务器·网络·安全·实时音视频·信息与通信
三垣网安15 小时前
漏洞实战|高校虚拟实验平台报错型 SQL 注入漏洞复现
网络·经验分享·sql·安全·web安全·网络安全·水平越权
sun1536902757215 小时前
露天矿边坡滑坡怎么预警?QY-19GNSS 自动化地表位移监测系统介绍
运维·安全·自动化
长不大的杨瑞杰15 小时前
给 OpenCode v2 接入大模型:Provider、模型选择与 API Key 安全配置实战
人工智能·安全·ai·语言模型