本项目为使用Visual Studio 2010开发的C++版本EasyHook函数钩子示例程序,旨在帮助开发者理解和实现动态代码注入与API拦截技术。
目前最好的EasyHook的完整示例程序包括了Hook.dll动态库和Inject.exe注入程序。
Hook.dll动态库封装了一套稳定的挂钩机制,今后对函数进行挂钩只需要填写数组表格即可实现,这极大地简化了未来的使用过程。
Inject.exe部分是用MFC编写的界面程序。用户只需在界面上输入进程ID就能成功地对该进程进行挂钩操作,非常简便易用。
这个示例的代码风格非常好,在VS2010中可以稳定编译通过,值得下载和使用。
以下是两个关键的部分代码片段:
Inject.exe注入程序的代码如下所示:
```cpp
void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId()
{
UINT nProcessID = 0;
if (!GetProcessID(nProcessID))
{
TRACE(_T(%s GetProcessID 失败), __FUNCTION__);
return;
}
CString strPathDLL;
if (!GetDllFilePath(strPathDLL))
{
TRACE(_T(%s GetDllFilePath 失败), __FUNCTION__);
return;
}
NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0);
if (!ShowStatusInfo(ntStatus))
{
TRACE(_T(%s ShowStatusInfo 失败), __FUNCTION__);
return;
}
}
```
Hook.dll动态库的代码如下所示:
```cpp
extern C __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo)
{
if (!DylibMain())
{
TRACE(_T(%s DylibMain 失败), __FUNCTION__);
return;
}
}
FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]=
{
{_T(kernel32), (void*)CreateFileW, (void*)CreateFileW_new},
{_T(kernel32), (void*)CreateFileA, (void*)CreateFileA_new},
{_T(kernel32), (void*)ReadFile, (void*)ReadFile_new}
};
BOOL HookFunctionArrayBySymbol()
{
int nPos = 0;
do
{
FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos];
if (!stFunctionOldNew->strModulePath)
break;
if (!HookFunctionBySymbol(stFunctionOldNew->strModulePath, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New))
{
TRACE(_T(%s HookFunctionBySymbol 失败), __FUNCTION__);
return FALSE;
}
} while(++nPos);
return TRUE;
}
HANDLE WINAPI CreateFileW_new(
PWCHAR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile
)
{
TRACE(_T(CreateFileW_new. lpFileName = %s), lpFileName);
return CreateFileW(
lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
}
```