1. 程式人生 > >幾種Dalvik Hook方案研究

幾種Dalvik Hook方案研究

Dalvik Hook的基本原理

如上一篇文章所述,每個java方法在虛擬機器內部都對應一個Method結構體(可以將JNI的jmethodID強轉為指向此Method結構體首地址的指標得到),Dalvik Hook通常通過修改Method結構體內容實現.常見的兩種hook思路:

  • 將被hook方法Method結構體的accessFlags置native標誌位,並將nativeFunc指向自定義的函式.可以將多個被hook的方法都轉向統一的自定義函式,在此函式中進行方法的分發處理.特點是比較靈活,實現起來有一定難度.
  • 宣告一個與被hook方法完全相同的新方法,將新方法的Method結構體覆蓋到被hook的Method結構體上. 特點是相對簡單,但是不夠靈活.

幾種常見的Dalvik Hook框架實現細節

這裡分析三個常見的Dalvik Hook框架:AndFix,DDI和Xposed(均在github開源,連結見附錄).其實現細節如下:

這裡寫圖片描述

其中–表示未修改,ACC_NATIVE,ACC_PUBLIC定義於/dalvik/libdex/DexFile.h, DALVIK_JNI_NO_ARG_INFO定義於/dalvik/vm/JniInternal.h.
值得注意的是DDI框架將registersSize和insSize全部修改為1,是因為其程式碼只hook了部分類的toString函式,並沒有通用性.另外將jniArgInfo修改為DALVIK_JNI_NO_ARG_INFO在部分CPU架構上會出現問題(x86強制要求jniArgInfo為有效值,否則呼叫方法時直接崩潰).

幾種常見的Dalvik Hook框架比較

這裡寫圖片描述
其實結合以上兩篇文章實現一個通用的不依賴android原始碼的Dalvik Hook框架不是難事:)

參考資料

(文章參考的是以下幾個專案2016年12月10日左右的版本)

相關推薦

Dalvik Hook方案研究

Dalvik Hook的基本原理 如上一篇文章所述,每個java方法在虛擬機器內部都對應一個Method結構體(可以將JNI的jmethodID強轉為指向此Method結構體首地址的指標得到),Dalvik Hook通常通過修改Method結構體內容實現.常見

實戰體驗MySQL Cluster方案

1.背景MySQL的cluster方案有很多官方和第三方的選擇,選擇多就是一種煩惱,因此,我們考慮MySQL資料庫滿足下三點需求,考察市面上可行的解決方案:高可用性:主伺服器故障後可自動切換到後備伺服器可伸縮性:可方便通過指令碼增加DB伺服器負載均衡:支援手動把某公司的資料請

什麼是跨域以及簡單解決方案

要明白什麼是跨域之前,首先要明白什麼是同源策略?同源策略就是用來限制從一個源載入的文件或指令碼與來自另一個源的資源進行互動。那怎樣判斷是否是同源呢?如果協議,埠(如果指定了)和主機對於兩個頁面是相同的,則兩個頁面具有相同的源,也就是同源。也就是說,要同時滿足以下3個條件,才能

[python]json.loads 錯誤 解決方案

1、 json.loads Python錯誤: 'utf8' codec can't decode byte ... 由於需求,要用python讀取網頁返回json,並取得其中的資料但是卻遇到以上編碼的問題。 終於找到了解決方案: 我們只需要對字串進行unico

vue中使用echarts圖表自適應的基本解決方案

1.使用window.onresize let myChart = echarts.init(document.getElementById(dom)) window.onresize = function () { myChat.resize() } 優點:可以根據視窗

rsync的優化應用方案

  rsync是用來做檔案同步的一個很好的工具,傳統的rsync就是使兩個目錄的檔案保持一致,但隨著檔案數量增多,rsync會造成同步緩慢,系統負載比較高,直至系統宕機。   為了解決檔案增多導致rsync變慢的問題,方案是很多的。   1、使源目錄儲存較少檔案  

Kubernetes-5-2:Harbor倉庫的高可用方案與搭建

高可用Harbor搭建  思路及介紹 Harbor官方有推出主從架構和雙主架構來實現Harbor的高可用及資料備份。   一、主從架構:  說白了,就是往一臺Harbor倉庫中push映象,然後再通過這臺Harbor分散下發至所有的從Harbor,類似下圖: 這個方法保證了資

502的解決方案

限制 文件中 tps 運行 pro https pac time 文件 1.FastCGI進程是否已經啟動2.FastCGI worker進程數是否不夠運行 netstat -anpo | grep “php-cgi” | wc -l 判斷是否接近FastCGI進程,接近配

清除float浮動造成影響的解決方案

cor 解決 元素 height blog con ext style oat 1. “清除浮動” ??準確的描述應該是“清除浮動造成的影響” 學習浮動推薦的視頻教程《CSS深入理解之float浮動》 2.如何清除浮動造成

類成員函數不能作為普通函數地址傳遞給普通函數指針,解決方案

設置 函數指針 glut idle llb .sh c函數 open 百度 代碼如下 #include <iostream> using namespace std; class A { public: int i; public: void

Java常見的內存溢出及解決方案

-xmx 系列 lba pan fff 特征 聚類算法 聲明 space 1.JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space JVM在啟動的時候會自動設置JVM Heap的值, 可以利用JVM提

web端文字轉語音的方案

網站 文字轉語音 rate str source req 實現 mes contex 最近在開發一個微信排隊取號的的系統,其中對於服務員端(管理端) 需要有呼叫功能,即點按鈕 就播出"xxx號顧客請就座"的聲音。 經過在網上一番搜索研究,web端實現指定文字的語音播放 方案

springMVC中處理靜態資源的方案

image handle source 資源 ima -m web.xml 配置文件 resource 處理靜態資源方案一:在web.xml文件中配置如下: <!-- &lt;!&ndash;解決靜態資源方案&ndash;&gt; &

分布式唯一ID的生成方案

連續 優缺點 感覺 分布式系 htm 不依賴 未來 工作量 == 前言 在互聯網的業務系統中,涉及到各種各樣的ID,如在支付系統中就會有支付ID、退款ID等。那一般生成ID都有哪些解決方案呢?特別是在復雜的分布式系統業務場景中,我們應該采用哪種適合自己的解決方案是十分重要的

實現在線預覽PDF的解決方案

動態 api for ive pdf span www 控制器 動態顯示 原文:實現在線預覽PDF的幾種解決方案因客戶需要實現PDF的預覽處理,在網上找了一些PDF在線預覽的解決方案,有的用PDFJS的在線預覽方式,有的使用PDFObject的嵌入式顯示,有的通過轉換JPG

高通方案的Android設備開機模式的進入與退出

內容 熱啟動 boot 操作 com 刷機 安裝 tor min 高通方案的Android設備主要有以下幾種開機模式,Android、EDL、Fastboot、Recovery和FFBM,其進入及退出的方式如下表。 開機模式 屏幕表現 冷啟

權限管理的方案-寫備忘

jwt 信息 -s jsb base min czc 客戶端 ade 1.JSON WEB Token(JWT):     一種基於JSON的、用於在網絡上聲明某種主張的令牌(token)。JWT通常由三部分組成: 頭信息(header), 消息體(payload)和簽名(

深入研究Spring-IoC :容器建立的方式

1.前言 本文為對tiny-spring的學習解讀,程式碼參考自tiny-spring。一個手寫的Spring簡易版框架。 前面已經提到了Spring IOC容器的建立大致分為3個步驟。但是這個三個步驟是有一個演進的過程的,Spring容器建立方式前後有6種,從最基本的例項化建立

最近在研究多線程,淺談JAVA中多線程的實現方式

進行 數據 使用 導致 效率問題 多線程 方法 sta img 多線程的實現方式:   個人認為,要說多線程的實現方式,萬變不離其宗,最基本的就是兩種1.繼承Thread類;2.實現runnable接口,本質上來說就是用來啟動線程執行任務的過程,具體來說的話,通過這

JVM之記憶體溢位的情況以及可以採取的解決方案

開發中遇到過以下三種記憶體溢位的狀況: 一、 java.lang.OutOfMemoryError: Java heap space 二、 java.lang.OutOfMemoryError: PermGen space 三、 java.lang.OutO