簡單HOOK流程


六,注入與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 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM