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

Slides:



Advertisements
Similar presentations
主要内容 Java 的常用包 Java 的常用包 “ == ” 和 “ equals ” 的用法 “ == ” 和 “ equals ” 的用法 基本数据类型与引用类型 基本数据类型与引用类型 String 和 StringBuffer String 和 StringBuffer 对象的克隆( clone.
Advertisements

第四章 类、对象和接口.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
6. 6 Overloading methods and constructors 6
项目6 通用堆栈.
第1章 Java语言概述.
課程地圖 (104年入學-日間部) 校通識核心 專業課程 必修與選修 與管理模組 網路技術 App設計與應用模組 學院通識核心 學院專業核心
面向对象的程序设计(一).
第二章 基本程式設計.
编译原理上机实习
第二章 JAVA语言基础.
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
第5章 进一步讨论对象和类.
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
ANDROID與OSGI平台整合.
常用工具类.
安裝與設置 Android 發展環境 靜宜大學資工系 蔡奇偉副教授 ©.
第11章 Android GPS位置服务与地图编程
程式語言 -Visual Basic 變數、常數與資料型態.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
本單元介紹何謂變數,及說明變數的宣告方式。
JAVA程序设计 第5章 深入理解JAVA语言----补充.
程式設計實作.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
教務行政資訊系統 簡介 資訊科技中心 資訊系統組 徐振琦
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
Java程序设计 第2章 基本数据类型及操作.
認識 Java.
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
第一單元 建立java 程式.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
第二章Java基本程序设计.
第三课 标识符、关键字、数据类型.
Java變數 2014/6/24.
C#程序设计基础 $3 成员、变量和常量.
Location Based Services - LBS
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
Interfaces and Packages
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.

第二章 类型、对象、运算符和表达式.
Review 1~3.
實驗十六:匯出APK安裝檔與軟體上架.
歹徒透過通訊軟體詐騙手法1-冒用身份 若被害人通訊軟體「允許被加入好友」為開啟狀態 駭侵Google帳戶取得通訊錄
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
JAVA 程式設計與資料結構 第三章 物件的設計.
變數、資料型態、運算子.
第2章 Java语言基础.
第二章 Java基础语法 北京传智播客教育
Summary
歹徒透過通訊軟體詐騙手法1-冒用身份 若被害人通訊軟體「允許被加入好友」為開啟狀態 駭侵Google帳戶取得通訊錄
Presentation transcript:

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

Android App Development Flow

Dalvik Dalvik是Google在Android手機上所提供的ByteCode虛擬器 擁有以下特點 1.體積小,佔用內存空間小 2.暫存器32bit 3.專有的dex執行文件格式,體積較小,執行速度較快 4.基於暫存器架構,擁有一套完整指令系統

Dalvik虛擬器 與 Java虛擬器 分別 1.java執行java byte code,Dalvik執行Dalvik byte code 2.Dalvik可執行文件體積較小(將多個class檔整合成一個dex檔) 3.java執行時需要頻繁的從stack上存取變數,Dalvik直接透過暫存器傳送

Java to dex

反組譯解說

反組譯後結構 最重要的部份: smali(所有ByteCode檔案) res (資源檔) dist(重新編譯後)

Android 反組譯工具 Apktool Dex2jar DJ-Decompiler+ JD-GUI Eclipse(幫助你產生要注入的程式碼) Notepad++

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簽名即可成功執行

(注意事項) 1.Apktool d XXX.apk反組譯 2.不動任何Smali和內容再Compile回去 3.檢查App是否會當掉(正常執行) •會當掉:App開發商有做保護 •不會當掉:可以開始破解了

實例解說

使用google play搜尋Youbike

將網址貼上apk downloader下載apk 實例(Youbike) 將網址貼上apk downloader下載apk

打開cmd 進入apk目錄 輸入apktool d xxx.apk(apk名稱) 實例(Youbike) 打開cmd 進入apk目錄 輸入apktool d xxx.apk(apk名稱)

實例(Youbike) 得到smali code

實例(Youbike) 將apk轉成zip檔,取出classes.dex

將classes.dex放入dex2jar目錄下 輸入 d2j-dex2jar.bat classes.dex 實例(Youbike) 將classes.dex放入dex2jar目錄下 輸入 d2j-dex2jar.bat classes.dex

得到classes-dex2jar並使用jd-gui打開 實例(Youbike) 得到classes-dex2jar並使用jd-gui打開

輸入apktool.bat b xxx(目標文件夾)將修改好smali code轉回apk (出現在dist資料夾) 實例(Youbike) 輸入apktool.bat b xxx(目標文件夾)將修改好smali code轉回apk (出現在dist資料夾)

實例(Youbike) 利用keystore產生簽名證書

實例(Youbike) 利用jarsigner進行簽名

實例(Youbike) 得到簽名後文件

實例(Youbike) 成功執行App

簽名詳細解說

簽名疑問 問:什麼是簽名? 答:他就像現實世界中的簽名一樣,讓人知道此app是和你有關的 問:為何要簽名? 答:Android系統要求,如果一個app沒有經過簽名,是無法裝到系統上的 問:為何我開發的app沒簽名也可以用? 答:因為ADT(Android Developer Tool)自動幫你簽了

簽名工具 1.keytool:生成簽名證書 2.jarsigner:利用證書給apk文件簽名 3.zipalign:對簽名後的apk進行優化 (前兩者存在在jdk安裝路徑的bin目錄下,第三者位於android-sdk-windows\tools\)

指令解說 使用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天

指令解說 使用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代表證書別名

DalvikByteCode

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[][]

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結果

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)

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

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

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: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

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

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

DalvikByteCode Class:

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

DalvikByteCode 你不需要寫複雜的Smali code: 只要在Eclipse上寫Android程式碼,用呼叫的方式call method,確定他可以跑,把程式碼寫成方法(method),再用apktooldecompile自己的apk取得對應的smali 你要很熟悉ByteCode的基本型態才不會改錯,改錯了可能會造成無法Compile回去或App無法正常運作 如何Check自已有沒有改對?把你改過的apkdecompile為Java Source Code後就大致上知道

破解概念

通常App開發商會透過以下程式碼來確認Apk是否有被改過 破解概念 通常App開發商會透過以下程式碼來確認Apk是否有被改過 任何一個上架的App都必須要sign過(算是app的命根子) 因為我們無法拿到他們signature的keystore,我們只能用自己所產生的keystore來sign並發佈 以關鍵字「signature」搜尋smali目錄下的所有文字 搜尋結果過濾前幾行必須要有「0x40」(64的16進位) DalvikByteCode(16進位)->JavaCode(10進位)

破解概念 找到對應的Java Class,使用Decompiler還原回Java程式碼 確認是判斷signature的重要程式碼,嘗試讓if (xxx) 判斷失效 逐一搜尋直到清除乾淨 同樣的道理,付費的App也應該會有「if (isPurchased()) {}」的判斷式

破解概念 刪除重要的判斷式: