Smail Code 是 APKTool 把.dex byte code 轉換人類可讀的產物 主要是透過 baksmali 這個反組譯產生
基本編譯包成APK流程
java 會被javac 編譯成java Byte Code 並轉換成 DalVik ByteCode 並boundle 成 .dex 檔案並透過 AAPT tools (Android Assest Packaging Tools ) 將.dex file 與 那些Resource 檔 library 包成 APK 形式 讓Android OS 安裝
Smali 可以被 Dalvik Machine 或 ART 使用 對於攻擊者來說 是可以去修改smali code 來改變APP 的行為
像是修改條件式 來繞過驗證 或是刪除 Root 偵測的程式 等等
先重一個簡單的calculator classes 與定義簡單 add() function 開始
Source Code
package com.example.simpleapp;
public class calculate {
public static int add(int a, int b) {
return a + b;
}
}
Smali Code
.class public Lcom/example/simpleapp/MainActivity$calculator;
.super Ljava/lang/Object;
.source "MainActivity.java"
# direct methods
.method public constructor <init>()V
.locals 0
.line 3
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static add(II)I
.locals 0
add-int/2addr p0, p1
return p0
.end method
可以先看到 第1行 .class public Lcom/example/simpleapp/MainActivity$calculator;
這裡表示 有一個 calculator Classes 在com/example/simpleapp/MainActivity 下
.local 會告訴你這裡有幾個register
invoke-direct {p0}, Ljava/lang/Object;->()V 這裡很明顯就是 calculator 繼承 Object
也就是 calculator extends Object 而進行的初始化 (隱式繼承)
看到 add(II)I 這裡表示宣告2個interger 參數並回傳 1個Interger 參數 並且 add-int/2addr p0, p1 就是把p1 的值加到P0 上去 return p0 回傳 p0 的值 到這裡 Class 與 Method 就宣告完畢
接下來我們需要知道 Data type 在Smali 中的表示
V 就是method 沒有回傳值 (Void)
Z 表示 Boolean
C 表示 Chr 2 bytes Unicode 字元 (Chr)
B 標示 1 byte 整數 (Byte)
S 表示 2 bytes 整數 (Short)
I 表示 4 bytes 整數 (Interger)
J 表示 8 bytes 整數 (Long)
F 表示 4 bytes 浮點數 (Float)
D 表示 8 bytes 浮點數 (Double)
基本andorid 上register 是32 bit 4 個byte
如果要放 dobule 或是 long 的data 會需要2個Register
除了 Data Type 之外 還有Reference Type 來分辨Object 與 Array
L -> 表示這個是個物件
[ -> 表示著個是陣列
下半部會介紹 方法的調用與寄存器的運作