本篇将簡單科普Hook攻防的一些基礎和常見的Hook,但不會對每一個Hook進行詳細介紹。
本筆記是由本人獨自整理出來的,圖檔來源于網絡。本人非計算機專業,可能對本教程涉及的事物沒有了解的足夠深入,如有錯誤,歡迎批評指正。 如有好的建議,歡迎回報。碼字不易,如果本篇文章有幫助你的,如有閑錢,可以打賞支援我的創作。如想轉載,請把我的轉載資訊附在文章後面,并聲明我的個人資訊和本人部落格位址即可,但必須事先通知我。
本篇文章主要是讓讀者對<code>Hook</code>有一個最基礎的了解,并不是詳細介紹<code>Hook</code>的使用,如果有這個想法的請不要繼續閱讀,以免浪費時間。
1、将生成的.h與.lib檔案複制到項目根目錄,然後在代碼中引用:
2、将<code>xxxx.H</code>與<code>xxxx.LIB</code>檔案複制到開發環境安裝目錄,與庫檔案放在一起然後在工程->設定->連接配接->對象/庫子產品中添加<code>xxxx.lib</code>。
1、使用靜态連結生成的可執行檔案體積較大
2、包含相同的公共代碼,造成浪費
方法1、extern "C"_declspec(dllexport)調用約定 傳回類型 函數名(參數清單);
方法2、使用.def檔案:
使用序号導出的好處:
名字是一段程式就精華的注釋,通過名字可以直接猜測到函數的功能通過使用序号,可以達到隐藏的目的
步驟1
步驟2
步驟3
步驟4
步驟5
步驟6
步驟1:<code>将*.dll *.lib放到工程目錄下面</code>
步驟2:将<code>##pragma comment(lib,"DLL名.lib")</code>添加到調用檔案中
步驟3:加入函數的聲明
<code>declspec(dllimport) __stdcall int Fuc (int x,int y);</code>
【注意】dll裡面怎麼聲明的,步驟3就怎麼聲明
所謂注入就是在第三方程序不知道或者不允許的情況下将子產品或者代碼寫入對方程序空間,并設法執行的技術。
遠端線程注入、APC注入、消息鈎子注入、系統資料庫注入、導入表注入、輸入法注入等等。
1️⃣ Dll部分
建立動态連結庫工程,在<code>DLL_PROCESS_ATTACH</code>寫你想幹事情的代碼。
2️⃣ 注入工程部分
1、擷取注入程序的句柄(<code>OpenProcess</code>/<code>CreateProcess</code>)
2、由于遠端線程注入需要被注入線程的東西,調用LoadLibrary需要路徑,需要配置設定記憶體,故調用<code>VirtualAllocEx</code>讓注入程序擷取一段記憶體,用來寫字元串
3、用<code>WriteProcessMemory</code>往配置設定好的記憶體寫路徑字元串
4、擷取<code>Kernel32.dll</code>的位址,每一個<code>Kernel32.dll</code>在程序的位址都是一樣的,是以擷取自己的就行了。
5、從擷取的<code>Kernel32.dll</code>的位址得到<code>LoadLibraryA</code>的位址。
5、代碼想執行,必須有線程,開一個遠端線程,由于線程函數與<code>LoadLibraryA</code>的參數性質和個數是一樣的,故可把<code>LoadLibraryA</code>當線程進行建立。
6、遠端線程注入完畢,如果程式沒有對抗措施就成功了
1、 TEB(Thread Environment Block ),它記錄的相關線程的資訊,每一個線程都有自己的TEB,<code>FS:[0]</code>即是目前線程的TEB。
<code>mov eax,fs:[0]</code>
2、 PEB(Process Environment Block,程序環境塊)存放程序資訊,每個程序都有自己的PEB資訊,TEB偏移Ox30即目前程序的PEB。
3、TEB與PEB都在使用者空間(3環)
☀️ 子產品是永遠不可能真正隐藏的,就算斷鍊、寫驅動抹去0環的VAD樹的子產品名、抹去記憶體的PE指紋,重寫3環的LoadLibrary,但真正函數實作在0環,0環是不能重寫的,比你強的人還是能監控到。
下面的注意事項由于會用到位址,拷貝的時候注意修改
1、全局變量
2、常量字元串
3、系統調用
4、調用其他函數
1、用結構體打包需要拷貝到注入程序需要的資料
2、寫一個注入程序需要的線程函數
3、擷取程序句柄
4、給注入程序配置設定好需要的記憶體,并給結構體指派
5、修正程序位址(因為增量連結的原因,直接拷貝隻有一個jmp,jmp後的位址才是真位址)
6、拷貝線程代碼(寫死)和結構體
7、建立遠端線
不依賴環境,放到任何地方都可以執行的機器碼。
每個程式都會有一個IAT表,當程式啟動後,IAT表将填入函數位址,若修改裡面的函數位址,指向自己函數的位址,每當程式調用該函數時,都會走自己的函數。
➡️ 操作流程
1、利用PE結構搜尋要Hook的函數位址
2、設定頁屬性(VirtualProtect)為可讀寫,如果直接寫程式會崩潰
3、修改,備份(如果恢複需要)
4、恢複頁屬性
➡️ 缺點
1、容易被檢測到
2、隻能Hook <code>IAT</code>表裡的函數
一個類如果有虛函數,編譯器會給其建構一個表,稱之為虛表
找到需要修改的虛函數位址,修改虛表中的函數位址即可。
操作Hook準備:<code>pushad/pushfd</code>
恢複:<code>popad/popfd</code>
裸函數不能直接使用局部變量
1、找到要Hook的位址,覆寫jmp到你操作的函數位址,用Call可以幹掉檢測E9的一些人。
2、注意Hook用的函數設定為<code>_declspec(naked)</code>,否則無法正确讀取參數。也要注意保護寄存器。
3、注意跳回原函數

本作品采用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定 進行許可
本文來自部落格園,作者:寂靜的羽夏 ,一個熱愛計算機技術的菜鳥
轉載請注明原文連結:https://www.cnblogs.com/wingsummer/p/15253767.html