六,注入與HOOK
dll注入
我們想在遠程的進程中注入一段程序,即我們寫的代碼,注入一個dll是最合適,也是最方便的
注入dll的套路:
一,打開進程,獲取到進程句柄二,根據打開的進程,我們在遠程進程上開辟內存空間,方便我們一會將dll寫入開辟的空間內三,我們先將dll的路徑寫入開辟的虛擬內存內,先寫路徑是因為我們一會要實現LoadLibaryA函數,它需要一個路徑參數,這個參數需要在自己程序的的虛擬內存中四,核心步驟,在遠程的進程中開辟一個線程,並且將線程回調函數設置為LoadLibaryA,參數就是我們上面第二步的首地址 CreateRemoteThread在其他進程創建線程因為現在這片虛擬內存上只有我們寫的路徑,把它當做開辟線程函數里面線程回調函數的參數(也就是dll的路徑)這樣線程一被創建我們的dll就被加載五,等待遠程線程退出WaitforSingleObject六,釋放內存,關閉句柄![]()
HOOK
HOOK是程序設置中最為靈活多變的技巧之一,HOOK含義:1. 系統提供的消息HOOK機制2. 自定義HOOK編程技巧其中第一條系統提供的消息HOOK機制,是由一系列的API提供的一種服務,這個系列的API可以完成大多數應用程序關鍵節點的HOOK操作,為此Windows為每種HOOK類型維護了一個鈎子鏈表,我們可以通過一個系統API來完成對整個系統中的所有符合此機制的關鍵點的HOOK第二條HOOK編程技巧是基於特點的系統結構,文件結構,匯編語言技術,后面詳細去分析消息HOOK機制
思路:windows操作系統是以事件驅動,進程從消息隊列獲取到消息,做出不同的反應,如果我們在進程獲取消息之前捕捉到了消息,對消息加以處理,在決定給不給進程發這個消息,就達到了對消息的掌控權,消息HOOK機制就是在系統消息隊列和進程消息隊列中而建立的一種機制我們在這兩個隊列中添加消息鈎子,可以添加不止一次,從而鈎子將形成一個鈎子鏈,依次去調用函數,而我們勾住什么類型的消息就可以由我們鈎子函數中決定,因此勾住消息的類型不止一種具體實現:一![]()
二,創建鈎子
這里解釋下SetWindowsHookEx函數的最后一個參數,為0代表勾住所有的線程
三,具體的去實現鈎子函數![]()
自定義鈎子系統消息鈎子的附加作用一般情況下,我們要設置消息鈎子的函數寫在一個dll中,當勾住一個GUI線程后,產生消息的時候, 加入系統發現包含鈎子函數的dll不在本進程中,就會為此dll強行加載到對方的進程中
下面我們實現的所有的HOOK前提是將Dll注入到對應的進程中IAT注入
IAT注入的原理在於我們在進程中注入一個Dll時候,並使用它的函數,實際上實在使用數據目錄表中導入的最后一項FirstThun,它表示我們加載函數的地址,如果修改了它,那么我們在調用函數的時候,就會調用我們自己的寫函數地址。這樣就達到了修改函數作用HOOK IAT的步驟也很簡單一,解析PE,找到導入表二,找到導入表中對應的IAT三,找到對應IAT中對應的函數,我們想修改哪個函數,就可以遍歷查找它的位置四,修改函數地址具體實現:在上面的步驟大概說了實現的流程,但是有幾個細節需要解釋下一,我們在注入IAT表的時候,需要將注入的整個流程寫在dll里面,將dll加載到我們寫的進程中![]()
二,我們要修改哪些函數地址,就必須知道這些函數原來的地址在哪,所以在修改IAT前先獲取到我們要修改函數的地址,這里修改MessageBox
上面的第一個變量獲取的是真正的MessageBoxW函數的地址第二個變量是我們編寫的假MyMessageBox地址,他們兩個用全局變量去接收但是這里假的MyMessageBox,實現的功能也要去修改一下三,實現假的MyMessageBox![]()
三,修改IAT操作
四,修改完了,也可以修改回去
內聯HOOK注入內聯HOOK的操作就顯得靈活多變,操作起來約束較少
思路:他要實現的功能還是,某一塊代碼我不想讓他執行,要執行我們的代碼,就要將他的匯編值修改先JMP到我們的代碼塊,在JMP回去,這樣就悄無聲息的完成了跳轉執行,跳轉回來,原來的程序也會正常執行![]()
具體代碼:一,在dll打開的時候去調用內聯HOOK函數,和上面的一樣
二,實現修改OPCODE,也就是掛上鈎子
三,實現我們自己的代碼,也就是跳轉過來的代碼
回顧:上面圖,之前這里的解釋有些錯誤,附加圖,重新理解下
四,脫鈎,上面的函數要用到脫鈎,應該將脫鈎函數寫在上面
公式:地址偏移(找到我們寫的代碼)= 目標地址 - JMP所在地址 - 5











