我正在玩一個smali and baksmali在我寫的一個小型Hello World Android應用程序上。我的源代碼是:瞭解反彙編Dalvik代碼?
package com.hello;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
,然後將其分解到:
.class public Lcom/hello/Main;
.super Landroid/app/Activity;
.source "Main.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 6
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
.parameter "savedInstanceState"
.prologue
.line 10
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 11
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/hello/Main;->setContentView(I)V
.line 12
return-void
.end method
我明白,這是某種中間表示的,但我不知道它是什麼。據我所知,必須有一些關於如何理解這種表示的規範,但無法弄清楚如何搜索它。因此給定一個apk文件,有人可以用通俗的話來解釋Dalvik opcode specification是如何用於表示的嗎?我現在的理解是這樣的:
- 給定一個APK,我可以在一個二進制XML格式 提取 AndroidManifest.xml中,並使用一個工具,如 axml2xml.pl得到一個「文本」 版本清單的那是不是 完成或我可以使用 apktool獲得更具可讀性的 表單。但我仍然不確定他們使用的 規範將 轉換成文本的二進制XML。
- 的 反編譯器莫名其妙利用 的Dalvil碼規範 讀取DEX文件和 轉換成上述表示。
上述兩個步驟中的任何信息(或許有一些簡單的例子)都會幫助我更好地理解概念。
更新1(貼從克里斯的答覆後):
所以基本上,我會做以下以在Dalvik字節碼到:
- 採取的APK並提取它來獲得classes.dex文件。
然後反彙編器讀取classes.dex文件並確定apk中存在的所有類。你能向我提供一些關於如何完成的信息嗎?它是否以十六進制模式解析文件並查找Dalvik規範,然後進行適當的解析?或者是其他事情發生?舉例來說,當我用classes.dex hexdump都可以,它給了我這樣的事情:
64 65 78 0A 30 33 ...
難道這些現在被用來操作碼查找?
- 假設工具是能夠進入的字節碼轉換爲單獨的類分離,則它繼續掃描從classes.dex文件中的十六進制代碼,並使用Davlik規範輸出來自表中的適當操作碼的名字?
其實,總之,我很想知道所有這些「魔法」是如何完成的。例如,如果我要學習編寫這個工具,我應該遵循什麼樣的高層路線圖?
這看起來像一個更完整的頁面。謝謝! IDAPro似乎很棒,但商業化:(看起來只有舊版本免費提供) – Legend 2011-01-27 18:59:31
netmite.com上的任何內容都不是「官方」的,官方版本位於Android源代碼樹中,例如http://android.git。 kernel.org/?p=platform/dalvik.git;a=tree;f=docs;h=7045c2e00b823918a8387187ca171d4c68936080;hb=HEAD。(OTOH,netmite副本比git存儲庫中的更容易閱讀,因爲CSS頁面) – fadden 2011-01-29 01:23:59