Android逆向之Android逆向工具介紹
Android逆向之Android逆向工具介紹
Android逆向第一天介紹
Android APK文件結構 問題:Android APK的入口函數是什么? Android 系統歷史
SDK工具adb,monitor adb的使用 adb命令 monitor操作
Android逆向工具 ①命令行工具 1.AndroidManifest.xml清單文件解密工具 2.Dex文件反匯編、匯編工具 3.apk簽名工具 4.apk反編譯工具apktool 5.Dex2jar工具(轉換文件格式) 6.Java反編譯工具(將java文件反編譯為源碼) ②可視化工具 1.AndroidKiller工具(集成了反編譯、回編譯、安裝apk、查看源碼) 2.JEB反編譯工具 3.JadxGUI 4.GDA 反編譯工具
Android逆向分析方法
字符串分析法實例破解一個apk的流程 破解步驟 使用AndroidKiller用字符串分析法
Smali代碼HelloWorld
日志過濾法實例 使用Monitor過濾日志 使用AndroidKiller過濾日志
配置環境問題 Android逆向之Android逆向工具介紹 夜神模擬器adb連接
0.Android逆向第一天介紹
Android APK文件結構
SDK工具adb,monitor
逆向工具介紹
Android逆向分析方法
字符串分析法實例破解一個apk的流程
日志過濾分析法
配置環境問題
1.Android APK文件結構
android studio生成的apk在以下目錄
基本的APK是一個壓縮包,壓縮包中有
METAINF目錄 簽名信息,包括公司信息、文件的HASH值 Res目錄 資源信息,包括圖片、xml(布局文件、字符串、風格樣式等)
AndroidMainfest.xml 清單文件,包括APK包名、四大組件的一些申明定義、權限、程 序的入口
Classes.dex 可執行文件,包括java的類信息、方法信息、字段信息、虛擬機指令。 dex文件的生成流程是從java源碼>class文件>dex文件
Resources.arsc 資源序號文件,包括資源里的所有ID、名稱。資源ID對應文件是
R.class
android studo 3.2,所在的目錄
Lib目錄 動態庫,擴展名是.so ,包括C++代碼,有各種平台,比如x86,arm
Assets目錄 自定義資源,比如.txt,mp4,等等
問題:Android APK的入口函數是什么?
自己定義的MainActivity中onCreate 清單文件中application節點可以添加android:name屬性,指定繼承自application的 類,用於初始化整個app的全局信息。繼承自application的類有兩個重寫函數會執行, 是程序最早執行的函數。 ① attachBaseContext ② onCreate
所以一個app最早執行的函數是 application的類中的attachBaseContext函數
一般apk加固之后,都會自定義application類,並重寫其中的attachBaseContext函數 或onCreate函數,並且聲明為native類型的函數。 app運行的流程
Android 系統歷史
分為三個階段
① android2.3~4.0 卡頓
② android4.1~4.4 成長,飛躍 android虛擬機dalvik>art
③ android5.0~現在 整體不錯
逆向分析的環境
系統:android 4.4 (同時有dalvik和art) 手機: google nexus 5(二手 200左右)
2.SDK工具adb,monitor
adb的使用
需要在SDK文件中找到adb,
方法一:設置目錄到path環境變量中 F:\Android\Sdk\platform-tools
方法二:
1.新建一個環境變量,變量名:ANDROID_HOME,變量值:以你安裝目錄為准(我的為F:\Android\Sdk),確認里面有tools和add-ons等多個文件夾,點擊確認。
2.修改PATH環境變量:后面新增;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\build-tools\29.0.2(注意最前面的分號,分割)
然后cmd輸入adb測試。不需要重啟。能找到就是成功了。
adb命令
① 列舉設備 adb devices
② 將apk上傳到設備、下載文件到PC
adb push
adb pull
③ 安裝apk adb install r apk文件名 (可以覆蓋安裝) ④ 啟動apk adb shell am start n <包名/activity名稱>
以調試方式啟動apk adb shell am start D n <包名/activity名稱> (以調試方式啟動)
⑤ shell命令
使用 adb shell 進入 安卓命令行,可以在命令行使用Linux命令
ls,cd,su,ps,ps | grep com,kill,chmod
monitor操作
① 概況
androidstudio中打開
文件目錄中打開
主要窗口
② 設備列表
③ 文件夾操作
④ 日志
過濾日志
3.Android逆向工具
①命令行工具
1.AndroidManifest.xml清單文件解密工具
AXMLPrinter2.jar java jar AXMLPrinter2.jar <清單文件> java jar AXMLPrinter2.jar AndroidManifest.xml > out.xml APK15PBParser.jar(集成了AXMLPrinter2.jar,apktool.jar中xml解析部分代碼) java jar APK15PBParser.jar java jar APK15PBParser.jar HelloWorld1.apk
2.Dex文件反匯編、匯編工具
Dex文件是android java代碼編譯生成的二進制文件,包含了虛擬機指令(dalvik虛擬機)
Baksmali.jar(反匯編工具,將虛擬機指令反匯編成smali代碼) java jar baksmali.jar o <輸出目錄> java jar baksmali.jar classes.dex o out_dir 反匯編生成的目錄中,包括所有dex文件中的類代碼,每一個類就是一個smali文 件。 Java中有三種類,外部類、內部類、匿名類 外部類:MainActivity.java > MainActivity.smali 內部類:MainActivity類中MyOnClickListener類 MainActivity匿名內部類:類中對象1.smali smali.jar(匯編工具,將smali代碼匯編生成dex文件) java jar smali.jar <目錄> o 文件名 java jar smali.jar out_dir o out.dex 修改smali代碼,#號是注釋代碼 // # ifeqz v2, :cond_24
3.apk簽名工具
簽名工具,使用android系統源碼編譯時用到的一個工具 java jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
4.apk反編譯工具apktool
反編譯apk
java jar apktool.jar d java jar apktool.jar d HelloWorld.apk ①將清單文件以及其他xml文件解密 ②將資源序號文件(resources.arsc)與資源名稱做了一個對應關系表 生成在了/res/values/public.xml ③將dex文件反編譯成了smali代碼 回編譯 apk目錄 java jar apktool.jar b <反編譯的apk文件目錄> java jar apktool.jar b HelloWorld 生成的APK在 <反編譯的apk文件目錄>/dist目錄中
5.Dex2jar工具(轉換文件格式)
dex2jar>d2jdex2jar.bat dex2jar>d2jdex2jar.bat classes.dex dex2jar classes.dex > .\classesdex2jar.jar
6.Java反編譯工具(將java文件反編譯為源碼)
②可視化工具
1.AndroidKiller工具(集成了反編譯、回編譯、安裝apk、查看源碼)
第一次打開的時候需要配置一下jdk的路徑
AndroidKiller中集成了好幾個工具:
apktool, dex2jar工具集,adb,jdgui
apktool 所在目錄:AndroidKiller_v1.3.1\bin\apktool\apktool
在Androidkiller中設置新的apktool
adb工具 常用命令 打開shell:adb shell , adb s 設備名稱 shell 安裝apk: adb install 1.apk , adb install r 1.apk 列舉設備: adb devices
dex2jar工具集
將dex文件轉成jar文件,方便jdgui反編譯
jdgui工具 可以查看smali代碼對應的java源碼
此外還有一些好工具的輔助工具
編碼轉換
2.JEB反編譯工具
3.JadxGUI
4.GDA 反編譯工具
4.Android逆向分析方法
① 字符串分析法 ② 日志分析法
③ 動態調試smali, 動態調試so文件(c++生成的文件) ④ API下斷(調試so,對linux API下斷),棧回溯分析
5.字符串分析法實例破解一個apk的流程
破解步驟
拿到apk
使用反編譯工具進行反編譯
根據apk運行提示,查找字符串
查找字符串進行分析,找關鍵代碼修改
使用重打包工具進行重打包
使用簽名工具進行簽名
使用AndroidKiller用字符串分析法
但是需要注意的是,中文字符串在Android是以Unicode編碼方式顯示的,格式類似 \u4e0d\u597d\u610f\u601d。我們需要進行轉換,AndroidkKiller提供了這個功能
通過查找到對應代碼,然后在代碼附近可以發現顯示成功的字符串。在成功字符串上 面有關鍵跳轉,我們只需要將關鍵跳轉nop掉即可。其實在smali使用#號注釋掉即可。
在代碼的上方,應該就是正確密碼比對的地方,查看上下文發現v2寄存器,使用資源 ID中獲取的一個字符串。
在這個時候,一般在工程中搜索資源ID,從資源ID找到對應的資源名稱以及類型,然 后再根據類型和名稱找到對應資源的定義。
然后再去搜索對應資源名稱,找到字符串定義,因為已經知道類型是sting,直接可以查 看文件res/values/strings.xml。
之后,重新編譯,安裝測試。
6.Smali代碼HelloWorld
.class public LHelloWorld;
#Ye olde hello world application
#To assemble and run this on a phone or emulator:
#
#java ‐jar smali.jar ‐o classes.dex HelloWorld.smali
#zip HelloWorld.zip classes.dex
#adb push HelloWorld.zip /data/local
#adb shell dalvikvm ‐cp /data/local/HelloWorld.zip HelloWorld
#
#if you get out of memory type errors when running smali.jar, try
#java ‐Xmx512m ‐jar smali.jar HelloWorld.smali
#instead
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 2
sget‐object v0, Ljava/lang/System;‐>out:Ljava/io/PrintStream;
const‐string v1, "Hello World!"
invoke‐virtual {v0, v1}, Ljava/io/PrintStream;‐
>println(Ljava/lang/String;)V
return‐void
.end method
7.日志過濾法實例
使用Monitor過濾日志
①添加過濾項
②搜索過濾
使用AndroidKiller過濾日志
8.配置環境問題
復制androidkiller中的adb以及dll,到SDK目錄、夜神安裝目錄