和x86没什么两样,就是HOOK代码不同而已~~
还是推荐用 Detours,稳定高效!!!

HOOK原理如下:

// HOOK指令长度
#define HOOK_LEN 0xC
// 保存原始指令
BYTE Ori_Code[HOOK_LEN] = {0x00}; 

// Hook代码
/*   方式一
MOV RAX, 0x9090909090909090
PUSH RAX
RET
*/
BYTE HookCode[HOOK_LEN] = 
{
	0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x50, 0xC3
};

/*   方式二
MOV RAX, 0x9090909090909090
JMP RAX
*/
/*
BYTE HookCode[HOOK_LEN] = 
{
	0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0
};
*/


VOID HookAPI();
VOID UnHookAPI();

static int (WINAPI *kernel_MessageBoxW)(
	HWND hWnd,
	LPCTSTR lpText,
	LPCTSTR lpCaption,
	UINT uType
	) = MessageBoxW;

int WINAPI MyMessageBoxW(
	HWND hWnd,
	LPCTSTR lpText,
	LPCTSTR lpCaption,
	UINT uType
	)
{
	UnHookAPI();
	int ret = kernel_MessageBoxW(hWnd, TEXT("Hooked!!"), TEXT("hi"), MB_OK);
	HookAPI();
	return ret;
}

VOID HookAPI()
{
	DWORD OldProtect;
	::VirtualProtect(kernel_MessageBoxW, HOOK_LEN, PAGE_EXECUTE_READWRITE, &OldProtect);
	// 得到原始指令
	memcpy(Ori_Code, kernel_MessageBoxW, HOOK_LEN);  
	// 填充跳转地址
	*(PINT64)(HookCode+2) = (INT64)&MyMessageBoxW;
	memcpy(kernel_MessageBoxW, &HookCode, sizeof(HookCode));
}

VOID UnHookAPI()
{
	memcpy(kernel_MessageBoxW, &Ori_Code, sizeof(HookCode));	
}

VOID main()
{
	MessageBoxW(NULL, TEXT("hello"), TEXT("P.Y.G"), MB_OK);
	HookAPI();
	MessageBoxW(NULL, TEXT("hello"), TEXT("P.Y.G"), MB_OK);
	system("pause");
}


评论区

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。