漫漫學習路之Hook總結

  • 2020 年 1 月 13 日
  • 筆記

前言

本篇文章是之前我在學習Android Hook技術時的學習總結。閑來無事,回頭看到筆記時已發現蜘蛛網已經封存了我的秘籍,辛虧打開一看,My Study總結還完好。

看了下就是覺得目前的認知已經比以前提高很多了,相信大家也深有體會,要是明年的你看今年的你,並不覺得自己愚蠢,那說明你很可能在這一年裡沒有進步。所幸,5年後的我才發現自己的愚蠢,WTM?咋就蠢了5年?

5年了,看著身邊的朋友一個個脫單,作為母胎單身的我還在向人類心理滲透,最後得出Hook總結,若有問題,請大哥們嘴下留情,看在母胎單身的我的份上,您看著親。


Hook是一種特殊的消息處理機制,它可以監視系統或者進程中的各種事件消息,截獲發往目標窗口的消息進行處理。說白了就是消息攔截機制,可以攔截單個進程的消息(執行緒鉤子),也可以攔截所有進程的消息(系統鉤子)。

舉個例子:魚鉤是用來釣魚的,一旦魚咬了鉤,鉤子就一直鉤住魚了,任憑魚在水裡怎麼游,也逃不出魚鉤的控制。最常見的就是滑鼠和鍵盤鉤子,用Hook鉤子鉤住滑鼠、鍵盤,當你的滑鼠、鍵盤有任何操作時,通過Hook就能知道他們都做了什麼了,不管你幹什麼,都逃不過我鉤子Hook的手掌心。(引用了別人的例子,當時我一看了這個例子後就知道Hook是幹嘛的,很形象。)

Hook機制是回調機制的一種,普通的回調是靜態的,我們必須提前寫好回調介面;然而Hook機制在Java中則可以利用反射,針對切入點(通常是一個成員變數),採用替換的手段,使程式碼在運行時改變。說白了就是偷梁換柱

先找到適合Hook點,然後創建繼承自Hook點的對象的子類,根據需求修改其相應的方法,再使用反射將我們自己創建的對象替換到對象實例中的對象。

例如:原本該回調的函數是A函數,但是現在我自己創建一個B函數,使其回調時用的是B函數(對象)。

要實現捕獲全局消息功能的鉤子,是否要寫在單獨的DLL裡面,取決於鉤子的類型以及相應的作用域。也就是如果鉤子本身的作用域是全局的,那無論是放在執行緒還是DLL中,它都可以捕獲全局消息;


以上的總結是對Hook機制的理解總結,我會按以下幾個方向繼續描述

1. Hook工作原理

當您創建一個鉤子時,Windows會先在記憶體中創建一個數據結構,該數據結構包含了鉤子的相關資訊,然後把該結構體加到已經存在的鉤子鏈表中去。新的鉤子將加到老的前面。當一個事件發生時,如果您安裝的是一個執行緒鉤子,您進程中的鉤子函數將被調用;

如果是一個系統鉤子,系統就必須把鉤子函數插入到其它進程的地址空間,要做到這一點要求鉤子函數必須在一個動態鏈接庫中。

當然有兩個例外:工作日誌鉤子和工作日誌回放鉤子。這兩個鉤子的鉤子函數必須在安裝鉤子的執行緒中。

原因是:這兩個鉤子是用來監控比較底層的硬體事件的,既然是記錄和回放,所有的事件就當然都是有先後次序的。

所以如果把回調函數放在DLL中,輸入的事件被放在幾個執行緒中記錄,所以我們無法保證得到正確的次序。故解決的辦法是:把鉤子函數放到單個的執行緒中,譬如安裝鉤子的執行緒。

幾點需要說明的地方:

(1) 如果對於同一事件(如滑鼠消息)既安裝了執行緒鉤子又安裝了系統鉤子,那麼系統會自動先調用執行緒鉤子,然後調用系統鉤子。

(2) 對同一事件消息可安裝多個鉤子處理過程,這些鉤子處理過程形成了鉤子鏈。當前鉤子處理結束後應把鉤子資訊傳遞給下一個鉤子函數。而且最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最後,也就是後加入的先獲得控制權。

(3) 鉤子特別是系統鉤子會消耗消息處理時間,降低系統性能。只有在必要的時候才安裝鉤子,在使用完畢後要及時卸載。

2. Hook的作用

Hook攻擊的目的有很多,作用很廣,這取決於你的目的是什麼,比如你想在APP插入一段廣告,那麼你只需要將第三方程式碼注入到進程當中即可。

3. Hook攻擊的本質

在一個目標進程中通過改變函數方法的指向地址,加入一段自定義的程式碼塊。

4. 如何檢測APP被Hook

A. 查找設備安裝目錄中是否存在Hook工具

B. 查找設備存儲中是否存在Hook安裝文件

C. 查找程式運行的棧中是否存在Hook相關類

D. 綜合判斷(true為Hook)

Public static boolean isHook(Context context) { if(findHookAppName(context) || findHookAppFile() || findHookStack()) { Return true; } Return false; }

http://itindex.net/detail/58019-android-hook-技術

5. Hook攻擊的前提條件

成功將第三方程式碼注入到目標應用程式,具有寫入記憶體頁面的許可權。

6. 如何找適合Hook點

這裡引用別人的一篇文章,

https://blog.csdn.net/sparkleyn/article/details/82112212

7. 怎麼用Hook攻擊

首先我們要使用Hook框架,最出名的莫過於Xposed框架和Frida框架。

使用Xposed進行Hook步驟:

A. 在AndroidManifest.xml文件中配置插件名稱與API版本號

B. 新創建一個入口類繼承並實現IXposedHookLoadPackage介面

C. 聲明主入口路徑

D. 使用findAndLoadHookMethod方法Hook劫持登錄資訊

E. 在XposedInstaller中啟動自定義的模組

F. 重啟驗證

大家可以看看這篇文章

https://zhuanlan.zhihu.com/p/25604142

8. 如何防止Hook攻擊

A. 攔截VirtualProtect並檢查該函數

B. 實時監測動態庫

C. Xposed Installer檢測:Java層檢測和Native層檢測

參考文章:

https://www.cnblogs.com/miaohj/p/5945244.html

https://blog.csdn.net/weixin_33835103/article/details/87983521

https://zhuanlan.zhihu.com/p/25604142

https://www.52pojie.cn/thread-873013-1-1.html?tdsourcetag=s_pctim_aiomsg

好了,先暫時寫到這裡啦,有個妞終於回復我了,她約我出來吃飯,我說我要打遊戲。

看來即使月老下凡,也阻擋不了我把鋼筋掰斷。

喜歡請隨手點個在看哦~