移動安全 第二天上午 安卓工具介紹 apktool signapk jadx

想明白工具怎麼用,真的需要自己多加摸索,首先準備一個小的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中,有兩個非常重要的指針:

 

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

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章