13,825
社区成员
发帖
与我相关
我的任务
分享
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef _HOOKCLASSH_
#define _HOOKCLASSH_
#include <windows.h>
//---------------------------------------------------------------
class CHookClass{
CHookClass(const CHookClass&);
CHookClass &operator=(const CHookClass&); //不准拷贝和赋值
#pragma pack(push,1)
struct TJmpCode{
char Jmp;
DWORD Ptr;
};
#pragma pack(pop)
public:
/* LibName: DLL 文件名 */
/* FuncName: 目标函数名 */
/* NewFuncPtr: 用于替换的函数指针 */
CHookClass(const char *LibName, const char *FuncName, void *NewFuncPtr);
~CHookClass();
void HookOn(); // 开启 API Hook
void HookOff(); // 关闭 API Hook
void Lock(); // 进入临界区
void Unlock(); // 退出临界区
bool IsHooked(){
// 取Hook状态
return _IsHooked;
}
private:
TJmpCode _OrgCode; // 原代码
TJmpCode _NewCode; // 新代码 jmp FuncPtr
void *_TagFuncPtr; // 目标函数指针
HANDLE _CurProcess; // 当前进程
bool _IsHooked; // 显示是否被Hook了
CRITICAL_SECTION _cs; // 临界区
};
//---------------------------------------------------------------------------------
CHookClass::CHookClass(const char *LibName, const char *FuncName, void *NewFuncPtr)
:_TagFuncPtr(NULL),_IsHooked(false),_CurProcess(0)
{
HMODULE hModule=LoadLibrary(LibName);
_TagFuncPtr=GetProcAddress(hModule, FuncName);
if(_TagFuncPtr==NULL)
throw(-1);
CopyMemory(&_OrgCode,_TagFuncPtr,5); // 保存原函数前五字节
_NewCode.Jmp=0xe9; //jmp
_NewCode.Ptr=DWORD(NewFuncPtr)-DWORD(_TagFuncPtr)-5; // 新的五字节为 jmp NewFuncPtr
_CurProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, GetCurrentProcessId()); // 以特权方式打开当前进程
InitializeCriticalSection(&_cs);
}
//---------------------------------------------------------------------------------
CHookClass::~CHookClass()
{
if(_IsHooked)
HookOff();
DeleteCriticalSection(&_cs);
}
//---------------------------------------------------------------------------------
void CHookClass::HookOn()
{
// !开启 API Hook
if(!_IsHooked)
{
DWORD dwOldProtect;
VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, PAGE_READWRITE, &dwOldProtect); // 更改内存属性
WriteProcessMemory(_CurProcess, _TagFuncPtr, &_NewCode, 5, NULL); // 将_TagFuncPtr的前5个字节改为JMP NewFuncPtr
VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, dwOldProtect, &dwOldProtect);
_IsHooked=true;
}
}
//---------------------------------------------------------------------------------
void CHookClass::HookOff()
{
// !关闭 API Hook
if(_IsHooked)
{
DWORD dwOldProtect;
VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(_CurProcess, _TagFuncPtr, &_OrgCode, 5, NULL); // 恢复_TagFuncPtr的前5个字节
VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, dwOldProtect, &dwOldProtect);
_IsHooked=false;
}
}
//---------------------------------------------------------------------------------
void CHookClass::Lock() // 进入临界区
{
EnterCriticalSection(&_cs);
}
//---------------------------------------------------------------------------------
void CHookClass::Unlock() // 退出临界区
{
LeaveCriticalSection(&_cs);
}
#endif
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "tapihook.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//自定义的处理函数
BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{
ShowMessage(lpszString);
// 这里进行输出lpszString的处理
// 然后调用正版的TextOutA函数
}
//-------------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CHookClass hk("gdi32.dll","TextOutA",MyTextOutA);
hk.HookOn();
ShowMessage((int)hk.IsHooked());
}
//---------------------------------------------------------------------------