Presentation is loading. Please wait.

Presentation is loading. Please wait.

OUTLINE Android app Devolpment Flow App反組譯解說 實例 簽名詳解 DalvikByteCode

Similar presentations


Presentation on theme: "OUTLINE Android app Devolpment Flow App反組譯解說 實例 簽名詳解 DalvikByteCode"— Presentation transcript:

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 破解概念 刪除重要的判斷式:


Download ppt "OUTLINE Android app Devolpment Flow App反組譯解說 實例 簽名詳解 DalvikByteCode"

Similar presentations


Ads by Google