版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2012年高考语文试卷(安徽)(空白卷)
- 《离子浓度大小比较》课件
- 挑战与突破自我
- 探索物理定律的奥秘
- 《痛苦的职场人》课件
- 工作调研报告(合集三篇)
- 2023年项目部安全管理人员安全培训考试题附参考答案(达标题)
- 2023年项目部安全管理人员安全培训考试题(1套)
- 母亲节新媒体策划
- 初中语文教师教学工作总结11篇
- CNAS-CL02-A001:2023 医学实验室质量和能力认可准则的应用要求
- 海康威视枪机摄像机检测报告.文档
- 部编小语一下三单元(《小公鸡和小鸭子》《树和喜鹊》《怎么都快乐》)大单元学习任务群教学设计
- 体检中心组织架构
- 森林抚育投标方案
- 中小学教育中课程资源的开发与利用
- 大班科学教案:我和风儿做游戏教案及反思
- 园艺治疗概念、内涵与理论依据
- 后续服务承诺及保证措施-后续服务
- 提高无创呼吸机患者的依从性
- 小儿急性颅内压增高的护理课件
评论
0/150
提交评论