200分 HOOKAPI 的源码,自学编程,请多多关照

200分 求一个HOOKAPI 的源码,自学编程,请多多关照
小弟正在自学Windows核心编程里关于HOOKAPI部分,很多地方不明白,想求个源码,好参考。
注:要全局HOOK,至于是HOOK哪个函数,倒无所谓,主要是想学习一下全局HOOK的原理。
谢谢了!
请好心人给下源码下载的链接,或请发送到:studyhook@163.com

另一百分在这里,请到这里跟帖:


------解决方案--------------------
一个简单采用钩子函数对MessageBoxA进行拦截例子:
其中Dll文件为:
//---------------------------------------

#include <windows.h>

HHOOK g_hHook;
HINSTANCE g_hinstDll;
FARPROC fpMessageBoxA;

HMODULE hModule ;
BYTE OldMessageBoxACode[5], NewMessageBoxACode[5];
DWORD dwIdOld, dwIdNew;
BOOL bHook = false;

void HookOn();
void HookOff();
BOOL Init();
int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
//---------------------------------------
// 空的钩子函数
LRESULT WINAPI Hook(int nCode, WPARAM wParam, LPARAM lParam)
{
return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}
//---------------------------------------
// 输出,安装空的钩子函数
extern "C " __declspec(dllexport) __stdcall
BOOL InstallHook()
{
g_hinstDll = LoadLibrary( "test.dll "); // 这里的文件名为Dll本身的文件名
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)Hook, g_hinstDll, 0);
if (!g_hHook)
{
MessageBoxA(NULL, "SET ERROR ", "ERROR ", MB_OK);
return(false);
}
return(true);
}
//---------------------------------------
// 输出,Uninstall钩子函数
extern "C " __declspec(dllexport) __stdcall
BOOL UninstallHook()
{
return(UnhookWindowsHookEx(g_hHook));
}
//---------------------------------------
// 初始化得到MessageBoxA的地址,并生成Jmp XXX(MyMessageBoxA)的跳转指令
BOOL Init()
{
hModule = LoadLibrary( "user32.dll ");
fpMessageBoxA = GetProcAddress(hModule, "MessageBoxA ");
if(fpMessageBoxA == NULL)
return false;
_asm
{
pushad
lea edi, OldMessageBoxACode
mov esi, fpMessageBoxA
cld
movsd
movsb
popad
}
NewMessageBoxACode[0] = 0xe9; // jmp MyMessageBoxA的相对地址的指令
_asm
{
lea eax, MyMessageBoxA
mov ebx, fpMessageBoxA
sub eax, ebx
sub eax, 5
mov dword ptr [NewMessageBoxACode + 1], eax
}
dwIdNew = GetCurrentProcessId(); // 得到所属进程的ID
dwIdOld = dwIdNew;
HookOn(); // 开始拦截
return(true);
}
//---------------------------------------
// 首先关闭拦截,然后才能调用被拦截的Api 函数
int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption, UINT uType)
{
int nReturn;
HookOff();
nReturn = MessageBoxA(hWnd, "来自钩子中的内容 ", lpCaption, MB_OK | MB_ICONINFORMATION);
HookOn();
return(nReturn);
}
void HookOn()
{
HANDLE hProc;
dwIdOld = dwIdNew;
// 得到所属进程的句柄
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
// 修改所属进程中MessageBoxA的前5个字节的属性为可写
VirtualProtectEx(hProc, fpMessageBoxA, 5, PAGE_READWRITE,&dwIdOld);
// 将所属进程中MessageBoxA的前5个字节改为JMP 到MyMessageBoxA
WriteProcessMemory(hProc, fpMessageBoxA, NewMessageBoxACode, 5, 0);
// 修改所属进程中MessageBoxA的前5个字节的属性为原来的属性
VirtualProtectEx(hProc, fpMessageBoxA, 5, dwIdOld, &dwIdOld);
bHook=true;
}