一、環境安裝
1.1、安裝Java環境
1.2、安裝SDK環境
1.3、安裝NDK環境
二、APK
2.1、文件結構
2.2、打包流程
2.3、安裝流程
應用安裝涉及目錄:
system/app ----->系統自帶的應用程序,獲得adb root權限才能刪除。
data/app ------->用戶程序安裝的目錄,安裝時把apk文件復制到此目錄。
data/data -------> 存放應用程序的數據
data/dalvik-cache ------>將apk中dex文件安裝到dalvik-cache目錄下(dex文件是dalvik虛擬機的可執行文件,其大小約為原始apk文件大小的四分之一) 。
安裝過程:
復制apk安裝包到data/app目錄下,解壓并掃描安裝包,把dex文件保存到dalvik-cache目錄,并data/data目錄下創建對應的應用數據目錄。
三、虛擬機
1、Java虛擬機--->Java字節碼 ---->基于棧架構。
2、dalvik虛擬機(jit機制)---->android5.0以下---->dalvik字節碼---->基于寄存器架構。
3、art虛擬機(aot機制)---->android5.0以上
注意:
.dex ---->dexopt--->.odex dalvik加載執行的odex文件。
.dex --->dex2oat --->.oat art加載執行的是oat文件。
四、Java逆向知識
4.1、dex文件反匯編工具
.java ---> .class ---->.dex ---->smail。
在這個過程中會使用三種工具
使用dx.jar工具將.class文件打包成.dex文件
使用baksmail.jar工具將.dex文件反編譯成.smail文件
使用smail.jar工具將.smail文件打包成.dex文件。
4.2、dalvik字節碼
數據類型對應:
dalvik Java
V ------------->void
Z ------------->boolean
B ------------->byte
C ------------->char
S ------------->short
I ------------->int
J ------------->long
F------------->float
D------------->double
L------------->java類類型
[------------->數組類型
字段:
Lorg/cocos2dx/lua/AppActivity;->handler:Landroid/os/Handler;
包名 類名 變量名 類型
方法:
Lpackage/name/ObjectName;->MethodName(III)Z
Lpackage/name/ObjectName:表示的是當前這個方法所在的類。
L是Java類類型,package/name/是包名,ObjectName是類名MethodName這部分表示的方法名
(III)Z:表示的是方法的簽名信息,由方法參數列表(III)和返回值(Z)構成。
(III)表示三個int型參數;Z表示返回值類型為boolean。
4.3、dalvik指令集
基礎字節碼:名稱后綴/字節碼后綴 目的寄存器 源寄存“-”這個符號在有的指令里面沒有的名稱后綴是wide,表示數據寬度為64位,字節碼后綴是from16,表示源寄存器為16位。
如move-wide/from16 vAA,VBBBB
move為基礎字節碼,即opcode、wide為名稱后綴,標識指令操作的數據寬度為64位、from16為字節碼后綴,標識源為一個16位的寄存器引用變量、vAA為目的寄存器,它始終在源的前面,取值范圍為v0~v255 vBBBB為源寄存器,取值范圍為v0~v65535。
dalvik指令集中大多數指令用到了寄存器作為目的的操作數或源操作數,其中A/B/C/D/E/F/G/H代表一個4位數值,AA/BB/CC...../GG代表一個8位的數值,A