這幾天認真研讀了一下dalvik字節碼,因爲這個是重點,對以後的Android逆向分析很重要。
我是學過彙編的,但是感覺還是不是太懂。這玩意也太亂了吧。然後我有些看不懂,就百度一陣,也沒有結果。就自己研究了下下,把自己不懂的地方寫出來。不對的地方,大家請指出。
我主要是集中在賦值哪裏。我開始沒弄懂,後來才明白過來。
const/4 v1, 0x1 這裏大家應該知道 v1=1。但是真真正正想過爲什麼?也許很多人都知道,這裏是寫給不知道的。
首先4代表4字節,那麼就是4位的。所以呢 v1=0*4+1=1
const/16 v2, 0x10 這裏的話,16字節,那麼16位對吧。所以v2 = 1*16+0 = 16
const/16 v3, 0x28 16字節,16位。v3 = 2*16+8 = 40;
這裏就解釋完了。後面給點dalvik的實例吧。
.local 4 //本地4個寄存器,也就是下面的v0,v1,v2,v3
const/4 v2, 0x1 //4字節常量 v2=1
const/16 v1, 0x10 //16字節常量 v1=16
:local v1, "length":I //int length=v1
if-nez v1,:cond_1 //如果v1不等於0,這跳轉至cond_1
:cond_0 //cond_0標籤
:goto_0 //goto_0標籤
return v2 //返回v2的值
:cond_1 //開始執行cond_1標籤代碼
const/4 v0,0x0 //4字節常量 v0=0
:local v0, "i":I //int i=v0
:goto_1 //開始執行goto_1標籤代碼
if-lt v0, v1, :cond_2 //如果v0小於v1,則跳轉至cond_2
const/16 v3,0x28 //如果v0大於等於v1,則執行下面語句: 16字節常量v3=40
if-le v1,v3, :cond_0 //如果v1小於等於v3,則跳轉至cond_0,即返回v2的值
const/4 v2, 0x0 //如果v1大於v3,則4字節常量v2=0
goto:goto_0 //跳轉至goto_0,即返回v2的值
:cond_2 //cond_2標籤
xor-int/lit8 v1, v1, 0x3b //將第二個v1寄存器中的值與0x3b(59)進行異或運算,得到的值賦值給第一個v1寄存器中
add-int/lit8 v0, v0, 0x1 //將第二個v0寄存器中的值加上0x1(1),所得的值放入第一個v0寄存器中
goto:goto_1 //跳轉值goto_1標籤
翻譯成java代碼就是
int v2 = 1;
int v1 = 16;
if (v1 != 0){
for (int v0 = 0; v0 < v1;){
v1 = v1 ^ 59;
v0++;
}
if (v1 > 40){
v2 = 0;
}
}
return v2;