篮球公园经典百战扣篮
當前位置:首頁 > 開發教程 > 手機開發 >

Android Hook 機制之簡單實戰

時間:2019-09-12 13:53 來源: 作者:迷你奇 瀏覽: 收藏 挑錯 推薦 打印

什么是 Hook Hook 又叫鉤子,它可以在事件傳送的過程中截獲并監控事件的傳輸,將自身的代碼與系統方法進行融入。這樣當這些方法被調用時,也就可以執行我們自己的代碼,這也是面向切面編程的思想(AOP)。 Hook 分類 1.根據Android開發模式,Native模式(C/C

什么是 Hook

Hook 又叫“鉤子”,它可以在事件傳送的過程中截獲并監控事件的傳輸,將自身的代碼與系統方法進行融入。這樣當這些方法被調用時,也就可以執行我們自己的代碼,這也是面向切面編程的思想(AOP)。

Hook 分類

1.根據Android開發模式,Native模式(C/C++)和Java模式(Java)區分,在Android平臺上

Java層級的Hook;

Native層級的Hook;

2.根 Hook 對象與 Hook 后處理事件方式不同,Hook還分為:

消息Hook;

API Hook;

3.針對Hook的不同進程上來說,還可以分為:

全局Hook;

單個進程Hook;

常見 Hook 框架

在Android開發中,有以下常見的一些Hook框架:

1.Xposed

通過替換 /system/bin/app_process 程序控制 Zygote 進程,使得 app_process 在啟動過程中會加載 XposedBridge.jar 這個 Jar 包,從而完成對 Zygote 進程及其創建的 Dalvik 虛擬機的劫持。

Xposed 在開機的時候完成對所有的 Hook Function 的劫持,在原 Function 執行的前后加上自定義代碼。

2.Cydia Substrate

Cydia Substrate 框架為蘋果用戶提供了越獄相關的服務框架,當然也推出了 Android 版 。Cydia Substrate 是一個代碼修改平臺,它可以修改任何進程的代碼。不管是用 Java 還是 C/C++(native代碼)編寫的,而 Xposed 只支持 Hook app_process 中的 Java 函數。

3.Legend

Legend 是 Android 免 Root 環境下的一個 Apk Hook 框架,該框架代碼設計簡潔,通用性高,適合逆向工程時一些 Hook 場景。大部分的功能都放到了 Java 層,這樣的兼容性就非常好。

原理是這樣的,直接構造出新舊方法對應的虛擬機數據結構,然后替換信息寫到內存中即可。

 

Hook 必須掌握的知識

反射

如果你對反射還不是很熟悉的話,建議你先復習一下 java 反射的相關知識。有興趣的,可以看一下我的這一篇博客 Java 反射機制詳解

java 的動態代理

動態代理是指在運行時動態生成代理類,不需要我們像靜態代理那個去手動寫一個個的代理類。在 java 中,我們可以使用 InvocationHandler 實現動態代理.

Hook 使用實例

Hook 選擇的關鍵點

  • Hook 的選擇點:盡量靜態變量和單例,因為一旦創建對象,它們不容易變化,非常容易定位。
  • Hook 過程:
  • 尋找 Hook 點,原則是盡量靜態變量或者單例對象,盡量 Hook public 的對象和方法。
  • 選擇合適的代理方式,如果是接口可以用動態代理。
  • 偷梁換柱——用代理對象替換原始對象。
  • Android 的 API 版本比較多,方法和類可能不一樣,所以要做好 API 的兼容工作。

簡單案例一: 使用 Hook 修改 View.OnClickListener 事件

首先,我們先分析 View.setOnClickListener 源碼,找出合適的 Hook 點。可以看到 OnClickListener 對象被保存在了一個叫做 ListenerInfo 的內部類里,其中 mListenerInfo 是 View 的成員變量。ListeneInfo 里面保存了 View 的各種監聽事件。因此,我們可以想辦法 hook ListenerInfo 的 mOnClickListener 。

Android Hook 機制之簡單實戰

 

接下來,讓我們一起來看一下怎樣 Hook View.OnClickListener 事件?

大概分為三步:

第一步:獲取 ListenerInfo 對象

從 View 的源代碼,我們可以知道我們可以通過 getListenerInfo 方法獲取,于是,我們利用反射得到 ListenerInfo 對象

第二步:獲取原始的 OnClickListener事件方法

從上面的分析,我們知道 OnClickListener 事件被保存在 ListenerInfo 里面,同理我們利用反射獲取

第三步:偷梁換柱,用 Hook代理類 替換原始的 OnClickListener

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

執行以下代碼,將會看到當我們點擊該按鈕的時候,會彈出 toast “Hook Click Listener”

Android Hook 機制之簡單實戰

 

簡單案例二: HooK Notification

發送消息到通知欄的核心代碼如下:

Android Hook 機制之簡單實戰

 

跟蹤 notify 方法發現最終會調用到 notifyAsUser 方法

Android Hook 機制之簡單實戰

 

而在 notifyAsUser 方法中,我們驚喜地發現 service 是一個單例,因此,我們可以想方法 hook 住這個 service,而 notifyAsUser 最終會調用到 service 的 enqueueNotificationWithTag 方法。因此 hook 住 service 的 enqueueNotificationWithTag 方法即可

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

綜上,要 Hook Notification,大概需要三步:

第一步:得到 NotificationManager 的 sService

第二步:因為 sService 是接口,所以我們可以使用動態代理,獲取動態代理對象

第三步:偷梁換柱,使用動態代理對象 proxyNotiMng 替換系統的 sService

 

于是,我們可以寫出如下的代碼

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

Hook 使用進階

Hook ClipboardManager

第一種方法

從上面的 hook NotificationManager 例子中,我們可以得知 NotificationManager 中有一個靜態變量 sService,這個變量是遠端的 service。因此,我們嘗試查找 ClipboardManager 中是不是也存在相同的類似靜態變量。

查看它的源碼發現它存在 mService 變量,該變量是在 ClipboardManager 構造函數中初始化的,而 ClipboardManager 的構造方法用 @hide 標記,表明該方法對調用者不可見。

而我們知道 ClipboardManager,NotificationManager 其實這些都是單例的,即系統只會創建一次。因此我們也可以認為

ClipboardManager 的 mService 是單例的。因此 mService 應該是可以考慮 hook 的一個點。

Android Hook 機制之簡單實戰

 

接下來,我們再來一個看一下 ClipboardManager 的相關方法 setPrimaryClip , getPrimaryClip

Android Hook 機制之簡單實戰

 

可以發現這些方法最終都會調用到 mService 的相關方法。因此,ClipboardManager 的 mService 確實是一個可以 hook 的一個點。

hook ClipboardManager.mService 的實現

大概需要三個步驟

第一步:得到 ClipboardManager 的 mService

第二步:初始化動態代理對象

第三步:偷梁換柱,使用 proxyNotiMng 替換系統的 mService

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

第二種方法

對 Android 源碼有基本了解的人都知道,Android 中的各種 Manager 都是通過 ServiceManager 獲取的。因此,我們可以通過 ServiceManager hook 所有系統 Manager,ClipboardManager 當然也不例外。

Android Hook 機制之簡單實戰

 

老套路

第一步:通過反射獲取剪切板服務的遠程Binder對象,這里我們可以通過 ServiceManager getService 方法獲得

第二步:創建我們的動態代理對象,動態代理原來的Binder對象

第三步:偷梁換柱,把我們的動態代理對象設置進去

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰

 

Android Hook 機制之簡單實戰
Android Hook 機制之簡單實戰轉載http://www.vrifwh.tw/jiaocheng/shoujikaifa/43826.html

手機開發閱讀排行

最新文章

篮球公园经典百战扣篮
江西多乐彩 重庆时时彩计划蚂蚁 今日山西快乐10分走势 福彩3D玩法 福彩开奖结果 陕西快乐10分软件 北京pk10手机版走势图 天津十一选五 上海天天彩选4开奖情况 福彩20选5大星走势图