Download presentation
Presentation is loading. Please wait.
1
OUTLINE Android app Devolpment Flow App反組譯解說 實例 簽名詳解 DalvikByteCode
破解概念
2
Android App Development Flow
3
Dalvik Dalvik是Google在Android手機上所提供的ByteCode虛擬器 擁有以下特點 1.體積小,佔用內存空間小
2.暫存器32bit 3.專有的dex執行文件格式,體積較小,執行速度較快 4.基於暫存器架構,擁有一套完整指令系統
4
Dalvik虛擬器 與 Java虛擬器 分別 1.java執行java byte code,Dalvik執行Dalvik byte code 2.Dalvik可執行文件體積較小(將多個class檔整合成一個dex檔) 3.java執行時需要頻繁的從stack上存取變數,Dalvik直接透過暫存器傳送
5
Java to dex
6
反組譯解說
7
反組譯後結構 最重要的部份: smali(所有ByteCode檔案) res (資源檔) dist(重新編譯後)
8
Android 反組譯工具 Apktool Dex2jar DJ-Decompiler+ JD-GUI
Eclipse(幫助你產生要注入的程式碼) Notepad++
9
Android 反編譯步驟 1.使用apktool將app轉成smali code(難看) 2.將app轉成zip檔,將其中classes.dex取出 3.使用dex2jar,將classes.dex轉成jar檔 4.使用JD-GUI將JAR檔打開讀Javacode(易讀) 5.在 smali code中作修改 6.使用apktool將改好的文件包成apk檔 7.將apk簽名即可成功執行
10
(注意事項) 1.Apktool d XXX.apk反組譯 2.不動任何Smali和內容再Compile回去 3.檢查App是否會當掉(正常執行) •會當掉:App開發商有做保護 •不會當掉:可以開始破解了
11
實例解說
12
使用google play搜尋Youbike
13
將網址貼上apk downloader下載apk
實例(Youbike) 將網址貼上apk downloader下載apk
14
打開cmd 進入apk目錄 輸入apktool d xxx.apk(apk名稱)
實例(Youbike) 打開cmd 進入apk目錄 輸入apktool d xxx.apk(apk名稱)
15
實例(Youbike) 得到smali code
16
實例(Youbike) 將apk轉成zip檔,取出classes.dex
17
將classes.dex放入dex2jar目錄下 輸入 d2j-dex2jar.bat classes.dex
實例(Youbike) 將classes.dex放入dex2jar目錄下 輸入 d2j-dex2jar.bat classes.dex
18
得到classes-dex2jar並使用jd-gui打開
實例(Youbike) 得到classes-dex2jar並使用jd-gui打開
19
輸入apktool.bat b xxx(目標文件夾)將修改好smali code轉回apk (出現在dist資料夾)
實例(Youbike) 輸入apktool.bat b xxx(目標文件夾)將修改好smali code轉回apk (出現在dist資料夾)
20
實例(Youbike) 利用keystore產生簽名證書
21
實例(Youbike) 利用jarsigner進行簽名
22
實例(Youbike) 得到簽名後文件
23
實例(Youbike) 成功執行App
24
簽名詳細解說
25
簽名疑問 問:什麼是簽名? 答:他就像現實世界中的簽名一樣,讓人知道此app是和你有關的 問:為何要簽名? 答:Android系統要求,如果一個app沒有經過簽名,是無法裝到系統上的 問:為何我開發的app沒簽名也可以用? 答:因為ADT(Android Developer Tool)自動幫你簽了
26
簽名工具 1.keytool:生成簽名證書 2.jarsigner:利用證書給apk文件簽名 3.zipalign:對簽名後的apk進行優化 (前兩者存在在jdk安裝路徑的bin目錄下,第三者位於android-sdk-windows\tools\)
27
指令解說 使用keytool工具生成數字證書 keytool -genkey -v -keystore xxx.keystore -alias xxx.keystore -keyalg RSA -validity 20000 1.Keytool是工具名稱,-genkey代表執行的是生成證書操作 –v為詳細訊息顯示 2. -keystore xxx.keystore代表證書生成名 –alias xxx.keystore為別名 3.-keyalg RSA代表採用RSA方式生成密鑰 4.-validity 20000代表有效日期為20000天
28
指令解說 使用jarsigner工具為Android應用程序簽名
jarsigner -verbose -keystore xxx.keystore -signedjar xxx_signed.apk xxx.apk xxx.keystore 1.Jarsigner是工具名稱 –verbose表示將簽名過程詳細過程輸出 2.-keystore xxx.keystore表示簽名證書位置,沒路徑表示在當前目錄 3. -signedjar xxx_signed.apk xxx.apk表示給xxx.apk簽名,簽名後名稱為xxx_signed.apk 4.最後面xxx.apk代表證書別名
29
DalvikByteCode
30
DalvikByteCode Base types I-int J-long(64bit,需要兩個暫存器) Z-Boolean D-double(64bit,需要兩個暫存器) F-float S-short C-char Classes:Lpackage/name V-void(return type) Arrays:[I:Int array ; [Ljava/lang/String:String array ; [[I:int[][]
31
DalvikByteCode Method:
Lpackage/name/ObjectName;->MethodName (Para-Type1Para-Type2Para-Type3...)Return-Type Method invocations: invoke-static –any method that is static invoke-virtual –any method that isn’t private, static, or final invoke-direct –any method that is private invoke-super –any superclassesvirtual method Invoke-interface –invoke an interface method move-result:取回return結果
32
DalvikByteCode Ex:foo ()V void foo()。 EX:foo (III)Z boolean foo(int, int, int)。 EX:foo(Z[I[ILjava/lang/String;J)Ljava/lang/String String foo (boolean, int[], int[], String, long)
33
DalvikByteCode Register inside Method:
.registers->Total number of register .locals ->Total minus method parameter registers(v0,v1,v1….) Register Naming Convention: 方法一開始需要指定register數量 以v0 v1 v2 … 來暫存資料(vn:local register) P1->First Parameter in method, p2 ->second param, p3 … p0 ->implicit “this”在非static函數中,p0代指“this”,而在static函數中p0才對應第一个參數(因為Java的static方法中沒有this方法) 注意:Long和Double因為是64位元,需要2個register
34
DalvikByteCode const/4 vx xxx,lit4:Puts the 4 bit constant into vx const/16 vx xxx,lit16:Puts the 16 bit constant into vx const vx xxx, lit32:Puts the integer constant into vx
35
DalvikByteCode goto target:Unconditional jump by short offset if-eq vx,vy,target:Jumps to target if vx==vy2. vx and vy are integer values. if-ne vx,vy,target:Jumps to target if vx!=vy2. vx and vy are integer values. …… More:
36
DalvikByteCode Method: // Java int addTwo(int i, int j) {
return i + j; } // DEX Bytecode .method addTwo(II)I .registers 4 .parameter "i" .parameter "j" .prologue .line 386 add-int v0, p1, p2 return v0 .end method
37
DalvikByteCode Method:
// Java int add12and13() { return addTwo(12, 13); } int addTwo(int x, int y) { return x + y; // DEX Bytecode .method add12and13()I .registers 3 .prologue .line 427 const/16 v0, 0xc const/16 v1, 0xd invoke-virtual {p0, v0, v1}, Lcom/java/test/Section;->addTwo(II)I move-result v0 return v0
38
DalvikByteCode Class:
39
DalvikByteCode Class: //Java // DEX Bytecode
class WMWActivity extends BaseActivity implements IBurstlyAdListener{ //... class MessageHandler { //... } class FinishActivityArgs{ } // DEX Bytecode 1] .class public Lcom/disney/WMW/WMWActivity; 2] .super Lcom/disney/common/BaseActivity; 3] .source "WMWActivity.java" 4] 5] # interfaces 6] .implements Lcom/burstly/lib/ui/IBurstlyAdListener; 7] 8] # annotations 9] .annotation system Ldalvik/annotation/MemberClasses; 10] value = { 11] Lcom/disney/WMW/WMWActivity$MessageHandler;, 12] Lcom/disney/WMW/WMWActivity$FinishActivityArgs; 13] } 14] .end annotation
40
DalvikByteCode 你不需要寫複雜的Smali code:
只要在Eclipse上寫Android程式碼,用呼叫的方式call method,確定他可以跑,把程式碼寫成方法(method),再用apktooldecompile自己的apk取得對應的smali 你要很熟悉ByteCode的基本型態才不會改錯,改錯了可能會造成無法Compile回去或App無法正常運作 如何Check自已有沒有改對?把你改過的apkdecompile為Java Source Code後就大致上知道
41
破解概念
42
通常App開發商會透過以下程式碼來確認Apk是否有被改過
破解概念 通常App開發商會透過以下程式碼來確認Apk是否有被改過 任何一個上架的App都必須要sign過(算是app的命根子) 因為我們無法拿到他們signature的keystore,我們只能用自己所產生的keystore來sign並發佈 以關鍵字「signature」搜尋smali目錄下的所有文字 搜尋結果過濾前幾行必須要有「0x40」(64的16進位) DalvikByteCode(16進位)->JavaCode(10進位)
43
破解概念 找到對應的Java Class,使用Decompiler還原回Java程式碼
確認是判斷signature的重要程式碼,嘗試讓if (xxx) 判斷失效 逐一搜尋直到清除乾淨 同樣的道理,付費的App也應該會有「if (isPurchased()) {}」的判斷式
44
破解概念 刪除重要的判斷式:
Similar presentations