![Windows下的函數(shù)hook技術(shù)_第1頁](http://file4.renrendoc.com/view10/M03/18/3A/wKhkGWWct5aAH6IRAAIAua0Cpr0049.jpg)
![Windows下的函數(shù)hook技術(shù)_第2頁](http://file4.renrendoc.com/view10/M03/18/3A/wKhkGWWct5aAH6IRAAIAua0Cpr00492.jpg)
![Windows下的函數(shù)hook技術(shù)_第3頁](http://file4.renrendoc.com/view10/M03/18/3A/wKhkGWWct5aAH6IRAAIAua0Cpr00493.jpg)
![Windows下的函數(shù)hook技術(shù)_第4頁](http://file4.renrendoc.com/view10/M03/18/3A/wKhkGWWct5aAH6IRAAIAua0Cpr00494.jpg)
![Windows下的函數(shù)hook技術(shù)_第5頁](http://file4.renrendoc.com/view10/M03/18/3A/wKhkGWWct5aAH6IRAAIAua0Cpr00495.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Windows下的函數(shù)hook技術(shù)都是很成熟的東西了,這幾天看了看,總結(jié)一下而已。討論了Windows下hook函數(shù)的幾種方法。提供了一個hookTextOutA的完整例子。通過CreateRemoteThread的方法把hookdll注入到一個普通的應(yīng)用程序中。HookingImportedFunctionsbyname調(diào)用importedfunctions'時的步驟/實(shí)現(xiàn)在程序中調(diào)用從其它模塊引入的函數(shù)的方法和普通的函數(shù)調(diào)用有所不同。對于普通的函數(shù)調(diào)用,直接使用calladdress來調(diào)用即可,但是對于importedfunctions,在編譯的時候compiler/link并不知道實(shí)際的函數(shù)實(shí)現(xiàn)會被加載到那個地址,函數(shù)實(shí)現(xiàn)在那個地址在運(yùn)行的時候才會確定。對于importedfunctions,首先是call引入表中的一個函數(shù),在運(yùn)行時再初始化引入表,使用jmp跳轉(zhuǎn)到真實(shí)的函數(shù)實(shí)現(xiàn)。引入表:
ThePEfileIMAGE_IMPORT_DESCRIPTORstructure,whichholdsalltheinformationaboutfunctionsimportedfromaspecificDLL,haspointerstotwoarraysintheexecutable.Thesearraysarecalledimportaddresstables(IATs),orsometimesthunkdataarrays.ThefirstpointerreferencestherealIAT,whichtheprogramloaderfixesupwhentheexecutableisloaded.ThesecondpointerreferencestheoriginalIAT,whichisuntouchedbytheloaderandliststheimportedfunctions.實(shí)現(xiàn)原理找到PE文件的Image_Import_Descriptor結(jié)構(gòu)找到OriginalLAT和RealLAT.通過要hook的函數(shù)的名字在OriginalLAT找到要hook的importedfunction在數(shù)組中的index.保存并修改RealLAT在相應(yīng)index的functionaddress(refertoJohnRobbins,BugsLayerUtil.dll)HookingImportedFunctionsbyordinal原理和HookImportedfunctionsbyname一樣,只是是通過要hook的函數(shù)的ordinal在originalLAT中找到index.Hookingafunctioninthisdll
當(dāng)一個DLL是通過LoadLibrary載入的時候,我們無法通過hookimportedfunction的方法的hook它中的function
。有兩種可能的辦法處理這種情況:
第一種方法,遍歷進(jìn)程空間,發(fā)現(xiàn)call指定函數(shù)的地方替換為callhookFunction.太麻煩,而且不安全。
第二種方法,改寫要hook的函數(shù)FuncA
。比較好的方法實(shí)現(xiàn)HookFuncA,最后的實(shí)現(xiàn)墊入n個nop.找到要hook的函數(shù)FuncA的絕對地址,改寫前5個字節(jié)為jmphookFuncA(假定前5個字節(jié)為n個完整的指令)把FuncA的前5個字節(jié)拷貝到hookFuncA的后面,在加上一條指令jmpfuncA+5.
CodeofHookDLL.dll,可以通過CreateRemoteThread的方法把hookdll注入到一個普通的應(yīng)用程序中。//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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鋰電池用特種玻璃粉項(xiàng)目立項(xiàng)申請報(bào)告模范
- 2025年二手教練車銷售合同格式
- 2025年乳制品代理銷售合同
- 2025年阻沙固沙網(wǎng)項(xiàng)目立項(xiàng)申請報(bào)告模板
- 2025年不動產(chǎn)權(quán)購房合同范本
- 2025年家禽購銷合同協(xié)議
- 2025年陶瓷基體項(xiàng)目申請報(bào)告模范
- 2025年健身器材購置合同
- 2025年合伙型股權(quán)分配合同
- 2025年度制造業(yè)租賃協(xié)議樣式
- 撫恤金喪葬費(fèi)協(xié)議書模板
- 準(zhǔn)備單元 雪地上的“足跡”(教學(xué)設(shè)計(jì))-2023-2024學(xué)年五年級下冊科學(xué)大象版
- 信息技術(shù)必修一《數(shù)據(jù)與計(jì)算》三章第二節(jié)《數(shù)據(jù)分析與可視化》教案
- NB-T32042-2018光伏發(fā)電工程建設(shè)監(jiān)理規(guī)范
- 中國電信入職流程
- 音樂學(xué)科閱讀方案
- 2024-2030年中國醫(yī)藥設(shè)備市場發(fā)展分析及市場趨勢與投資方向研究報(bào)告
- 基于新課標(biāo)學(xué)習(xí)的教材解讀及教學(xué)建議部編《道德與法治》二年級下冊
- 《社區(qū)康復(fù)》課件-第二章 社區(qū)康復(fù)的內(nèi)容
- 淚道狹窄與阻塞的護(hù)理
- 銑床工安全技術(shù)操作規(guī)程培訓(xùn)
評論
0/150
提交評論