天天看點

Android逆向基礎筆記—Dalvik位元組碼小記_const/4 v2, 0x1

這幾天認真研讀了一下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;