想明白工具怎麼用,真的需要自己多加摸索,首先準備一個小的apk留着分析用,我這裡将我們用的那個發到雲盤供大家下載下傳使用
連結: https://pan.baidu.com/s/1KmyNXHRv-aiSAfnnPXBNRQ 提取碼: 2fns 一個40+k的apk
關于工具可能不同版本的使用方法稍微不同,看情況是否打包發上來
apktool 工具
Apktool是專為安卓軟體DIY愛好者們設計的一款apk編譯軟體,使用者們可以通過這款軟體實作對各種各樣安卓軟體的編譯、反編譯、簽名等操作。
一般是配合使用 但是比較麻煩......這裡也不多接收 用它主要就是直接解壓apk檔案,後續再說
apktool
作用:主要檢視res檔案下xml檔案、AndroidManifest.xml和圖檔。(注意:如果直接解壓.apk檔案,xml檔案打開全部是亂碼)
https://ibotpeaches.github.io/Apktool/
dex2jar
作用:将apk反編譯成Java源碼(classes.dex轉化成jar檔案)
jd-gui
作用:檢視APK中classes.dex轉化成出的jar檔案,即源碼檔案
jadx反編譯
優點是友善 缺點是不可以修改,一般反彙編完畢後需要手動記事本等的進行更改 然後在重新編譯
https://github.com/skylot/jadx
可以下這個版本:
java -jar jadx-gui-0.7.1.jar 運作
SignApk簽名
在安卓工具箱中,下載下傳SignApk.jar。用于簽名,這樣才能安裝apk,我們使用手機的時候也會經常注意到簽名,簽名用于防止惡意更改等。
signapk.jar是Android源碼包中的一個簽名工具。
代碼位于:Android源碼目錄下,signapk.jar 可以編譯build/tools/signapk/ 得到。
使用signapk.jar簽名時需要提供簽名檔案,我們可以使用安卓源碼中提供的testkey.pk8與testkey.x509.pem,他們位于Android源碼build/target/product/security目錄。
使用android自帶的簽名工具signapk.jar 以及源碼中的testkey.x509.pem,testkey.pk8 對apk進行重新簽名。
執行:java -jar signapk.jar testkey.x509.pem testkey.pk8 old.apk new.apk 執行後new.apk即為簽名後的檔案。
(注:執行指令時所有檔案這裡放在同一目錄下,如果不在同一目錄請修改路徑)。
含義:通過signapk.jar這個可執行jar包,以testkey.x509.pem這個公鑰檔案和testkey.pk8這個私鑰檔案對old.apk進行簽名,簽名後的檔案儲存為old.apk。
測試使用
需要注意的是 如果我們不把工具放在windows目錄下,那麼我們需要設定系統環境才可以随心所欲的用
計算機-屬性-進階屬性-系統變量-path 添加我們的工具目錄
目前目錄結構
apktool 使用
解包指令:
apktool d xxxxxx.apk ABC
這裡“d”表示要解碼。Xxxxx.apk是要解包的APK檔案。ABC是子目錄名。解包的檔案會放在這個子目錄内。
打包指令:
apktool b ABC yyyyy.apk
使用d filename指令解壓apk檔案到目前目錄
windows下暫時沒有顯示解壓過程,linux下是可以的,大概是這個樣子(示意)
得到檔案的解壓目錄
打包的方法請接着往下看
signapk使用
使用目标系統的platform密鑰來重新給apk檔案簽名。
1.首先在我的Android源碼目錄中的位置是"build argetproductsecurity",下面的platform.pk8和platform.x509.pem兩個檔案。
然後使用系統提供的簽名工具signapk.jar,使用步驟是将自己的apk還有上述三個檔案放入一個檔案夾如圖:
2、然後用壓縮軟體打開自己的apk檔案,删掉META-INF目錄下的CERT.SF和CERT.RSA兩個檔案。
指令使用方法 signapk pen檔案路徑 pk8檔案路徑 原始apk檔案 新的簽名之後的輸出路徑
jadx使用
選擇檔案進行反彙編
這是一個顯示的界面
輸入框 計算的按鈕
檢視源碼可知 隐藏看了一個按鈕
有兩個按鈕btn和一個輸入框,但是btn2使用了setVisibility(4) 被隐藏了
android view setVisibility():
有三個參數:Parameters:visibility One of VISIBLE, INVISIBLE, or GONE,想對應的三個常量值:0、4、8
我們需要更改這個變量 但是jadx是無法更改的 找到解壓的源碼更改就可以
更改為我們需要的0 然後儲存。我們更改完事源碼之後重新壓縮為apk打包 使用apk指令
.\apktool-cli-all.jar b 22 正常這樣就是可以的 輸出為22.apk 但是可能windows有問題 使用 -o參數才能輸出apk檔案
得到了新的apk檔案,這裡還需要簽名
将那些需要的檔案放在一起 然後簽名
.\signapk.jar .\testkey.x509.pem .\testkey.pk8 .\new.apk new-sign.apk
下面使用adb安裝apk檔案
adb install apk檔案路徑
JEB的安裝和使用方法前面已經說過了 不在贅述。
xposed hook 程序
Method分為兩種,dalvik虛拟機在處理的時候有差別,一種是directMethod,即Java世界裡面實作的方法,一種是nativeMethod,即在c/c++裡面實作的方法。
ClassObject裡面有兩個集合,分别存放了這個Class下定義的directMethods和nativeMethods。
Method中,有兩個非常重要的指針:
-
const u2* insns;
-
DalvikBridgeFunc nativeFunc;
對于directMethod,insns存放了該方法的位元組碼指針(還記得odex被mmap到記憶體中了麼,這個指針就是這段記憶體裡面指向code區域的開始處的指針)。
虛拟機在調用directMethod時,在建構好方法棧以後,pc指針指向了insns,于是可以從記憶體中取得位元組碼,然後解釋執行。
那麼大概的意思就是我們方法的調用是使用指針儲存的位置,而這些指針是存儲在記憶體中的
虛拟機在處理native方法時,走的是另外一套邏輯。
我們在使用native方法時,首先得使用System.loadLibrary對so進行加載,其最終是使用dlopen函數加載了指定的so檔案。
之後在我們調用nativeMehtod的時候,會根據方法描述符,通過特定的映射關系(是否主動進行了注冊會有不同)得到一個native層的函數名,再從之前dlopen獲得的句柄中使用dlsys去查找對應的函數,得到了函數指針後,将這個指針指派給 insns。在nativeFunc這個橋接函數中,将insns解析為函數指針,然後進行調用。
有前面這些知識後,再了解Xposed的hook原理就不難了。
前面已經知道,一個java方法在虛拟機裡面對應的Method為directMethod,其insns指向了位元組碼位置。
Xposed在對java方法進行hook時,先将虛拟機裡面這個方法的Method改為nativeMethod(其實就是一個辨別字段),然後将該方法的nativeFunc指向自己實作的一個native方法,這樣方法在調用時,就會調用到這個native方法,接管了控制權。
在這個native方法中,xposed直接調用了一個java方法,這個java方法裡面對原方法進行了調用,并在調用前後插入了鈎子,于是就hook住了這個方法。