版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows下的函数hook技术都是很成熟的东西了,这几天看了看,总结一下而已。讨论了Windows下hook函数的几种方法。提供了一个hookTextOutA的完整例子。通过CreateRemoteThread的方法把hookdll注入到一个普通的应用程序中。HookingImportedFunctionsbyname调用importedfunctions'时的步骤/实现在程序中调用从其它模块引入的函数的方法和普通的函数调用有所不同。对于普通的函数调用,直接使用calladdress来调用即可,但是对于importedfunctions,在编译的时候compiler/link并不知道实际的函数实现会被加载到那个地址,函数实现在那个地址在运行的时候才会确定。对于importedfunctions,首先是call引入表中的一个函数,在运行时再初始化引入表,使用jmp跳转到真实的函数实现。引入表:
ThePEfileIMAGE_IMPORT_DESCRIPTORstructure,whichholdsalltheinformationaboutfunctionsimportedfromaspecificDLL,haspointerstotwoarraysintheexecutable.Thesearraysarecalledimportaddresstables(IATs),orsometimesthunkdataarrays.ThefirstpointerreferencestherealIAT,whichtheprogramloaderfixesupwhentheexecutableisloaded.ThesecondpointerreferencestheoriginalIAT,whichisuntouchedbytheloaderandliststheimportedfunctions.实现原理找到PE文件的Image_Import_Descriptor结构找到OriginalLAT和RealLAT.通过要hook的函数的名字在OriginalLAT找到要hook的importedfunction在数组中的index.保存并修改RealLAT在相应index的functionaddress(refertoJohnRobbins,BugsLayerUtil.dll)HookingImportedFunctionsbyordinal原理和HookImportedfunctionsbyname一样,只是是通过要hook的函数的ordinal在originalLAT中找到index.Hookingafunctioninthisdll
当一个DLL是通过LoadLibrary载入的时候,我们无法通过hookimportedfunction的方法的hook它中的function
。有两种可能的办法处理这种情况:
第一种方法,遍历进程空间,发现call指定函数的地方替换为callhookFunction.太麻烦,而且不安全。
第二种方法,改写要hook的函数FuncA
。比较好的方法实现HookFuncA,最后的实现垫入n个nop.找到要hook的函数FuncA的绝对地址,改写前5个字节为jmphookFuncA(假定前5个字节为n个完整的指令)把FuncA的前5个字节拷贝到hookFuncA的后面,在加上一条指令jmpfuncA+5.
CodeofHookDLL.dll,可以通过CreateRemoteThread的方法把hookdll注入到一个普通的应用程序中。//HookDLL.cpp:DefinestheentrypointfortheDLLapplication.
//
#include"stdafx.h"
#include"HookDLL.h"
#include"Log.h"
//forwarddeclare.
LRESULTWINAPIInstallTextoutHook();
LRESULTWINAPIUninstallTextoutHook();
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
if(InstallTextoutHook())
{
WriteLog("Installhooksuccess.\n");
}else
{
WriteLog("Intallhookfailed.\n");
}
break;
caseDLL_THREAD_ATTACH:
break;
caseDLL_THREAD_DETACH:
break;
caseDLL_PROCESS_DETACH:
if(UninstallTextoutHook())
{
WriteLog("Uninstallhooksuccess.\n");
}else
{
WriteLog("Unintallhookfailed.\n");
}
break;
}
returnTRUE;
}
#defineDWORD_PTRDWORD*
#define__LOCAL_SIZE40h
#defineNAKED_PROLOG()\
DWORD_PTRdwRet;\
DWORD_PTRdwESI;\
{\
__asmPUSHEBP/*Setupthestandardframe.*/\
__asmMOVEBP,ESP\
__asmSUBESP,__LOCAL_SIZE/*Saveroomforthelocal*/\
/*variables.*/\
__asmMOVEAX,EBP/*EBPhasthestackcoming*/\
/*intothefn.init.*/\
__asmADDEAX,4/*AccountforPUSHEBP*/\
__asmMOVEAX,[EAX]/*Getreturnaddress.*/\
__asmMOV[dwRet],EAX/*Savereturnaddress.*/\
__asmMOV[dwESI],ESI/*SaveESIsochkespindbg*/\
/*buildsworks.*/\
}//Thecommonepilogpartthatcanbesharedbetweenthestdcalland
//cdeclhookfunctions.
#defineEPILOG_COMMON()\
{\
__asmMOVESI,[dwESI]/*RestoreESI.*/\
__asmADDESP,__LOCAL_SIZE/*Takeawaylocalvarspace*/\
__asmMOVESP,EBP/*Restorestandardframe.*/\
__asmPOPEBP\
}
#defineCOPY_CODE_LENGTH5
BYTEg_abOriCode[COPY_CODE_LENGTH];
BYTEg_abJmpCode[COPY_CODE_LENGTH];
PROCg_oriTextout;
BOOLg_blHooked=FALSE;
LRESULTWINAPIInstallTextoutHook()
{
if(g_blHooked)
returnTRUE;
//GetTextOutA'saddress.
HMODULEhGdi32=::LoadLibrary(_T("Gdi32.dll"));
g_oriTextout=GetProcAddress(hGdi32,_T("TextOutA"));
if(NULL==g_oriTextout)
returnFALSE;
//Getthehook'aaddress.
HMODULEhModule=GetModuleHandle(_T("HookDLL.dll"));
if(NULL==hModule)
returnFALSE;
DWORDdwHookAddr=NULL;
__asm
{
movesi,offsetHookLabel;
movedi,0x10000000;//0x10000000isthedll'sbaseaddress.
subesi,edi;
addesi,hModule;
mov[dwHookAddr],esi;
}
//GettheNOP'saddress.
DWORDdwNOPAddr=NULL;
__asm
{
movesi,offsetNOPLabel;
movedi,0x10000000;//0x10000000isthedll'sbaseaddress.
subesi,edi;
addesi,hModule;
mov[dwNOPAddr],esi;
}
//Savethefirst5byteofTextOutAtog_abOriCode
__asm
{
movesi,g_oriTextout;
leaedi,g_abOriCode;
cld;
movsd;
movsb;
}
//GeneratethejmpHookfunction.
g_abJmpCode[0]=0xe9;
__asm
{
moveax,dwHookAddr;
movebx,g_oriTextout;
addebx,5;
subeax,ebx;
movdwordptr[g_abJmpCode+1],eax;
}
//WritethejumpinstructiontothetextoutA.
DWORDdwProcessId=GetCurrentProcessId();
HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,
FALSE,dwProcessId);
if(NULL==hProcess)
returnFALSE;
DWORDdwOldFlag;
VirtualProtectEx(hProcess,g_oriTextout,5,PAGE_READWRITE,&dwOldFlag);
WriteProcessMemory(hProcess,g_oriTextout,g_abJmpCode,sizeof(g_abJmpCode),NULL);
VirtualProtectEx(hProcess,g_oriTextout,5,dwOldFlag,NULL);
//Writeg_abOriTextouttotheendofHookfunction(NOPaddr),thenwritethejmpinstruction.
VirtualProtectEx(hProcess,(LPVOID)dwNOPAddr,10,PAGE_READWRITE,&dwOldFlag);
WriteProcessMemory(hProcess,(LPVOID)dwNOPAddr,g_abOriCode,sizeof(g_abOriCode),NULL);
//GeneratethejmpTextoutA+5
__asm
{
moveax,g_oriTextout;
movebx,dwNOPAddr;
addebx,5;
subeax,ebx;
movdwordptr[g_abJmpCode+1],eax;
}
WriteProcessMemory(hProcess,(LPVOID)(dwNOPAddr+5),g_abJmpCode,sizeof(g_abJmpCode),NULL);
VirtualProtectEx(hProcess,(LPVOID)dwNOPAddr,10,dwOldFlag,NULL);
g_blHooked=TRUE;
if(TRUE)
returnTRUE;
HookLabel:
NAKED_PROLOG();
intnx,ny;
LPCSTRlp;
lp=NULL;
_asm
{
movesi,ebp;
addesi,0Ch;
leaedi,nx;
movsd;
leaedi,ny;
movsd;
leaedi,lp;
movsd;
}
WriteLog_F("Trytoouput\"%s\"at(%d,%d)\n",lp,nx,ny);
//Dothecommonepilog.
EPILOG_COMMON();
NOPLabel:
_asmNO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江西吉安青源发展集团有限公司下属子公司面向社会招聘临聘人员12人笔试备考题库及答案详解
- 2026贵阳学院科研助理招聘50人考试参考题库及答案解析
- 2026年北京市崇文区卫生健康系统人员招聘笔试参考题库及答案解析
- 2026年白山市应急管理系统事业单位人员招聘考试备考试题及答案详解
- 2026江苏南通市通州湾示范区财政金融局招聘购买服务人员1人考试模拟试题及答案解析
- 2026湖南省浏阳市公开招聘事业单位工作人员66人考试备考试题及答案解析
- 2026年大庆市住房和城乡建设系统事业单位人员招聘考试备考试题及答案详解
- 2026年巢湖市政府采购中心(公共资源交易中心)人员招聘考试备考试题及答案详解
- 2026年保定市市场监督管理系统事业单位人员招聘考试备考试题及答案详解
- 2026 增肌期清蒸鱼课件
- 重复医学检查检验工作制度
- GA 991-2025爆破作业项目管理要求
- 2026年学习教育查摆问题清单及整改措施台账(四个方面16条)
- 2025年四川省成都市小升初语文试卷
- 2025 小学高年级写作竞争合作主题的探讨课件
- 2026年新版八年级下学期道德法治核心知识点资料
- 中国电力建设集团有限公司招聘笔试题库2026
- 2026春新版二年级下册道德与法治全册教案教学设计(表格式)
- 投资项目尽职调查报告书范本
- 材料工程技术毕业答辩
- 理肤泉行业数据分析报告
评论
0/150
提交评论