想明白工具怎麼用,真的需要自己多加摸索,首先準備一個小的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住了這個方法。