天天看點

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

想明白工具怎麼用,真的需要自己多加摸索,首先準備一個小的apk留着分析用,我這裡将我們用的那個發到雲盤供大家下載下傳使用

連結: https://pan.baidu.com/s/1KmyNXHRv-aiSAfnnPXBNRQ 提取碼: 2fns 一個40+k的apk

關于工具可能不同版本的使用方法稍微不同,看情況是否打包發上來

apktool 工具

Apktool是專為安卓軟體DIY愛好者們設計的一款apk編譯軟體,使用者們可以通過這款軟體實作對各種各樣安卓軟體的編譯、反編譯、簽名等操作。

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

一般是配合使用 但是比較麻煩......這裡也不多接收 用它主要就是直接解壓apk檔案,後續再說

apktool  

     作用:主要檢視res檔案下xml檔案、AndroidManifest.xml和圖檔。(注意:如果直接解壓.apk檔案,xml檔案打開全部是亂碼)

https://ibotpeaches.github.io/Apktool/

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

dex2jar

     作用:将apk反編譯成Java源碼(classes.dex轉化成jar檔案)

jd-gui

     作用:檢視APK中classes.dex轉化成出的jar檔案,即源碼檔案

jadx反編譯

優點是友善 缺點是不可以修改,一般反彙編完畢後需要手動記事本等的進行更改 然後在重新編譯

https://github.com/skylot/jadx 

可以下這個版本: 

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
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 signapk jadxjadx反編譯

apktool 使用

解包指令:

   apktool d xxxxxx.apk ABC

這裡“d”表示要解碼。Xxxxx.apk是要解包的APK檔案。ABC是子目錄名。解包的檔案會放在這個子目錄内。

打包指令:

   apktool b ABC yyyyy.apk

使用d filename指令解壓apk檔案到目前目錄

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

windows下暫時沒有顯示解壓過程,linux下是可以的,大概是這個樣子(示意)

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

得到檔案的解壓目錄

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

打包的方法請接着往下看

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檔案 新的簽名之後的輸出路徑

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

jadx使用

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

選擇檔案進行反彙編

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

這是一個顯示的界面

 輸入框 計算的按鈕

檢視源碼可知 隐藏看了一個按鈕

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

有兩個按鈕btn和一個輸入框,但是btn2使用了setVisibility(4) 被隐藏了

android view setVisibility():

有三個參數:Parameters:visibility One of VISIBLE, INVISIBLE, or GONE,想對應的三個常量值:0、4、8

我們需要更改這個變量 但是jadx是無法更改的 找到解壓的源碼更改就可以

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

更改為我們需要的0 然後儲存。我們更改完事源碼之後重新壓縮為apk打包 使用apk指令

 .\apktool-cli-all.jar b 22 正常這樣就是可以的 輸出為22.apk 但是可能windows有問題 使用 -o參數才能輸出apk檔案

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

得到了新的apk檔案,這裡還需要簽名

将那些需要的檔案放在一起 然後簽名

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

 .\signapk.jar .\testkey.x509.pem .\testkey.pk8 .\new.apk new-sign.apk

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

下面使用adb安裝apk檔案

adb install apk檔案路徑

JEB的安裝和使用方法前面已經說過了 不在贅述。

xposed hook 程序

移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯
移動安全 第二天上午 安卓工具介紹 apktool signapk jadxjadx反編譯

Method分為兩種,dalvik虛拟機在處理的時候有差別,一種是directMethod,即Java世界裡面實作的方法,一種是nativeMethod,即在c/c++裡面實作的方法。

ClassObject裡面有兩個集合,分别存放了這個Class下定義的directMethods和nativeMethods。

Method中,有兩個非常重要的指針:

  1. const u2* insns;

  2. 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住了這個方法。

繼續閱讀