API HOOK

时间:2020-05-31 21:39:43   收藏:0   阅读:87

简介

inline HOOK

inline HOOK 代码

#include <iostream>
#include<Windows.h>

char g_old[5];             //api函数前5个opcode
char g_new[5] = { 0xE9 };  //新的前5个 jmp xxxx
void UnHook();
void OnHook();


int WINAPI
MyMessageBoxW(
	_In_opt_ HWND hWnd,
	_In_opt_ LPCWSTR lpText,
	_In_opt_ LPCWSTR lpCaption,
	_In_ UINT uType)
{
	lpText = L"你已经被hook了";
	//卸载钩子
	UnHook();
	//调用原函数地址
	int nRet = MessageBoxW(hWnd, lpText, lpCaption, uType);
	return nRet;
}

void OnHook()
{
	//保存修改前的5个字节
	memcpy(g_old, MessageBoxW, 5);
	//计算偏移量
	DWORD dwOffset = (DWORD)MyMessageBoxW -            // 目标地址(自己的函数) - 当前函数地址 - 5 = 跳转偏移
		(DWORD)MessageBoxW - 5;                        // jmp 后是一个偏移 :偏移是从 jmp xxxxx 后算起

	//构造跳转指令
	memcpy(g_new + 1, &dwOffset, 4);                   //构造跳转偏移
	
	//写入构造跳转(HOOK)
	//修改写入地址属性(代码段没有可写属性)
	DWORD dwOld;
	VirtualProtect(MessageBoxW, 5, PAGE_READWRITE, &dwOld);
	//修改指令
	memcpy(MessageBoxW, g_new, 5);

	//恢复原来属性
	VirtualProtect(MessageBoxW, 5, dwOld, &dwOld);

}

void UnHook()
{
	DWORD dwOld;
	VirtualProtect(MessageBoxW, 5, PAGE_READWRITE, &dwOld);
	//修改指令
	memcpy(MessageBoxW, g_old, 5);

	//恢复原来属性
	VirtualProtect(MessageBoxW, 5, dwOld, &dwOld);
}



int main()
{
	MessageBox(0, 0, 0, 0);
	OnHook();
	MessageBox(0, 0, 0, 0);
	UnHook();
	MessageBox(0, 0, 0, 0);
	return 0;
}
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!