版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Windows下的函數(shù)hook技術(shù)都是很成熟的東西了,這幾天看了看,總結(jié)一下而已。討論了Windows下hook函數(shù)的幾種方法。提供了一個(gè)hookTextOutA的完整例子。通過(guò)CreateRemoteThread的方法把hookdll注入到一個(gè)普通的應(yīng)用程序中。HookingImportedFunctionsbyname調(diào)用importedfunctions'時(shí)的步驟/實(shí)現(xiàn)在程序中調(diào)用從其它模塊引入的函數(shù)的方法和普通的函數(shù)調(diào)用有所不同。對(duì)于普通的函數(shù)調(diào)用,直接使用calladdress來(lái)調(diào)用即可,但是對(duì)于importedfunctions,在編譯的時(shí)候compiler/link并不知道實(shí)際的函數(shù)實(shí)現(xiàn)會(huì)被加載到那個(gè)地址,函數(shù)實(shí)現(xiàn)在那個(gè)地址在運(yùn)行的時(shí)候才會(huì)確定。對(duì)于importedfunctions,首先是call引入表中的一個(gè)函數(shù),在運(yùn)行時(shí)再初始化引入表,使用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.通過(guò)要hook的函數(shù)的名字在OriginalLAT找到要hook的importedfunction在數(shù)組中的index.保存并修改RealLAT在相應(yīng)index的functionaddress(refertoJohnRobbins,BugsLayerUtil.dll)HookingImportedFunctionsbyordinal原理和HookImportedfunctionsbyname一樣,只是是通過(guò)要hook的函數(shù)的ordinal在originalLAT中找到index.Hookingafunctioninthisdll
當(dāng)一個(gè)DLL是通過(guò)LoadLibrary載入的時(shí)候,我們無(wú)法通過(guò)hookimportedfunction的方法的hook它中的function
。有兩種可能的辦法處理這種情況:
第一種方法,遍歷進(jìn)程空間,發(fā)現(xiàn)call指定函數(shù)的地方替換為callhookFunction.太麻煩,而且不安全。
第二種方法,改寫(xiě)要hook的函數(shù)FuncA
。比較好的方法實(shí)現(xiàn)HookFuncA,最后的實(shí)現(xiàn)墊入n個(gè)nop.找到要hook的函數(shù)FuncA的絕對(duì)地址,改寫(xiě)前5個(gè)字節(jié)為jmphookFuncA(假定前5個(gè)字節(jié)為n個(gè)完整的指令)把FuncA的前5個(gè)字節(jié)拷貝到hookFuncA的后面,在加上一條指令jmpfuncA+5.
CodeofHookDLL.dll,可以通過(guò)CreateRemoteThread的方法把hookdll注入到一個(gè)普通的應(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 烏海2025年內(nèi)蒙古烏海市事業(yè)單位第二批人才引進(jìn)36人筆試歷年參考題庫(kù)附帶答案詳解
- 中央2025年黃埔雜志社招聘應(yīng)屆生筆試歷年參考題庫(kù)附帶答案詳解
- 中央2025年中國(guó)發(fā)展雜志社招聘筆試歷年參考題庫(kù)附帶答案詳解
- 上海2025年上海海關(guān)學(xué)院招聘筆試歷年參考題庫(kù)附帶答案詳解
- 浙江國(guó)企招聘2025寧波報(bào)業(yè)傳媒集團(tuán)有限公司招聘5人筆試歷年參考題庫(kù)附帶答案詳解
- 中國(guó)電建集團(tuán)河北工程有限公司2026屆秋季招聘110人筆試參考題庫(kù)附帶答案詳解(3卷)
- 2026有研粉末新材料股份有限公司校招16人筆試參考題庫(kù)附帶答案詳解(3卷)
- 2026北礦科技校園招聘22人筆試參考題庫(kù)附帶答案詳解(3卷)
- 集團(tuán)有限公司全球招聘考前自測(cè)高頻考點(diǎn)模擬試題完整參考答案詳解
- 國(guó)別貿(mào)易環(huán)境及貿(mào)易壁壘風(fēng)險(xiǎn)防范
- 國(guó)家級(jí)算力樞紐節(jié)點(diǎn)(東數(shù)西算)跨區(qū)域調(diào)度網(wǎng)絡(luò)與綠色節(jié)能數(shù)據(jù)中心建設(shè)規(guī)劃方案
- 近五年河北中考英語(yǔ)試題及答案2025
- 山西省臨汾市2025-2026年八年級(jí)上物理期末試卷(含答案)
- (2025年)員工安全培訓(xùn)考試試題(含答案)
- GB/T 36132-2025綠色工廠評(píng)價(jià)通則
- 2025-2026學(xué)年北師大版八年級(jí)數(shù)學(xué)上冊(cè)期末復(fù)習(xí)卷(含答案)
- 2025年艾滋病培訓(xùn)試題與答案(全文)
- 【二下數(shù)學(xué)】計(jì)算每日一練60天(口算豎式脫式應(yīng)用題)
- 殘疾人服務(wù)與權(quán)益保護(hù)手冊(cè)(標(biāo)準(zhǔn)版)
- 2025年1月-12月時(shí)事政治歸納總結(jié)(備考必背)
- 云南師大附中2026屆高三高考適應(yīng)性月考卷(六)歷史試卷(含答案及解析)
評(píng)論
0/150
提交評(píng)論