文章目錄
安卓逆向思路:
總思路: app->dex->jar->java
1.對Android 應用程序的安裝包Apk 文件進行解壓縮,得到內部文件如圖;
2.使用dex2jar 工具將解壓後得到的classes.dex 文件逆向爲.jar 包;
3.使用xmprinter 工具將AndroidManifest.XML 配置文件解密,使其可讀;
4.使用 jd_gui這種 Java 反編譯工具將②中得到的 jar包逆向爲.java 代碼文件。
1、查殼
檢查程序是否有加固
2、未加固
2.1 工具
ApkTool + jadx 或者 ApkTool,dex2jar,JD-GUI
2.2方法
使用apktool:獲取素材資源,AndroidManifest.xml以及smali代碼
使用jadx:把「classes.dex」轉換爲**.java**代碼
3 、第一代加固
3.1 工具
安卓模擬器、文件管理器、開發者助手、XP框架、FDex2、ADB
3.2 方法
1、使用安卓模擬器充當已經root的手機
2、使用開發者助手查詢app加固類型、分析軟件佈局等
3、使用XP框架作爲hook工具
4、使用FDex2脫殼
5、使用ADB shell拉取文件
3.3 材料準備
安卓模擬器:mumu模擬器
https://mumu.163.com/
文件管理器:MT管理器
https://abc.binmt.cc/MT2.8.4.apk
XP框架:xposed installer
https://pan.baidu.com/s/185-auUKjO9ShlJm7pP6Nfw
FDex2:
https://pan.baidu.com/s/1SjAR8_A49ZZPkGG-OW1ofg
adb shell:
網上找教程下載安裝
3.4 實例
1、安裝mumu模擬器
2、將xposed installer、FDex2、MT管理器和需要破解的軟件安裝在安卓模擬器上,並設置root權限.
3、安裝、配置adb shell,使用adb devices檢測安裝是否成功,是否可以連接到模擬器上(adb使用手冊:https://blog.csdn.net/u010610691/article/details/77663770#%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95)
4、使用adb shell命令將需要破解的軟件copy到模擬器文件內
5、配置xposed環境
打開Xposed installer -> 左上角 -> 模塊 -> 勾選FDex2 -> 點擊FDex2 -> 點擊需要hook的軟件(圖一) -> 記錄包名、輸出目錄 -> 後臺回到主頁
6、查殼
打開開發者助手,勾選懸浮窗、root、輔助服務選項,然後後臺
打開需要脫殼的軟件,進入程序化,點擊開發者助手懸浮窗,查看加固
7、脫殼
打開需要破解的軟件,進入幾個頁面,進行一些簡單的交互,然後使用文件管理器進入dex輸出目錄,找到dex後綴文件(一般會輸出好幾個),對比脫殼後的dex文件與未脫殼的dex文件大小,相近的dex文件爲實際的脫殼文件.
將源文件classes.dex文件刪除,將脫殼後的文件重命名爲classes.dex並移動到源文件夾內.
編譯AndroidManifest.xml文件,打開後修改程序入口,將A替換爲B,並刪除C部分代碼.然後編譯,退出.
刪除加固相關文件
回退到apk文件目錄、簽名、打包.
7、加固檢測
重新安裝打包好的軟件,使用開發者助手查看.
補充知識:
一、Android
1.加密原則:
由於Android 系統支持的應用格式主要以apk 形式存在,應用的主要邏輯實現在apk中的classes.dex 文件中,因此,對classes.dex 文件的保護是保護整個apk 安全的關鍵所在。
2.安全機制
Android 是建立在Linux 內核之上,並採用Dalvik 虛擬機(Android5.0之後變更爲ART)作爲應用程序運行環境的操作系統。
系統架構層 | 安全機制 |
---|---|
Linux內核 | POSIXuser |
android本地庫及運行環境 | 內存管理單元 |
應用程序框架層 | 文件訪問控制 |
Dalvik虛擬機沙盒機制 | |
強類型安全語言 | |
移動設備安全 | |
應用程序權限控制 | |
簽名機制 | |
2.1內核級安全機制
由於Android是基於Linux內核的,所以也繼承了Linux內核的安全機制。在Android內核級主要的安全機制包括可一直操作系統接口用戶(POSIX USER)和文件訪問控制。這些機制的基本元素是用戶及其擁有的對象,用戶再進一步分配到用戶組。另外,內存控制機制也一定程度上保證了Android的運行安全。
2.2運行環境級安全機制
安卓程序運行在Dalvik虛擬機(Android5.0之後變更爲ART)上.並且每一個應用程序都運行在一個獨立的虛擬機上。但是不同於其他虛擬機,如JVM和.NET Runtime作爲安全邊界有着隔離代碼的作用,由於底層Android內核已經實現了沙箱機制,所以Dalvik虛擬機並不作爲隔離代碼的安全邊界。所有應用程序都能運行本地代碼,並且均使用相同的安全等級運行在沙盒中。所以在系統運行庫Android主要採取強制安全類型來加固Android的系統安全。
強制類型安全機制通過賦值變量時強制檢查聲明類型與值是否符合,從而保證變量不被錯誤地使用。
安卓使用java編譯器來做數據類型檢查,避免類型轉換錯誤或缺少邊界檢查而造成的緩衝區溢出攻擊.
2.3 應用程序框架級安全機制
使用數字簽名保證Android系統安全.
安卓應用程序會被打包成.apk,在程序安裝前會對文件做數字校驗,檢查這些文件是否被篡改.
Android簽名文件包含以下幾個要點:
1、Android系統只會安裝帶有有效數字簽名的應用程序,禁止安裝任何未簽名的應用程序。
2、Android應用程序是可以自簽名的,不需要權威機構的認證。
3、數字簽名是有時限的,但只有在安裝應用時Android系統纔會檢測數字簽名是否過期,一旦安裝成功,系統將不再關注數字簽名是否過期。
Android應用程序安全的核心在於權限控制。它用於限制應用程序的訪問系統的API和資源。應用程序必須在權限內運行,而不能訪問權限外的任何資源。
3.應用程序包分析
3.1. classess.dex(重要)
Java 源碼被編譯後生成的Dalvik 虛擬機字節碼文件,通過dx工具轉化爲Dalvik虛擬機識別的執行文件
3.2. lib
lib 下的子目錄 armeabi 存放的是 so 文件,應用若使用 JNI調用 C/C++動態庫,則需要將被調用的so 文件放到該目錄下。
3.3. AndroidManifest.xml(重要)
程序的全局配置文件。此文件在每個應用中都必須被定義和包含,它描述了應用的名稱、開放權限、引用的庫文件、版本號等重要信息。
3.4. resources.arsc
經過編譯的二進制資源文件,記錄資源文件和資源id的映射。
3.5. res
res 目錄是存放資源文件的,包括程序使用的佈局文件、圖片和字符串常量等。會在R文件中生成索引ID.
3.6. META-INF
META-INF 目錄下保存的則是應用中的簽名信息,簽名信息可以一定程度上驗證原始apk 的完整性。
3.7. assets
存放的原生(靜態)資源文件(比如so庫,HTML資源等原生資源),android不爲/assets下的文件生成ID。如果使用/assets下的文件,需要指定文件的路徑和文件名。
4.編譯流程
4.1 資源文件處理(AAPT)
assets會原封不動打包在APK中;
res中每一個資源會賦予資源ID,以常量形式定義在R.java中,生成一個resource.arsc文件(資源索引表)
4.2 aidl文件
將aidl後綴的文件轉換爲可用於進程通信的C/S端Java代碼。
4.3 Source Code
編譯生成.class文件。
4.4 代碼混淆
增加反編譯難度,命名縮短爲1-2個字母的名字,壓縮(移除無效類、屬性、方法等),優化bytecode移除沒用的結構。
4.5 轉換爲dex
把所有claas文件轉換爲classes.dex文件,class -> Dalvik字節碼,生成常量池,消除冗餘數據等。(方法數超65535會生成多個dex文件)
4.6 打包
把resources.arsc、classes.dex、其他的資源一塊打包生成未簽名apk。
4.7 簽名
對未簽名apk進行debug或release簽名。
4.8 對齊優化
使apk中所有資源文件距離文件起始偏移爲4字節的整數倍,從而在通過內存映射訪問apk文件時會更快
5.1 加固
第一代:動態加載
第二代:內存不落地加載
第三代:指令抽取
第四代:指令轉換
第五代:虛擬保護
5. 基於保護Classes.dex 不被逆向的安全加固技術
5.1 Classes.dex 工作原理
在Android 源碼中(不同版本的源碼,可能目錄不一樣),Dalvik 虛擬機的實現位於dalvik/目錄下,其中dalvik/vm 是虛擬機的實現部分,將會編譯成 libdvm.so;而 dalvik/libdex 將會編譯成 libdex.a靜態庫作爲 dex 工具;dalvik/dexdump 是.dex 文件的反編譯工具;虛擬機的可執行程序位於dalvik/dalvikvm 中,將會編譯成dalvikvm 可執行文件。
Android 平臺應用程序在運行時,首先由Dalvik 虛擬機加載解包後的Classes.dex 文件,然後dalvik 虛擬機會從中讀取指令和數據,進而運行該應用的程序邏輯。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cY1zrgT9-1579049149522)(反編譯心得.assets/image-20191211155919382.png)]
5.2加固方案
- Classes.dex殼:它是用於 Android 程序運行時被 Dalvik 虛擬機加載的 dex 文件,裏面不再包含Android 程序的功能代碼;
- AndroidManifest.XML:它將原AndroidManifest.XML 中的入口替換爲新入口;
- Encrypt_Classes.dex:它是原Classes.dex 經過白盒加密後的文件,包含了Android程序的主要功能代碼,也是重點保護對象;
- Encrypt_decryption.so:decryption.so 是用於解密 Encrypt_Classes.dex 的 so 文件,爲了確保解密方法不被泄露,將decryption.so 文件再加密一層爲Encrypt_decryption.so。
- Entry.so:程序啓動後的入口so 文件,用於調用Encrypt_decryption.so 來解密Encrypt_Classes.dex。
5.3實現流程
爲實現保護源程序Classes.dex 文件的安全性,用白盒算法對Classes.dex 文件進行加密,並自定義一個新的Classes.dex 文件。Dalvik 虛擬機在將應用加載到內存中時,首先加載 Classes.dex,Classes.dex將對原 Classes.dex 文件進行解密和完整性檢查,再將原Classes.dex 文件加載至內存並運行,最後將解密後的Classes.dex 文件從本地物理存儲空間中刪除,從而保證了Classes.dex 文件的安全加載,並且防止Classes.dex 文件被篡改。由於程序的運行邏輯仍然爲原Classes.dex 文件中的實現,所以保證了應用的功能不受影響。具體調用邏輯如下:
二、https與http
####1.什麼是 HTTPS
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
https:URL 表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。
現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面。
它最初由Netscape開發內置於其瀏覽器中,用於對數據進行加密和解密操作,並返回網絡上傳送的結果。
HTTPS使用端口443,而不是像HTTP那樣適用端口80來和TCP/IP 進行通信。SSL使用40位關鍵字作爲RC4流加密算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。
主要作用分爲兩種:
- 一種是建立一個信息安全通道,來保證數據傳輸的安全。
- 另一種就是確認網站的真實性,凡是使用https的網站,都可以通過點擊瀏覽器地址欄的鎖頭標誌來查看網站認證之後的真實信息。也可以通過CA 機構頒發的安全簽章來查詢。
2.HTTPS 和 HTTP 的區別
超文本傳輸協議HTTP協議被用於在Web瀏覽器和服務器之間傳遞信息。
- HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。
- 爲了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。
區別
HTTPS和HTTP的區別主要爲以下五點:
- https 用的 443 端口, http 用的 80 端口
- https協議需要到ca申請證書,一般免費證書很少,需要交費。
- http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
- http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
- http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
3.信任主機的問題
- 採用 https 的服務器必須從CA(Certificate Authority)申請一個用於證明服務器用途類型的證書。
- 該證書只有用於對應的服務器的時候,客戶端纔信任此主機。所以所有的銀行系統網站,關鍵部分應用都是https 的。
- 客戶通過信任該證書,從而信任了該主機。其實這樣做效率很低,但是銀行更側重安全。
- 這一點對局域網對內提供服務處的服務器沒有任何意義。局域網中的服務器,採用的證書不管是自己發佈的還是從公衆的地方發佈的,其客戶端都是自己人,所以該局域網中的客戶端也就肯定信任該服務器。
4.SSL協議提供的服務主要有哪些
- 認證用戶和服務器,確保數據發送到正確的客戶機和服務器。
- 加密數據以防止數據中途被竊取
- 維護數據的完整性,確保數據在傳輸過正中不被改變。
5.SSL 證書種類
CFCA,GlobalSign,VeriSign ,Geotrust ,Thawte
域名型 https 證書(DVSSL):信任等級一般,只需驗證網站的真實性便可頒發證書保護網站;
企業型 https 證書(OVSSL):信任等級強,須要驗證企業的身份,審覈嚴格,安全性更高;
增強型 https 證書(EVSSL):信任等級最高,一般用於銀行證券等金融機構,審覈嚴格,安全性最高,同時可以激活綠色網址欄。
ADB(安卓調試橋)
介紹
Android調試橋( adb )是一個開發工具,幫助安卓設備和個人計算機之間的通信。 這種通信大多是在USB電纜下進行,但是也支持Wi-Fi連接。 adb 還可被用來與電腦上運行的安卓模擬器交流通信。
使用
基本語法
adb [-d|-e|-s ]
參數 | 含義 |
---|---|
-d | 指定當前唯一通過 USB 連接的 Android 設備爲命令目標 |
-e | 指定當前唯一運行的模擬器爲命令目標 |
-s | 指定相應 serialNumber 號的設備/模擬器爲命令目標 |
啓動/停止
# 啓動
adb start-server
# 停止
adb kill-server
查看adb版本/安裝路徑
adb version
以root權限運行adbd
# 運行root
adb root
# 退出root
adb unroot
獲取設備信息
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-id0Zjjtz-1579049149528)(反編譯筆記.assets/image-20191230101005534.png)]
adb devices
# 狀態device -> 已連接
# 狀態offline -> 連接失敗
# 狀態no device -> 沒有設備/模擬器
> emulator-5554 # device中emulator-5554爲設備號,即serialNumber
複製電腦裏的文件到設備
adb -e(模擬器-e \ 實體機-d) push ~\Desktop\(電腦文件路徑) \data\user\0\111.apk(設備路徑)
複製設備裏的文件到電腦
adb -e(模擬器-e \ 實體機-d) pull \data\user\0\111.apk(設備路徑) ~\Desktop\(電腦文件路徑)
指定adb server網絡端口
# 默認5037端口
adb -P <port> start-server
無線連接(需要藉助 USB 線)
1、將 Android 設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi。
2、將設備與電腦通過 USB 線連接。
3、讓設備在 5555 端口監聽 TCP/IP 連接: adb tcpip 5555
4、斷開 USB 連接。
5、找到設備的 IP 地址。一般能在「設置」-「關於手機」-「狀態信息」-「IP地址」找到
6、通過 IP 地址連接設備。 adb connect <device-ip-address>
查看應用列表
語法
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
參數 | 顯示列表 |
---|---|
無 | 所有應用 |
-f | 顯示應用關聯的 apk 文件 |
-d | 只顯示 disabled 的應用 |
-e | 只顯示 enabled 的應用 |
-s | 只顯示系統應用 |
-3 | 只顯示第三方應用 |
-i | 顯示應用的 installer |
-u | 包含已卸載應用 |
包名包含 字符串 |
安裝 APK
語法
adb install [-lrtsdg] <path_to_apk>
參數 | 含義 |
---|---|
-l | 將應用安裝到保護目錄 /mnt/asec |
-r | 允許覆蓋安裝 |
-t | 允許安裝 AndroidManifest.xml 裏 application 指定 android:testOnly="true" 的應用 |
-s | 將應用安裝到 sdcard |
-d | 允許降級覆蓋安裝 |
-g | 授予所有運行時權限 |
卸載APK
語法
adb uninstall [-k] <packagename>
清除應用數據與緩存
語法
adb shell pm clear <packagename>
#####查看當前處於前臺的 Activity
語法
adb shell dumpsys activity activities | grep mFocusedActivity
查看正在運行的 Services
語法
adb shell dumpsys activity services [<packagename>]
參數不是必須的,指定
表示查看與某個包名相關的 Services,不指定表示查看所有 Services。`` 不一定要給出完整的包名,比如運行
adb shell dumpsys activity services org.mazhuang
,那麼包名org.mazhuang.demo1
、org.mazhuang.demo2
和org.mazhuang123
等相關的 Services 都會列出來。
模擬按鍵/輸入
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
例子:
adb shell input keyevent <keycode>
# 電源鍵
adb shell input keyevent 26
# HOME 鍵
adb shell input keyevent 3