前言
本系列文章主體來自我對《Android軟體安全與逆向分析》作者:豐生強(非魚)一書的讀書筆記.
在Android安全方面,我确定我是一個新手-一個從沒有編譯過Apk檔案,并且沒有學習過Java的人,是以騷年,你又擔憂什麼呢.
OK開始.
自學的過程:
- 分析化解搭建,分析Android軟體的方法.
- Dalvik虛拟機彙編-這是學習基礎.
- Android系統中的可執行檔案-基石.
- 常用工具&反彙編代碼特征.
- ARM彙編基礎.
- 原生Android程式特征及分析方法.
- 動态調試技術.
- 常見Android軟體保護與破解.
- 防.
- 不同環節安全隐患,安全程式設計.
- 實戰分析.
環境搭建:
工欲善其事,必先利其器.
- JDK - 開發必須
- Android SDK
- Android NDK動态庫
- CDT,ADT插件
熟悉AVD虛拟調試.
以上環境搭建成功與否測試:
- java -version
-
emulator -version
adb version
列出連接配接到PC的Android裝置:
adb devices
編寫第一個樣例.
破解
破解方法:
- APK檔案->APKTool反編譯->Smali反彙編代碼(從中可以了解程式的運作機制進而修改)->APKTool編譯+簽名->APK檔案
- APK->IDA
- dex2jar和jd-gui配合,進行Java源碼級分析.
舉例:
apktool d x.apk outdir 反編譯到outdir檔案夾裡
其中生成的:
- Smali目錄下- 所有反彙編代碼
- res - 所有資源
破解思路:
錯誤提示字元串:
可能的情況:
- 寫死
- 引用自”res\values\Strings.xml”,該檔案中字元串的索引值在public.xml中.搜尋對應的id在smali檔案中.
檔案簽名使用 signapk.jar,使用指令:
其中%0替換成待簽名的東東.
這三個檔案我已打包.在這裡:
Android簽名三檔案.
如何安裝一個apk快速到Android中?
adb install x.apk
Dalvik-必會的位元組碼
Dalvik虛拟機
Dalvik Virtual Machine 是谷歌設計專門在Android平台運作Android程式的虛拟機.
專用可執行檔案格式為:DEX.
每個Android程序對應一個Dalvik虛拟機的執行個體.
Java虛拟機與Dalvik虛拟機的異同:
Java位元組碼 class檔案中 java 基于棧架構
Dalvik位元組碼 DEX(Dalvik Executable) DEX(java通過dx工具轉換而來) 基于寄存器架構
如何由class檔案生成dex檔案?
dx –dex –output=x.dex x.class
反編譯指令
-
java -jar baksmali.jar -o baksmaliout x.dex
生成x.Smali
-
javap -c -classpath x
生成位元組碼
-
dexdump.exe -d x.dex
生成dalvik位元組碼
-
java -jar ddx.jar -d ddxout x.dex
生成x.ddx
Java虛拟機
Java虛拟機指令集是零位址形式的指令集-在指令中看不到目的操作數和源操作數.它們都是隐含的.
這些隐含的參數在結構體求值棧在求值棧中進行傳遞.
Java:每個線程,1個PC計數器和一個Java(求值)棧.
其中PC計數器隻對目前方法有效.
Java棧
Java棧由棧幀組成:
- 局部變量棧 ->參數(儲存在n個slot中,從左到右)&局部變量
- 操作數棧 ->中間結果,調用别的方法的參數
Java虛拟機最多支援0xff條指令.(PC寄存器大小導緻的限制.)
Android使用Dalvik虛拟機來代替Java虛拟機.
系統啟動到Dalvik虛拟機
Android系統加載核心->init程序(裝置初始化工作)->Zygote->初始化Dalvik虛拟機.
Android Root原理?
分為臨時root和永久root.
root是通過不同版本的Android系統本地提權漏洞來工作的.
你可以使用 X-ray for Android應用來檢驗你的系統是否存在這些漏洞.
Dalvik位元組碼
- 指令格式.
-
反彙編工具.
-BakSmali-還支援使用Smali工具打包反彙編代碼重新生成dex檔案.
-Dedexer
- Dalvik寄存器
- 寄存器命名法-v命名法,p命名法
-
Dalvik位元組碼的類型,方法與字段表示方法
-BakSmali反彙編後,方法: .method .end method,字段: .field
Dalvik位元組碼的類型與Java位元組碼是對應的.
Dalvik**類型**分為:基本類型和引用類型.引用類型分為:1.對象.2.數組[
類型描述符:
V | Z | B | S | C |
---|---|---|---|---|
void | boolean | byte | short | char |
I | J | F | D | L | [ |
---|---|---|---|---|---|
int | long | float | double | Java類(類型) |
-
Dalvik指令集
參見原書P44.
後語
咱們下篇見!