1. 程式人生 > >Smali 檔案分析 詞法分析(一)

Smali 檔案分析 詞法分析(一)

在對反編譯以後的apk檔案進行分析時 ,會無可避免地涉及到其中的Smali檔案分析。對於一個合格的IDE,很有必要為使用者提供適合的資料,以減少使用者的工作量。所以,ART中的SmaliParse模組便是對Smali檔案進行處理的地方。
首先,給定一個簡單的Smali檔案,內容如下

.class public Lcom/F8LEFT;
.super Landroid/app/Application;
.source "StubApplication.java"
.field private static context:Landroid/content/Context;
.method static
init()V .registers 1 return-void .end method

這10行不到的程式碼組成了一個類,我們可以手動地轉換為相應的Java程式碼

package com;
class F8LEFT extends Application {
    private static Context context;
    void init() {
        return;
    }
}

那麼問題來了,我們是怎麼知道上面兩個是等價的呢?說不定其實這兩個表達的壓根就完全不一樣呢~~
舉個不太恰當的例子

下雨天留客天留我不留

這個要怎麼解讀呢??
可以理解為
“下雨天留客,天留我不留”
也可以理解為
“下雨天,留客天,留我不?留!”
同樣的句子,按照不同的翻譯,連意思都不一樣了
所以對於smali程式碼

.class public Lcom/F8LEFT;

我們知道他能夠定義一個類,是因為我們可以按照smali語法的規則,去分析其內容。
可以對於程式來說,這只是一竄無任何意義的字串。他可能是 “.cl” “ass”也可能是”.c” “la” “ss”
因此,我們要做的第一步就是對其按照一定的規律進行分割,並組成有意義的字元。
對於這句,應該劃分為這個樣子
“.class” “public” “Lcom/F8LEFT;”
可以看到,這3個字串已經是最小的分割,並且不能再進行分割了。
如果再強行分割,那麼被分割的單詞將會失去其語義。比如public一詞代表java中的public flag。如果分割為pu 和 blic, 那麼這兩個單詞就完全沒有意義。
像這樣,被劃分為最小的分割的單片語,我們稱為Token
於是,對於開頭給出的smali程式碼,我們可以最終劃分為以下Token

.class public Lcom/F8LEFT;
.super Landroid/app/Application;
.source "StubApplication.java"
.field private static context:Landroid/content/Context;
.method static init()V
    .registers 1
    return-void
.end method

“.class” “public” “Lcom/F8LEFT;”
“.super” “Landroid/app/Application;”
“.source” “”StubApplication.java””
“.field” “private” “static” “context” “:” “Landroid/context/Context”;
“.method” “static” “init” “(” “)” “V”
“.registers” “1”
“return-void”
“.end method”
像這樣,對文字按照預定義的規律進行劃分為有效的最小的字串的做法,我們稱為詞法分析。
這也是對程式碼進行靜態分析的第一步。