API HOOK实例剖析.docx
- 文档编号:30625421
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:17
- 大小:20.25KB
API HOOK实例剖析.docx
《API HOOK实例剖析.docx》由会员分享,可在线阅读,更多相关《API HOOK实例剖析.docx(17页珍藏版)》请在冰豆网上搜索。
APIHOOK实例剖析
APIHOOK实例剖析
关于APIHOOK的基础知识有很多,如dll的相关知识、Hook的相关知识、系统进程与线程之间的联系等。
具体可以看我的另两篇文章:
"我的Dll(动态链接库)学习笔记"和"我的Hook学习笔记"。
:
)下面进入这篇文章的重点,根据APIHook源码进行APIHook的剖析。
一、APIHOOK之dll部分
////////////////////////////////APIHook_Dll.cpp////////////////////////////////////////
// rivershan写于2002.9.23 //
/////////////////////////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"APIHook_Dll.h"
#include
#include
#pragmacomment(lib,"ImageHlp")//定义全局共享数据段
#pragmadata_seg("Shared")
HMODULEhmodDll=NULL;
HHOOKhHook=NULL;
#pragmadata_seg()
#pragmacomment(linker,"/Section:
Shared,rws")//设置全局共享数据段的属性
/////////////////////////////////////DllMain函数/////////////////////////////////////////
//dll的入口点
BOOLAPIENTRYDllMain(HMODULEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
//if(sHook)
caseDLL_PROCESS_DETACH:
UnInstallHook();
break;
}
hmodDll=hModule;
returnTRUE;
}
/////////////////////////////////////HookOneAPI函数/////////////////////////////////////////
//进行IAT转换的关键函数,其参数含义:
//pszCalleeModuleName:
需要hook的模块名
//pfnOriginApiAddress:
要替换的自己API函数的地址
//pfnDummyFuncAddress:
需要hook的模块名的地址
//hModCallerModule:
我们要查找的模块名称,如果没有被赋值,
// 将会被赋值为枚举的程序所有调用的模块
voidWINAPIHookOneAPI(LPCTSTRpszCalleeModuleName,PROCpfnOriginApiAddress,
PROCpfnDummyFuncAddress,HMODULEhModCallerModule)
{
ULONGsize;
//获取指向PE文件中的Import中IMAGE_DIRECTORY_DESCRIPTOR数组的指针
PIMAGE_IMPORT_DESCRIPTORpImportDesc=(PIMAGE_IMPORT_DESCRIPTOR)
ImageDirectoryEntryToData(hModCallerModule,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
if(pImportDesc==NULL)
return;
//查找记录,看看有没有我们想要的DLL
for(;pImportDesc->Name;pImportDesc++)
{
LPSTRpszDllName=(LPSTR)((PBYTE)hModCallerModule+pImportDesc->Name);
if(lstrcmpiA(pszDllName,pszCalleeModuleName)==0)
break;
}
if(pImportDesc->Name==NULL)
{
return;
}
//寻找我们想要的函数
PIMAGE_THUNK_DATApThunk=
(PIMAGE_THUNK_DATA)((PBYTE)hModCallerModule+pImportDesc->FirstThunk);//IAT
for(;pThunk->u1.Function;pThunk++)
{
//ppfn记录了与IAT表
相应的函数的地址
PROC*ppfn=(PROC*)&pThunk->u1.Function;
if(*ppfn==pfnOriginApiAddress)
{
//如果地址相同,也就是找到了我们想要的函数,进行改写,将其指向我们所定义的函数
WriteProcessMemory(GetCurrentProcess(),ppfn,&(pfnDummyFuncAddress),
sizeof(pfnDummyFuncAddress),NULL);
return;
}
}
}
//查找所挂钩的进程所应用的dll模块的
BOOLWINAPIHookAllAPI(LPCTSTRpszCalleeModuleName,PROCpfnOriginApiAddress,
PROCpfnDummyFuncAddress,HMODULEhModCallerModule)
{
if(pszCalleeModuleName==NULL)
{
returnFALSE;
}
if(pfnOriginApiAddress==NULL)
{
returnFALSE;
}
//如果没传进来要挂钩的模块名称,枚举被挂钩进程的所有引用的模块,
//并对这些模块进行传进来的相应函数名称的查找
if(hModCallerModule==NULL)
{
MEMORY_BASIC_INFORMATIONmInfo;
HMODULEhModHookDLL;
HANDLEhSnapshot;
MODULEENTRY32me={sizeof(MODULEENTRY32)};
//MODULEENTRY32:
描述了一个被指定进程所应用的模块的struct
VirtualQuery(HookOneAPI,&mInfo,sizeof(mInfo));
hModHookDLL=(HMODULE)mInfo.AllocationBase;
hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
BOOLbOk=Module32First(hSnapshot,&me);
while(bOk)
{
if(me.hModule!
=hModHookDLL)
{
hModCallerModule=me.hModule;//赋值
//me.hModule:
指向当前被挂钩进程的每一个模块
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
}
bOk=Module32Next(hSnapshot,&me);
}
returnTRUE;
}
//如果传进来了,进行查找
else
{
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
returnTRUE;
}
returnFALSE;
}
////////////////////////////////////UnhookAllAPIHooks函数/////////////////////////////////////
//通过使pfnDummyFuncAddress与pfnOriginApiAddress相等的方法,取消对IAT的修改
BOOLWINAPIUnhookAllAPIHooks(LPCTSTRpszCalleeModuleName,PROCpfnOriginApiAddress,
PROCpfnDummyFuncAddress,HMODULEhModCallerModule)
{
PROCtemp;
temp=pfnOriginApiAddress;
pfnOriginApiAddress=pfnDummyFuncAddress;
pfnDummyFuncAddress=temp;
returnHookAllAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
}
//////////////////////////////////GetMsgProc函数////////////////////////////////////////
//钩子子程。
与其它钩子子程不大相同,没做什么有意义的事情,继续调用下一个钩子子程,形成循环
LRESULTCALLBACKGetMsgProc(intcode,WPARAMwParam,LPARAMlParam)
{
returnCallNextHookEx(hHook,code,wParam,lParam);
}
////////////////////////////////////InstallHook函数/////////////////////////////////////
//安装或卸载钩子,BOOLIsHook参数是标志位
//对要钩哪个API函数进行初始化
//我们这里装的钩子类型是WH_GETMESSAGE
v
void__declspec(dllexport)WINAPIInstallHook(BOOLIsHook,DWORDdwThreadId)
{
if(IsHook)
{
hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,dwThreadId);
//GetProcAddress(GetModuleHandle("GDI32.dll"),"ExtTextOutA"):
取得要钩的函数在所在dll中的地址
HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
"TextOutW"),(PROC)&H_TextOutW,NULL);
HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
"TextOutA"),(PROC)&H_TextOutA,NULL);
}
else
{
UnInstallHook();
UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
"TextOutW"),(PROC)&H_TextOutW,NULL);
UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
"TextOutA"),(PROC)&H_TextOutA,NULL);
}
}
/////////////////////////////////////UnInstallHook函数////////////////////////////////////
//卸载钩子
BOOLWINAPIUnInstallHook()
{
UnhookWindowsHookEx(hHook);
returnTRUE;
}
/////////////////////////////////////H_TextOutA函数/////////////////////////////////////////
//我们的替换函数,可以在里面实现我们所要做的功能
//这里我做的是显示一个对话框,指明是替换了哪个函数
BOOLWINAPIH_TextOutA(HDChdc,intnXStart,intnYStart,LPCSTRlpString,intcbString)
{
MessageBox(NULL,"TextOutA","APIHook_Dll---rivershan",MB_OK);
TextOutA(hdc,nXStart,nYStart,lpString,cbString);//返回原来的函数,以显示字符
returnTRUE;
}
/////////////////////////////////////H_TextOutW函数/////////////////////////////////////////
//同上
BOOLWINAPIH_TextOutW(HDChdc,intnXStart,intnYStart,LPCWSTRlpString,intcbString)
{
MessageBox(NULL,"TextOutW","APIHook_Dll---rivershan",MB_OK);
TextOutW(hdc,nXStart,nYStart,lpString,cbString);//返回原来的函数,以显示字符
returnTRUE;
}
**********************************************************************************************
**********************************************************************************************
////////////////////////////////APIHook_Dll.h////////////////////////////////////////
// rivershan写于2002.9.23 //
/////////////////////////////////////////////////////////////////////////////////////////
//dll头文件,用于声明函数
void__declspec(dllexport)WINAPIInstallHook(BOOL,DWORD);
BOOLWINAPIUnInstallHook();
LRESULTCALLBACKGetMsgProC(intcode,WPARAMwParam,LPARAMlParam);
voidWINAPIHookOneAPI(LPCTSTRpszCalleeModuleName,PROCpfnOriginApiAddress,
PROCpfnDummyFuncAddress,HMODULEhModCallerModule);
BOOLWINAPIHookAllAPI(LPCTSTRpszCalleeModuleName,PROCpfnOrig
inApiAddress,
PROCpfnDummyFuncAddress,HMODULEhModCallerModule);
BOOLWINAPIUnhookAllAPIHooks(LPCTSTRpszCalleeModuleName,PROCpfnOriginApiAddress,
PROCpfnDummyFuncAddress,HMODULEhModCallerModule);
BOOLWINAPIH_TextOutA(HDC,int,int,LPCSTR,int);
BOOLWINAPIH_TextOutW(HDC,int,int,LPCWSTR,int);
BOOLWINAPIH_ExtTextOutA(HDC,int,int,UINT,CONSTRECT*,LPCSTR,UINT,CONSTINT*);
BOOLWINAPIH_ExtTextOutW(HDC,int,int,UINT,CONSTRECT*,LPCWSTR,UINT,CONSTINT*);
**********************************************************************************************
**********************************************************************************************
;APIHook_Dll之def文件
LIBRARYAPIHook_Dll.dll
EXPORT
InstallHook
二、APIHOOK之exe部分
////////////////////////////APIHook_EXEDlg.cpp/////////////////////////////////////////
// rivershan写于2002.9.23 //
/////////////////////////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"APIHook_EXE.h"
#include"APIHook_EXEDlg.h"
#include"APIHook_Dll.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAPIHook_EXEDlgdialog
CAPIHook_EXEDlg:
:
CAPIHook_EXEDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CAPIHook_EXEDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CAPIHook_EXEDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCAPIHook_EXEDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAPIHook_EXEDlg)
//DDX_Control(pDX,IDC_EDIT1,m_Edit);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAPIHook_EXEDlg,CDialog)
//{{AFX_MSG_MAP(CAPIHook_EXEDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_OUT,OnButtonOut)
ON_BN_CLICKED(IDC_BUTTON_BEGIN,OnButtonBegin)
ON_BN_CLICKED(IDC_BUTTON_STOP,OnButtonStop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CAPIHook_EXEDlgmessagehandlers
BOOLCAPIHook_EXEDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotad
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- API HOOK实例剖析 HOOK 实例 剖析