Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

最近在研究Windows Ring3上的API Hook,对HOOK导入表这种方法进行了研究。HOOK导入表所用的C++类大同小异,不同的就是如何实现HOOK一个延迟加载的模块中的函数,以及FreeLibaray某个函数之后再次LoadLibaray加载这个模块所导致的模块基地址不同的时候,这时该如何HOOK住这个模块中的API。

显然地,挂钩LoadLibarayA/W、LoadLibarayExA/W、GetProcAddress这些函数还不够,还需要挂钩FreeLibrary函数。这里我参考了《Windows核心编程》(第五版)中的一个程序,封装了一个C++类,能够HOOK住FreeLibrary,同时也能解决延迟加载的问题。

以下是这个类的声明:


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook类声明m_pNext;//下一个对象节点



PCSTR m_pszCalleeModName;
//要HOOK函数所在的模块名称(ANSI)

PCSTR m_pszFuncName;//要HOOK的函数的函数名(ANSI)

PROC m_pfnOrig;//函数原地址

PROC m_pfnHook;//HOOK替换函数的地址

HMODULE m_hMod;//模块句柄



private:

//在一个模块的导入节区挂钩一个函数

staticBOOL WINAPI ReplaceIATEntryInAllMods(PCSTR pszCalleeModName,

PROC pfnOrig, PROC pfnHook);



//在所有模块的导入节区挂钩一个函数

staticvoidWINAPI ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,

PROC pfnOrig, PROC pfnHook, HMODULE hmodCaller);



//在某个模块的导出节区挂钩一个函数

staticvoidWINAPI ReplaceEATEntryInOneMod(HMODULE hmod, PCSTR pszFunctionName, PROC pfnNew);



private:

//当一个DLL被新加载的时候使用该函数HOOK一个函数

staticvoidWINAPI FixupNewlyLoadedModule(PCSTR pszModName, HMODULE hmod, DWORD dwFlags);



//当一个DLL调用FreeLibaray等函数卸载某个模块时,调用此函数

staticBOOL WINAPI FixupNewlyUnLoadModule(HMODULE hmod);



//一些替换函数

staticHMODULE WINAPI LoadLibraryA_Hook(PCSTR pszModulePath);

staticHMODULE WINAPI LoadLibraryW_Hook(PCWSTR pszModulePath);

staticHMODULE WINAPI LoadLibraryExA_Hook(PCSTR pszModulePath,

HANDLE hFile, DWORD dwFlags);

staticHMODULE WINAPI LoadLibraryExW_Hook(PCWSTR pszModulePath,

HANDLE hFile, DWORD dwFlags);

staticFARPROC WINAPI GetProcAddress_Hook(HMODULE hmod, PCSTR pszProcName);

staticBOOL WINAPI FreeLibrary_Hook(HMODULE hLibModule);



private:

//挂钩某些特殊函数的CApiHook对象

staticCApiHook sm_LoadLibraryA;//挂钩LoadLibryraA函数的CApiHook对象

staticCApiHook sm_LoadLibraryW;//挂钩LoadLibryraW函数的CApiHook对象

staticCApiHook sm_LoadLibraryExA;//挂钩LoadLibryraExA函数的CApiHook对象

staticCApiHook sm_LoadLibraryExW;//挂钩LoadLibryraExW函数的CApiHook对象

staticCApiHook sm_GetProcAddress;//挂钩GetProcAddress函数的CApiHook对象

staticCApiHook sm_FreeLibrary;//挂钩FreeLibrary函数的CApiHook对象

};





//////////////////////////////// End of File//////////////////////////////////



#endif//API_HOOK_CLASS

想必其中某些函数不需要说了,需要说明的是FreeLibaray_Hook函数,这个函数是FreeLibaray的替换函数,通过sm_FreeLibrary对象进行HOOK。

开始写这个函数的时候,遇到了困难,理由是这样的,因为如果这段代码作为DLL注入到目标进程中去,如果通过钩子的方法注入到目标进程中时,那么卸载钩子时,会引发目标进程调用FreeLibaray来释放这个DLL,此时会调用FreeLibaray_Hook函数,哪怕在这个函数的最后“return ::FreeLibaray(hLibModule)”,也会出现问题。因为这个函数会产生了C/C++运行时的框架代码,就会在返回之后调用一些框架代码,比如调用C++类的析构函数之类,而此时该模块已经从目标进程中卸载,这必然会导致内存访问违规。因此,必须如下定义该函数:


__declspec(naked) BOOL WINAPI CApiHook::FreeLibrary_Hook(HMODULE hLibModule)

这样,VC编译器就不会对CApiHook::FreeLibaray_Hook函数产生一些框架代码,就需要自己写内联汇编来维持堆栈的平衡。这里给出这个函数的定义:

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook::FreeLibrary_Hook

这里给出CApiHook类的完整定义:

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook类和一些辅助函数的定义///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//异常过滤函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
LONG WINAPI InvalidReadExceptionFilter(PEXCEPTION_POINTERS pep)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API LONG lDisposition
=EXCEPTION_EXECUTE_HANDLER;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnlDisposition;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook
*CApiHook::sm_pHead=NULL;//CApiHook对象链表头结点

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIBOOL CApiHook::ExcludeAPIHookMod
=TRUE;//是否排除HOOK本模块的函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIPROC CApiHook::sm_pFunFreeLibrary
=NULL;//FreeLibrary的内存中的地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//构造函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
CApiHook::CApiHook()

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(sm_pFunFreeLibrary==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API sm_pFunFreeLibrary
=GetProcAddressRaw(GetModuleHandleW(L"Kernel32.dll"),"FreeLibrary");

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//前插一个结点

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
m_pNext=sm_pHead;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API sm_pHead
=this;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API Init();
//初始化

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//构造函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
CApiHook::CApiHook(PSTR pszCalleeModName, PSTR pszFuncName, PROC pfnHook)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(sm_pFunFreeLibrary==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API sm_pFunFreeLibrary
=GetProcAddressRaw(GetModuleHandleW(L"Kernel32.dll"),"FreeLibrary");

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//前插一个结点

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
m_pNext=sm_pHead;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API sm_pHead
=this;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API HookApi(pszCalleeModName, pszFuncName, pfnHook);
//挂钩某个API函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook::
~CApiHook()

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//从链表中删除本节点

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
CApiHookp=sm_pHead;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(p==this)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API sm_pHead
=p->m_pNext;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
else

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API BOOL bFound
=FALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(; p->m_pNext!=NULL; p=p->m_pNext)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(p->m_pNext==this)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API p
->m_pNext=p->m_pNext->m_pNext;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
break;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API UnHook();
//撤销挂钩

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
voidCApiHook::Init()

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_hMod
=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pszCalleeModName
=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pszFuncName
=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pfnOrig
=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pfnHook
=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
voidCApiHook::Uninit()

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//这里不把模块名、函数名和替换函数地址设置为NULL,防止重复加载

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
m_hMod=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pfnOrig
=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//本函数不能为inline类型 —— 得到函数的实际地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
FARPROC WINAPI CApiHook::GetProcAddressRaw(HMODULE hmod, PCSTR pszProcName)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
return(::GetProcAddress(hmod, pszProcName));//得到函数的真实地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//在某个模块中HOOK某个API函数 —— 重要

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
BOOL WINAPI CApiHook::HookApi(PSTR pszCalleeModName, PSTR pszFuncName, PROC pfnHook)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(m_pszCalleeModName!=NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API UnHook();

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到HOOK信息

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
m_hMod=GetModuleHandleA(pszCalleeModName);//得到模块句柄

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
m_pszCalleeModName=pszCalleeModName;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pszFuncName
=pszFuncName;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pfnHook
=pfnHook;//替换函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(m_hMod)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API m_pfnOrig
=GetProcAddressRaw(m_hMod, m_pszFuncName);//原函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//如果原函数地址为NULL,可能是因为模块并没有加载(比如延迟加载DLL就会出现该问题)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(m_pfnOrig==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API#ifdef _DEBUG

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API wchar_t szPathname[MAX_PATH];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API GetModuleFileNameW(NULL, szPathname, _countof(szPathname));

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API wchar_t sz[
1024];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API wsprintfW(sz, L
"[%4u - %s] impossible to find %S\r\n",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API GetCurrentProcessId(), szPathname, pszFuncName);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API OutputDebugString(sz);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
#endif

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnFALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API#ifdef _DEBUG

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//This section was used for debugging sessions when Explorer died as

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//a folder content was requested

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//static BOOL s_bFirstTime = TRUE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//if (s_bFirstTime)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//s_bFirstTime = FALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//wchar_t szPathname[MAX_PATH];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//GetModuleFileNameW(NULL, szPathname, _countof(szPathname));

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//wchar_t
pszExeFile = wcsrchr(szPathname, L'\') + 1;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API//OutputDebugStringW(L"Injected in ");

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//OutputDebugStringW(pszExeFile);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//if (_wcsicmp(pszExeFile, L"Explorer.EXE") == 0)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//DebugBreak();

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//}

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//OutputDebugStringW(L"\n --> ");

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//wsprintfW(szPathname, L"%S", pszFuncName);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//OutputDebugStringW(szPathname);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//OutputDebugStringW(L"\n");

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//}

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
#endif

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//HOOK某个函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnOrig, m_pfnHook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnTRUE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//撤销挂钩

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
voidWINAPI CApiHook::UnHook()

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(m_pfnHook==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
return;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//撤销挂钩 —— 将函数地址复原

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnHook, m_pfnOrig);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API Uninit();

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//将本进程中所有模块的IAT中的指定函数地址pfnCurrent替换为pfnNew

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
BOOL CApiHook::ReplaceIATEntryInAllMods(PCSTR pszCalleeModName,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API PROC pfnCurrent, PROC pfnNew)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(pszCalleeModName==NULL||pfnCurrent==NULL||pfnNew==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnFALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到当前模块(即包含这段代码的模块)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
HMODULE hmodThisMod=ExcludeAPIHookMod

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
?ModuleFromAddress(ReplaceIATEntryInAllMods) : NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到本进程中的模块列表

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(hSnapshot==INVALID_HANDLE_VALUE)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnFALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API MODULEENTRY32 me
={sizeof(me) };

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(BOOL bOk=Module32First(hSnapshot,&me); bOk; bOk=Module32Next(hSnapshot,&me))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//不替换当前模块的函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(me.hModule!=hmodThisMod)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ReplaceIATEntryInOneMod(pszCalleeModName, pfnCurrent, pfnNew, me.hModule);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API CloseHandle(hSnapshot);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnTRUE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//替换模块导入表中的函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
voidWINAPI CApiHook::ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ULONG ulSize;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//一个异常可能被触发,因为诸如explorer.exe这样的进程能够快速地加载和卸载模块

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
PIMAGE_IMPORT_DESCRIPTOR pImportDesc=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API __try

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API pImportDesc
=(PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToDataEx(

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT,
&ulSize, NULL);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API __except (InvalidReadExceptionFilter(GetExceptionInformation()))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(pImportDesc==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
return;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//在导入描述符中查找导入信息

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(; pImportDesc->Name;++pImportDesc)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到模块名pszModName(模块基地址 + 名称偏移)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
PSTR pszModName=(PSTR) ((PBYTE) hmodCaller+pImportDesc->Name);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//判断模块名是否为指定模块

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(lstrcmpiA(pszModName, pszCalleeModName)==0)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//取得调用者导入函数地址表的在模块中的函数地址(模块基址 + 偏移)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
PIMAGE_THUNK_DATA pThunk=(PIMAGE_THUNK_DATA)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ((PBYTE)hmodCaller
+pImportDesc->FirstThunk);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//用新的函数地址替换当前函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(; pThunk->u1.Function; pThunk++)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//取得函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
PROCppfn=(PROC
)&pThunk->u1.Function;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//是否是需要替换的函数(比较函数地址)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
BOOL bFound=(*ppfn==pfnCurrent);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(bFound)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//修改地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(!WriteProcessMemory(GetCurrentProcess(), ppfn,&pfnNew,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
sizeof(pfnNew), NULL)&&(ERROR_NOACCESS==GetLastError()))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//如果失败,则更改页保护属性

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
DWORD dwOldProtect;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(VirtualProtect(ppfn,sizeof(pfnNew), PAGE_WRITECOPY,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
&dwOldProtect))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API WriteProcessMemory(GetCurrentProcess(), ppfn,
&pfnNew,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
sizeof(pfnNew), NULL);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API VirtualProtect(ppfn,
sizeof(pfnNew), dwOldProtect,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
&dwOldProtect);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
return;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//替换模块导出表中函数的地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
voidWINAPI CApiHook::ReplaceEATEntryInOneMod(HMODULE hmod, PCSTR pszFunctionName, PROC pfnNew)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到模块导出节地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
ULONG ulSize;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到导出节目录地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
PIMAGE_EXPORT_DIRECTORY pExportDir=NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API __try

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API pExportDir
=(PIMAGE_EXPORT_DIRECTORY)ImageDirectoryEntryToData(

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API hmod, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT,
&ulSize);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API __except (InvalidReadExceptionFilter(GetExceptionInformation()))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(pExportDir==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
return;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API PDWORD pdwNamesRvas
=(PDWORD) ((PBYTE) hmod+pExportDir->AddressOfNames);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API PWORD pdwNameOrdinals
=(PWORD)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ((PBYTE) hmod
+pExportDir->AddressOfNameOrdinals);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API PDWORD pdwFunctionAddresses
=(PDWORD)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ((PBYTE) hmod
+pExportDir->AddressOfFunctions);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//遍历模块函数名表

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(DWORD n=0; n<pExportDir->NumberOfNames; n++)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//取得函数名

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
PSTR pszFuncName=(PSTR) ((PBYTE) hmod+pdwNamesRvas[n]);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//如果不是指定的函数,则继续遍历

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(lstrcmpiA(pszFuncName, pszFunctionName)!=0)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
continue;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到这个指定函数的序号

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
WORD ordinal=pdwNameOrdinals[n];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//得到函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
PROCppfn=(PROC
)&pdwFunctionAddresses[ordinal];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//用RVA(相对虚拟地址)更换成新的地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
pfnNew=(PROC) ((PBYTE) pfnNew-(PBYTE) hmod);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//用新的函数地址替换当前函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(!WriteProcessMemory(GetCurrentProcess(), ppfn,&pfnNew,sizeof(pfnNew), NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
&&(ERROR_NOACCESS==GetLastError()))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API DWORD dwOldProtect;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(VirtualProtect(ppfn,sizeof(pfnNew), PAGE_WRITECOPY,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
&dwOldProtect))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API WriteProcessMemory(GetCurrentProcess(), ppfn,
&pfnNew,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
sizeof(pfnNew), NULL);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API VirtualProtect(ppfn,
sizeof(pfnNew), dwOldProtect,&dwOldProtect);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
break;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//替换LoadLibaray*函数和GetProcAddress函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook CApiHook::sm_LoadLibraryA (
"Kernel32.dll","LoadLibraryA",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API (PROC) CApiHook::LoadLibraryA_Hook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook CApiHook::sm_LoadLibraryW (
"Kernel32.dll","LoadLibraryW",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API (PROC) CApiHook::LoadLibraryW_Hook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook CApiHook::sm_LoadLibraryExA(
"Kernel32.dll","LoadLibraryExA",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API (PROC) CApiHook::LoadLibraryExA_Hook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook CApiHook::sm_LoadLibraryExW(
"Kernel32.dll","LoadLibraryExW",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API (PROC) CApiHook::LoadLibraryExW_Hook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook CApiHook::sm_GetProcAddress(
"Kernel32.dll","GetProcAddress",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API (PROC) CApiHook::GetProcAddress_Hook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICApiHook CApiHook::sm_FreeLibrary(
"Kernel32.dll","FreeLibrary",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API (PROC) CApiHook::FreeLibrary_Hook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//防止运行时加载模块(如线程调用LoadLibarayW等函数)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
voidCApiHook::FixupNewlyLoadedModule(PCSTR pszModPath, HMODULE hmod, DWORD dwFlags)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//如果一个新的模块被加载,重新挂钩函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if((hmod!=NULL)&&

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API (hmod
!=ModuleFromAddress(FixupNewlyLoadedModule))&&

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ((dwFlags
&LOAD_LIBRARY_AS_DATAFILE)==0)&&

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ((dwFlags
&LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)==0)&&

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ((dwFlags
&LOAD_LIBRARY_AS_IMAGE_RESOURCE)==0)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API )

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//遍历CApiHook对象链,挂钩个对象要求的API函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(CApiHookp=sm_pHead; p!=NULL; p=p->m_pNext)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//如果某个对象的原函数地址为NULL,可能是延迟加载等原因导致原来DLL不在内存中而引起的

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//因此在这里根据模块名获得函数现在的地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(p->m_pfnOrig==NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(lstrcmpiA(p->m_pszCalleeModName, pszModPath)==0)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API p
->m_hMod=hmod;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API p
->m_pfnOrig=p->GetProcAddressRaw(hmod, p->m_pszFuncName);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(p->m_pfnOrig!=NULL)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//重新挂钩每个函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
ReplaceIATEntryInAllMods(p->m_pszCalleeModName, p->m_pfnOrig, p->m_pfnHook);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
else

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API#ifdef _DEBUG

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//可能是延迟加载导致p->m_pfnOrig为空

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
wchar_t szPathname[MAX_PATH];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API GetModuleFileNameW(NULL, szPathname, _countof(szPathname));

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API wchar_t sz[
1024];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API wsprintfW(sz, L
"[%4u - %s] impossible to find %S\r\n",

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API GetCurrentProcessId(), szPathname, p
->m_pszCalleeModName);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API OutputDebugString(sz);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
#endif

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//防止运行时卸载模块(如线程调用FreeLibrary等函数)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
BOOL WINAPI CApiHook::FixupNewlyUnLoadModule(HMODULE hmod)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(hmod==NULL||hmod==ModuleFromAddress(FixupNewlyUnLoadModule))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnFALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API BOOL bFree
=TRUE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API wchar_t szModPath[MAX_PATH];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API szModPath[
0]=L'\0';

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(!GetModuleFileNameW(hmod, szModPath, MAX_PATH))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnFALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(!::FreeLibrary(hmod))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnFALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API bFree
=TRUE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(GetModuleFileNameW(hmod, szModPath, MAX_PATH))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//如果还能够得到地址,则说明该模块在进程地址空间中并没有真正卸载

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(GetModuleHandleW(szModPath))

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API bFree
=FALSE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//如果卸载了,则撤销某些挂钩

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(bFree)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(CApiHook
p=sm_pHead; p; p=p->m_pNext)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(p->m_pfnOrig&&p->m_hMod==hmod)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API p
->UnHook();

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnTRUE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//挂钩LoadLibarayA的替换函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
HMODULE WINAPI CApiHook::LoadLibraryA_Hook(PCSTR pszModulePath)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API HMODULE hmod
=::LoadLibraryA(pszModulePath);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API FixupNewlyLoadedModule(pszModulePath, hmod,
0);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnhmod;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//挂钩LoadLibraryW的替换函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
HMODULE WINAPI CApiHook::LoadLibraryW_Hook(PCWSTR pszModulePath)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API HMODULE hmod
=::LoadLibraryW(pszModulePath);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
charszModPath[MAX_PATH];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, pszModulePath,
-1,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API szModPath, MAX_PATH
sizeof(char), NULL, NULL);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API FixupNewlyLoadedModule(szModPath, hmod,
0);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnhmod;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//挂钩LoadLibraryExA的替换函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
HMODULE WINAPI CApiHook::LoadLibraryExA_Hook(PCSTR pszModulePath,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API HANDLE hFile, DWORD dwFlags)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API HMODULE hmod
=::LoadLibraryExA(pszModulePath, hFile, dwFlags);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API FixupNewlyLoadedModule(pszModulePath, hmod, dwFlags);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnhmod;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//挂钩LoadLibraryExW的替换函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
HMODULE WINAPI CApiHook::LoadLibraryExW_Hook(PCWSTR pszModulePath,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API HANDLE hFile, DWORD dwFlags)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API HMODULE hmod
=::LoadLibraryExW(pszModulePath, hFile, dwFlags);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
charszModPath[MAX_PATH];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, pszModulePath,
-1,

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API szModPath, MAX_PATH
sizeof(char), NULL, NULL);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API FixupNewlyLoadedModule(szModPath, hmod, dwFlags);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnhmod;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
///////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//挂钩GetProcAddress的替换函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
FARPROC WINAPI CApiHook::GetProcAddress_Hook(HMODULE hmod, PCSTR pszProcName)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//取得函数的实际地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
FARPROC pfn=GetProcAddressRaw(hmod, pszProcName);

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API CApiHook
*p=sm_pHead;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
for(; (pfn!=NULL)&&(p!=NULL); p=p->m_pNext)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//查看是否是想挂钩的函数,如果是,则返回新的替换函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
if(pfn==p->m_pfnOrig)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//返回我们的替换函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
pfn=p->m_pfnHook;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
break;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
returnpfn;//返回替换函数地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
////////////////////////////////////////////////////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//拦截FreeLibrary的替换函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//注意函数采用内联汇编进行编写,需要使用__declspec(naked)标记函数,让编译器不产生框架代码,自己维护堆栈平衡

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
__declspec(naked) BOOL WINAPI CApiHook::FreeLibrary_Hook(HMODULE hLibModule)

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API __asm

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
{

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API push ebp;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API mov ebp, esp;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API pushad;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API push dword ptr[FreeLibrary_Hook];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API call dword ptr[ModuleFromAddress];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API cmp [ebp
+8], eax;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API jne NotMe;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API mov eax, sm_pHead;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APINext:

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API cmp eax, NULL;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API je CallTrue;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API mov edx, [eax].m_pNext;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API push edx;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API push eax; ; 这里相当于压入this指针

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API call UnHook; ; 相当于调用[eax].UnHook

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API pop eax;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API jmp Next;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APICallTrue:

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API popad;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API pop ebp;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API jmp dword ptr[sm_pFunFreeLibrary]; ; 如果是卸载本模块,则可能是其他程序调用,需要跳转到真正的FreeLibaray函数的地址

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ; 不是卸载的本模块

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APINotMe:

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API push [ebp
+8];

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API call FixupNewlyUnLoadModule; ; 不是本模块卸载,则调用修正的FreeLibrary函数

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API popad;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API pop ebp;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API mov eax, TRUE;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API ret
4;

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API }


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API}


Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的APIHook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API
//////////////////////////////// End of File//////////////////////////////////

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

如上就可以实现挂钩FreeLibaray函数的功能了。

同时,这里在HOOK所有LoadLibaray*函数的时候,调用了FixupNewlyLoadedModule函数,该函数会遍历所有CApiHook对象,查看是否存在某个对象的API原地址为NULL,如果是,就检测模块名是否一致,这样就可以通过模块得到这个API原始地址了,这样就可以解决延迟加载的问题。原文链接: https://www.cnblogs.com/wz19860913/archive/2010/04/29/1723578.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/10508

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月6日 下午11:48
下一篇 2023年2月6日 下午11:48

相关推荐