1. 程式人生 > >2017年10月30日360最新虛擬殼脫殼後完全修復

2017年10月30日360最新虛擬殼脫殼後完全修復

在csdn也發一份吧,留作備份

.說明

網上關於360的脫殼文章一大堆一大堆的,但是早在2016年秋季,360就已經虛擬化oncreate函式的指令到so層去運行了,卻沒有關於如何完全修復的文章,於是就有了本文,僅供於學習交流啥,希望為加固技術的發展貢獻力量,歡迎轉載,為了防止被和諧建議儲存~

.概述

怎麼過反除錯dump得到沒修復的oncreate部分,我就不囉嗦了,我只說被360抽取的oncreate怎麼修復的,適用於20171030日,最新的360加固助手1.5.3.0版本

三.修復詳細過程

下面我說一下如果修復oncreate的指令,拿我的附件說明

第一步:得到最新360加固的指令對映表

(注意

360的每個版本的指令對映表都是一樣的)

1. 得到加密的指令

附件manualProduceSmali資料夾前面已經說過,其內包含絕大多數指令,將其用360加固,我們得到AllDalvikOpcode_test6_jiagu_sign.apk,然後過360的反除錯直到執行到360的第二個so見我的附件second.so,偏移地址0x35CA6,在這裡下斷點

得到360抽取後的加密指令,然後把這個加密指令進行異或運算得到被360加密後的指令流,

2. 找到指令分支表

看到second.so的偏移0x35CCC處,將其內容複製到

360calc_switch/360calc_switch/360calc_switch.cpp數組裡面

因為AllDalvikOpcode_test6_jiagu_sign.apk是用我們已知的dalvik指令進行加密的,用360calc_switch這個工程可以計算出,真正的dalvik指令對應於second.so裡面的偏移

,然後就得到了指令對映表,見附件360decodeopcode\python\20170919_1.5.1.5And_0925_1.5.3.0\360opcodemaptable.config 我已經為大家準備最新的360加固的對映表了,如下

第一項是opcode,第二項是指令長度,第三項是在second.so中的偏移,第四項是相對於switch分支表的偏移,第五項是指令

//一、空操作指令

1

0x00,0x02,0x360c8,0x3fc,"nop"

//二、資料操作指令13

0x01,0x02,0x360ce,0x402,"move"

0x02,0x04,0x360e6,0x41a,"move/from16"

0x03,0x06,0x36102,0x436,"move/16"

0x04,0x02,0x36126,0x45a,"move-wide"

0x05,0x04,0x36146,0x47a,"move-wide/from16"

0x06,0x06,0x3616a,0x49e,"move-wide/16"

0x07,0x02,0x36196,0x4ca,"move-object"

0x08,0x04,0x361aa,0x4de,"move-object/from16"

0x09,0x06,0x361c4,0x4f8,"move-object/16"

0x0a,0x02,0x361e8,0x51c,"move-result"

0x0b,0x02,0x36200,0x534,"move-result-wide"

0x0c,0x02,0x3621e,0x552,"move-result-object"

0x0d,0x00,0x0,0x0,"move-exception"

//三、返回指令4

0x0E,0x02,0x38b36,0x2e6a,"return-void"

0x0F,0x02,0x0,0x0,"return vAA"

0x10,0x02,0x0,0x0,"return-wide"

0x11,0x02,0x0,0x0,"return-object"

….

第二步:得到被抽取的指令

好了已經得到指令對映表了,現在你可以隨便找一個apk360加固了,然後呢過反除錯一直執行到360的第2so檔案,然後在偏移地址0x35CA6下斷點,得到被加密的抽取指令360jiami_decode,然後配置檔案360decodeopcode\python\decodeopcode.py

switch_table_addr=0x35CCC //switch分支表的起始地址

decode_key=0xD0 //異或的key

然後執行decodeopcode.py就可以得到所有的被抽取的指令了

第三步:手動將被抽取的指令,填回到dex裡面去

注意dex檔案的DexMethodDexCode 這兩個結構體即可

Struct DexMethod{

U4 methodIdx; //361沒有處理

U4 accessFlags; //訪問標誌,被360改成了84 02,也就是0x104本來是04

U4 codeOff; //指向DexCode結構的偏移

}

//這個結構體360沒有改動他

struct DexCode {

u2  registersSize;           

u2  insSize;        

    u2  outsSize;                

    u2  triesSize;               

u4  debugInfoOff;      

u4  insnsSize;          指令集個數以2位元組為單位,實際為0x4

    u2  insns[1];            指令集,被360加密了的

 };

.結尾

更多內容見附件:~~~描述能力有點差,湊合著看吧

最後:祝你好運~有興趣的完全可以把得到指令對映表和指令解密和修復寫成py,做個自動脫殼器!我就懶得寫了,我要去玩遊戲了,

五. 得到指令對映表的關鍵東西

包含絕大多數dalvik指令的oncreate函式,附件裡面有,我這裡也貼一下吧

# virtual methods

.method protected onCreate(Landroid/os/Bundle;)V

#注意累計指令機器碼位元組數是1160

#累計dalvik指令編碼是0x00-0xff256,我累計實現209條指令,其中9條指令未實現,26條指令是dalvik沒有使用的,12條指令只存在於odex檔案中

    .locals 14

    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .prologue

    #一、空操作指令1條 手工植入====================================================

    nop #opcode=0x00

    #四、資料定義指令 10條 ,手工植入,有一條不會寫====================================================

const/4 v0,0x7 #opcode=0x12 #存入int 8v0

const/16 v1,0x5 #opcode=0x13 #存入int 3v1

const v2,0x3   #opcode=0x14 #存入int 3v2

const/high16 v3,0x41200000     #opcode=0x15 #存入float 10.0fv3

const-wide/16 v3,0x03e8 #opcode=0x16

const-wide/32 v3,0x00bc614e #opcode=0x17 #存入long 12345678v3,v4

const-wide v3,0x002bdc545d6b4b87L #opcode=0x18 #存入long 12345678901234567v3,v4

const-wide/high16 v3,0x4024000000000000L #opcode=0x19 #存入long 10.0常量到v3,v4

const-string v5, "snow_test" #opcode=0x1A

const-class         v6, Landroid/content/Context;   #opcode=0x1C

    #二、資料操作指令13,植入====================================================

move v6, v0 #opcode=0x01 v0移動到v6

move/from16 v6, v0 #opcode=0x02 v0移動到v6

move/16 v6, v0 #opcode=0x03 v0移動到v6

move-wide v7, v3 #opcode=0x04 v3,v4移動到v7,v8是移動long/double

move-wide/from16 v7, v3 #opcode=0x05 v3,v4移動到v7,v8是移動long/double

move-wide/16 v7, v3 #opcode=0x06 v3,v4移動到v7,v8是移動long/double

    move-object     v9, p0 #opcode=0x07p0的物件引用移動到v9

move-object/from16 v9, p0 #opcode=0x08p0的物件引用移動到v9

move-object/16 v9, p0 #opcode=0x09p0的物件引用移動到v9

    #下面去增加,方法呼叫指令後面增加

    invoke-direct {p0}, Lcom/snow/alldalvikopcode/MainActivity;->moveresultfunc()I

move-result v6 #opcode=0x0a,移動上一個方法呼叫的返回值到

    invoke-direct {p0}, Lcom/snow/alldalvikopcode/MainActivity;->moveresultwidefunc()D

move-result-wide v7 #opcode=0x0b,移動上一個方法呼叫的返回值到

    invoke-direct {p0}, Lcom/snow/alldalvikopcode/MainActivity;->moveresultobjectfunc()Landroid/content/Context;

move-result-object  v9 #opcode=0x0c,移動上一個方法呼叫的返回值到

    #move-exception     v7               #opcode=0xD 蛋疼1,注意這不是try catch生成的,不知道怎麼實現

    #.鎖指令2條,植入===================================================================

monitor-enter          p0 #opcode=0x1d

monitor-exit           p0 #opcode=0x1e

    #.例項操作指令3條,植入=============================================================

    check-cast             p1, Landroid/os/Bundle; #opcode=0x1f

instance-of            v0, p1, Landroid/os/Bundle; #opcode=0x20

    new-instance           v10, Ljava/lang/StringBuilder; #opcode=0x22 新建字串變數

    #.陣列操作指令18,植入=============================================================

const/4                v2, 0x4         #用來作為陣列大小

    const/4                v1, 0x2         #用來做索引

    #int陣列

new-array              v0, v2, [I #opcode=0x23,新建v2大小陣列int [],引用丟v0裡面

array-length           v3, v0 #opcode=0x21,獲取陣列長度,長度丟v1裡面

fill-array-data        v0, :array_0         #opcode=0x26 初始化v0陣列

    aget                v3,v0,v1 #opcode=0x44,int陣列v0,用v1做索引得到的值丟v2

    aput                v3,v0,v1 #opcode=0x4B,v2丟到int陣列v0,用v1做索引裡面

    #long陣列

    new-array               v0, v2, [J #建立long陣列

    fill-array-data         v0, :array_1

    aget-wide               v3,v0,v1 #opcode=0x45,獲取值存入v2,v3裡面,用v1做索引

    aput-wide               v3,v0,v1 #opcode=0x4C,v2 v3的值存入,v1作為索引裡面    

    #byte陣列

    new-array              v0, v2, [B

    fill-array-data        v0, :array_2

    aget-byte              v3,v0,v1             #opcode=0x48

    aput-byte              v3,v0,v1             #opcode=0x4F

    #char陣列

    new-array               v0, v2, [C

    fill-array-data         v0, :array_3

    aget-char               v3,v0,v1            #opcode=0x49

    aput-char               v3,v0,v1            #opcode=0x50

    #short陣列

    new-array               v0, v2, [S

    fill-array-data         v0, :array_4

    aget-short              v3,v0,v1            #opcode=0x4A

    aput-short              v3,v0,v1            #opcode=0x51

    const/4                 v1, 0x0         #用來做索引

    const/4                 v2, 0x1         #用來做陣列大小

    #物件陣列

    new-array               v0, v2, [Ljava/lang/String;          #建立String物件

    const-string            v3, "s"

    aput-object             v3,v0,v1       #opcode=0x4D

    aget-object             v4,v0,v1       #opcode=0x46

    #boolean陣列

    new-array              v0, v2, [Z

    const/4                v3, 0x1

    aput-boolean           v3, v0, v1        #opcode=0x4E

    aget-boolean           v3, v0, v1         #opcode=0x47

    const/4                v0,0x3  #陣列大小是3

    const/4                v2,0x1

    const/4                v3,0x2

    const/4                v4,0x3

filled-new-array{v2,v3,v4},[I     #opcode=0x24    

filled-new-array/range{v2 .. v4},[I #opcode=0x25

    #.異常指令1,植入=============================================================

    #throw vAA opcode=0x27  蛋疼2,注意這不是try catch生成的,不知道怎麼實現

    #.跳轉指令 17,植入=============================================================

    #第一類跳轉

const/4 v1, 0x4

goto :gotogoto_0 #opcode=0x28

:gotogoto_0

goto/16 :gotogoto_1 #opcode=0x29

:gotogoto_1

goto/32 :gotogoto_2 #opcode=0x2A

:gotogoto_2

#第二類跳轉

const/4 v0, 0x1

packed-switch v0, :pswitch_data_0 #opcode=0x2B,switch形式1

goto :gotogoto_3

:pswitch_0

const/4 v1, 0x1

goto :gotogoto_3

:pswitch_1

const/4 v1, 0x2

goto :gotogoto_3

:gotogoto_3

const/4 v0, 0x1

sparse-switch v0, :sswitch_data_0 #opcode=0x2C,switch形式2

goto :gotogoto_6

:sswitch_0

const/4 v1, 0x1

goto :gotogoto_6

:sswitch_1

const/4 v1, 0x2

goto :gotogoto_6

:gotogoto_6

#第三類跳轉

const/4 v0, 0x4

    const/4 v1, 0x5

    if-eq       v0,v1,:cond_0      #opcode=0x32  v0==v1

    :cond_0

    if-ne       v0,v1,:cond_1      #opcode=0x33  v0!=v1

    :cond_1

    if-lt       v0,v1,:cond_2      #opcode=0x34  v0<v1

    :cond_2

    if-ge       v0,v1,:cond_3      #opcode=0x35  v0>=v1

    :cond_3   

    if-gt       v0,v1,:cond_4      #opcode=0x36  v0>v1

    :cond_4

    if-le       v0,v1,:cond_5      #opcode=0x37  v0<=v1

    :cond_5  

    if-eqz       v0,:cond_7         #opcode=0x38  v0==0

    :cond_7

    if-nez       v0,:cond_8         #opcode=0x39  v0!=0

    :cond_8

    if-ltz       v0,:cond_9         #opcode=0x3A  v0<0

    :cond_9

    if-gez       v0,:cond_10      #opcode=0x3b  v0>=0

    :cond_10   

    if-gtz       v0,:cond_11      #opcode=0x3c  v0>0

    :cond_11

    if-lez       v0,:cond_12      #opcode=0x3d  v0<=0

    :cond_12  

    #.比較指令 5 ,植入=============================================================

    const/high16 v1, 0x41300000                  # 11.0f  float

    const/high16 v2, 0x41300000                  # 11.0f  float

    const-wide/high16 v3, 0x4026000000000000L    # 11.0   double,會存入v3v4

    const-wide/high16 v5, 0x4026000000000000L    # 11.0   double,會存入v5v6

    const-wide/16 v7, 0xb                        # 11      long,會存入v7v8

    const-wide/16 v9, 0xb                        # 11      long,會存入v9v10

    cmpl-float          v0,v1,v2                    #opcode=0x2D    比較v1v2存入v0

    cmpg-float          v0,v1,v2                    #opcode=0x2E    比較v1v2存入v0

    cmpl-double         v0,v3,v5                    #opcode=0x2F

    cmpg-double         v0,v3,v5                    #opcode=0x30

    cmp-long            v0,v7,v9                    #opcode=0x31

    #十一.欄位操作指令,34條指令,植入=============================================================

    iget v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->intfield:I                              #opcode=0x52

    iput v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->intfield:I                              #opcode=0x59

    iget-wide v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->doublefield:D                      #opcode=0x53

    iput-wide v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->doublefield:D                      #opcode=0x5A

    iget-object v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->objectfield:Ljava/lang/String;   #opcode=0x54

    iput-object v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->objectfield:Ljava/lang/String;   #opcode=0x5B

    iget-boolean v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->booleanfield:Z                  #opcode=0x55

    iput-boolean v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->booleanfield:Z                  #opcode=0x5C

    iget-byte v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->bytefield:B                        #opcode=0x56

    iput-byte v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->bytefield:B                        #opcode=0x5D

    iget-char v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->charfield:C                        #opcode=0x57

    iput-char v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->charfield:C                        #opcode=0x5E

    iget-short v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->shortfield:S                      #opcode=0x58

    iput-short v0, p0, Lcom/snow/alldalvikopcode/MainActivity;->shortfield:S                      #opcode=0x5F

    sget v0, Lcom/snow/alldalvikopcode/MainActivity;->sintfield:I                                 #opcode=0x60

    sput v0, Lcom/snow/alldalvikopcode/MainActivity;->sintfield:I                                 #opcode=0x67

    sget-wide v0, Lcom/snow/alldalvikopcode/MainActivity;->sdoublefield:D                         #opcode=0x61

    sput-wide v0, Lcom/snow/alldalvikopcode/MainActivity;->sdoublefield:D                         #opcode=0x68

    sget-object v0, Lcom/snow/alldalvikopcode/MainActivity;->sobjectfield:Ljava/lang/String;      #opcode=0x62

    sput-object v0, Lcom/snow/alldalvikopcode/MainActivity;->sobjectfield:Ljava/lang/String;      #opcode=0x69

    sget-boolean v0, Lcom/snow/alldalvikopcode/MainActivity;->sbooleanfield:Z                     #opcode=0x63

    sput-boolean v0, Lcom/snow/alldalvikopcode/MainActivity;->sbooleanfield:Z                     #opcode=0x6A

    sget-byte v0, Lcom/snow/alldalvikopcode/MainActivity;->sbytefield:B                           #opcode=0x64

    sput-byte v0, Lcom/snow/alldalvikopcode/MainActivity;->sbytefield:B                           #opcode=0x6B

    sget-char v0, Lcom/snow/alldalvikopcode/MainActivity;->scharfield:C                           #opcode=0x65

    sput-char v0, Lcom/snow/alldalvikopcode/MainActivity;->scharfield:C                           #opcode=0x6C

    sget-short v0, Lcom/snow/alldalvikopcode/MainActivity;->sshortfield:S                         #opcode=0x66

    sput-short v0, Lcom/snow/alldalvikopcode/MainActivity;->sshortfield:S                         #opcode=0x6D

    #十二.方法呼叫指令,15條指令,其中odex5條,有效的只有10條,2條無法寫=========================================================

    const/4 v1, 0x1

    const/4 v2, 0x2

    const/4 v3, 0x3

    const/4 v4, 0x4

    const/16 v5, 0x37

    invoke-virtual {p0, v1}, Lcom/snow/alldalvikopcode/MainActivity;->virtualfunc(I)I        #invoke-virtual,opcode=6E

    #invoke-super,opcode=6F  見編譯自帶生成的

    invoke-direct {p0, v1}, Lcom/snow/alldalvikopcode/MainActivity;->directfunc(I)I          #invoke-direct,opcode=70

    invoke-static {v1}, Lcom/snow/alldalvikopcode/MainActivity;->staticfunc(I)I              #invoke-static,opcode=71

    const-string v0, "SNOW"

    const/4 v7, 0x0

    invoke-virtual {p0, v0, v7}, Lcom/snow/alldalvikopcode/MainActivity;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;

    move-result-object v6

    const-string v0, "test"

    const-string v7, ""

    invoke-interface {v6, v0, v7}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;   #invoke-interface,opcode=72

    move-object v0, p0

    invoke-virtual/range {v0 .. v5}, Lcom/snow/alldalvikopcode/MainActivity;->virtualrangefunc(IIIII)I      #invoke-virtual/range,opcode=74

    #蛋疼3 invoke-super/range,opcode=75 ,無法寫不能再oncreate裡面呼叫其父類Activity含有多個引數的方法

    move-object v0, p0

    invoke-direct/range {v0 .. v5}, Lcom/snow/alldalvikopcode/MainActivity;->directrangefunc(IIIII)I        #invoke-direct/range,opcode=76

const/4 v6, 0x2

    invoke-static/range {v1 .. v6}, Lcom/snow/alldalvikopcode/MainActivity;->staticrangefunc(IIIIII)I        #invoke-static/range,opcode=77

    #蛋疼4,invoke-interface-range,opcode=78,無法寫,可以自定義介面,但是MainActivity就必須implements介面了

    #十三.資料轉換指令 21=================================================================================

    #inta=v0

    #longa=v1,v2

    #floata=v3

    #doublea=v5,v6

    #intb=v7

    #longb=v8,v9

    #floatb=v10

    #doubleb=v11,v12

const/4 v0, 0x5

const-wide/16 v1, 0x6

const/high16 v3, 0x40e00000    # 7.0f

const-wide/high16 v5, 0x4020000000000000L    # 8.0

    neg-int v7, v0     #neg-int vx, vy        opcode=7B

    not-int v7, v0     #not-int vx, vy        opcode=7C

    neg-long v8, v5     #neg-long vx, vy       opcode=7D

    not-long v8, v5     #not-long vx, vy       opcode=7E

    neg-float v10, v3 #neg-float vx, vy      opcode=7F

    neg-double v11, v5 #neg-double vx, vy     opcode=80

int-to-long v8, v0     #int-to-long vx, vy      opcode=81

    int-to-float v10, v0 #int-to-float vx, vy         opcode=82  

    int-to-double v11, v0 #int-to-double vx, vy        opcode=83

    long-to-int v7, v1     #long-to-int vx, vy          opcode=84

    long-to-float v9, v1 #long-to-float vx, vy        opcode=85

    long-to-double v11,v1 #long-to-double vx, vy       opcode=86

    float-to-int v7, v3 #float-to-int vx, vy         opcode=87

    float-to-long v8, v3 #float-to-long vx, vy        opcode=88

    float-to-double v11, v3 #float-to-double vx, vy      opcode=89

    double-to-int v7, v5 #double-to-int vx, vy        opcode=8A

    double-to-long v8, v5 #double-to-long vx, vy       opcode=8B

    double-to-float v9, v5 #double-to-float vx, vy      opcode=8C

    int-to-byte v1, v0 #int-to-byte vx, vy          opcode=8D

    int-to-char v1, v0 #int-to-char vx, vy          opcode=8E

    int-to-short v1, v0 #int-to-short vx, vy         opcode=8F

    #十四.資料運算指令 83=================================================================================   

   const/4 v2, 0x5

    const/4 v4, 0x5

    add-int v0, v2, v4 #opcode=0x90 add-int v0, v2, v4 計算v2 + v4並將結果存入v0

    sub-int v0, v2, v4 #opcode=0x91 sub-int v0, v2, v4 計算v2 - v4並將結果存入v0

    mul-int v0, v2, v4 #opcode=0x92 mul-int v0, v2, v4 計算v2 * v4並將結果存入v0

    div-int v0, v2, v4 #opcode=0x93 div-int v0, v2, v4 計算v2 / v4並將結果存入v0

    rem-int v0, v2, v4 #opcode=0x94 rem-int v0, v2, v4 計算v2 % v4並將結果存入v0

    and-int v0, v2, v4 #opcode=0x95 and-int v0, v2, v4 計算v2 v4並將結果存入v0

    or-int  v0, v2, v4 #opcode=0x96 or-int v0, v2, v4 計算v2 v4並將結果存入v0

    xor-int v0, v2, v4 #opcode=0x97 xor-int v0, v2, v4 計算v2 異或 v4並將結果存入v0

    shl-int v0, v2, v4 #opcode=0x98 shl-int v0, v2, v4 左移v2v4指定移動的位置,結果存入v0

    shr-int v0, v2, v4 #opcode=0x99 shr-int v0, v2, v4 右移v2v4指定移動的位置,結果存入v0

    ushr-int v0, v2, v4 #opcode=0x9A ushr-int v0, v2, v4 無符號右移v2v4指定移動的位置,結果存入v0

    const-wide/16 v2, 0x6

    const-wide/16 v4, 0x6

    add-long v0, v2, v4 #opcode=0x9B add-long v0, v2, v4 計算v2,v2+1 + v4,v4+1並將結果存入v0,v0+11

    sub-long v0, v2, v4 #opcode=0x9C sub-long v0, v2, v4 計算v2,v2+1 - v4,v4+1並將結果存入v0,v0+11

    mul-long v0, v2, v4 #opcode=0x9D mul-long v0, v2, v4 計算v2,v2+1 * v4,v4+1並將結果存入v0,v0+11

    div-long v0, v2, v4 #opcode=0x9E div-long v0, v2, v4 計算v2,v2+1 / v4,v4+1並將結果存入v0,v0+11

    rem-long v0, v2, v4 #opcode=0x9F rem-long v0, v2, v4 計算v2,v2+1 % v4,v4+1並將結果存入v0,v0+11

    and-long v0, v2, v4 #opcode=0xA0 and-long v0, v2, v4 計算v2,v2+1 v4,v4+1並將結果存入v0,v0+11

    or-long v0, v2, v4 #opcode=0xA1 or-long v0, v2, v4 計算v2,v2+1 v4,v4+1並將結果存入v0,v0+11

    xor-long v0, v2, v4 #opcode=0xA2 xor-long v0, v2, v4 計算v2,v2+1 異或 v4,v4+1並將結果存入v0,v0+11

    const/4      v4, 0x5   #這個一定要不然下面會崩潰

    shl-long v0, v2, v4 #opcode=0xA3 shl-long v0, v2, v4 左移v2,v2+1v4指定移動的位置,結果存入v0,v0+11

    shr-long v0, v2, v4 #opcode=0xA4 shr-long v0, v2, v4 右移v2,v2+1v4指定移動的位置,結果存入v0,v0+11

    ushr-long v0, v2, v4 #opcode=0xA5 ushr-long v0, v2, v4 無符號右移v2,v2+1v4指定移動的位置,結果存入v0,v0+11。  

    const/high16 v2, 0x40e00000    # 7.0f

    const/high16 v4, 0x40e00000    # 7.0f

    add-float v0, v2, v4 #opcode=0xA6 add-float v0, v2, v4 計算v2 + v4並將結果存入v0

    sub-float v0, v2, v4 #opcode=0xA7 sub-float v0, v2, v4 計算v2 - v4並將結果存入v0

    mul-float v0, v2, v4 #opcode=0xA8 mul-float v0, v2, v4 計算v2 * v4並將結果存入v0

    div-float v0, v2, v4 #opcode=0xA9 div-float v0, v2, v4 計算v2 / v4並將結果存入v0

    rem-float v0, v2, v4 #opcode=0xAA rem-float v0, v2, v4 計算v2 % v4並將結果存入v0

    const-wide/high16 v2, 0x4020000000000000L    # 8.0

    const-wide/high16 v4, 0x4020000000000000L    # 8.0

    add-double v0, v2, v4 #opcode=0xAB add-double v0, v2, v4 計算v2,v2+1 + v4,v4+1並將結果存入v0,v0+11

    sub-double v0, v2, v4 #opcode=0xAC sub-double v0, v2, v4 計算v2,v2+1 - v4,v4+1並將結果存入v0,v0+11

mul-double v0, v2, v4 #opcode=0xAD #後來才知道現在補上

    div-double v0, v2, v4 #opcode=0xAE div-double v0, v2, v4 計算v2,v2+1 / v4,v4+1並將結果存入v0,v0+11

    rem-double v0, v2, v4 #opcode=0xAF rem-double v0, v2, v4 計算v2,v2+1 % v4,v4+1並將結果存入v0,v0+11

#---------------------------------------------------------  

    const/4 v0, 0x5

    const/4 v2, 0x5

    add-int/2addr v0, v2 #opcode=0xB0 add-int/2addr v0, v2 計算v0 + v2並將結果存入v0

    sub-int/2addr v0, v2 #opcode=0xB1 sub-int/2addr v0, v2 計算v0 - v2並將結果存入v0

    mul-int/2addr v0, v2 #opcode=0xB2 mul-int/2addr v0, v2 計算v0 * v2並將結果存入v0

    div-int/2addr v0, v2 #opcode=0xB3 div-int/2addr v0, v2 計算v0 / v2並將結果存入v0

    rem-int/2addr v0, v2 #opcode=0xB4 rem-int/2addr v0, v2 計算v0 % v2並將結果存入v0

    and-int/2addr v0, v2 #opcode=0xB5 and-int/2addr v0, v2 計算v0 v2並將結果存入v0

    or-int/2addr v0, v2 #opcode=0xB6 or-int/2addr v0, v2 計算v0 v2並將結果存入v0

    xor-int/2addr v0, v2 #opcode=0xB7 xor-int/2addr v0, v2 計算v0 異或 v2並將結果存入v0

    shl-int/2addr v0, v2 #opcode=0xB8 shl-int/2addr v0, v2 左移v0v2指定移動的位置,並將結果存入v0

    shr-int/2addr v0, v2 #opcode=0xB9 shr-int/2addr v0, v2 右移v0v2指定移動的位置,並將結果存入v0

    ushr-int/2addr v0, v2 #opcode=0xBA ushr-int/2addr v0, v2 無符號右移v0v2指定移動的位置,並將結果存入v0。    

    const-wide/16 v0, 0x6

    const-wide/16 v2, 0x6

    add-long/2addr v0, v2 #opcode=0xBB add-long/2addr v0, v2 計算v0,v0+1 + v2,v2+1並將結果存入v0,v0+11

    sub-long/2addr v0, v2 #opcode=0xBC sub-long/2addr v0, v2 計算v0,v0+1 - v2,v2+1並將結果存入v0,v0+11

    mul-long/2addr v0, v2 #opcode=0xBD mul-long/2addr v0, v2 計算v0,v0+1 * v2,v2+1並將結果存入v0,v0+11

    div-long/2addr v0, v2 #opcode=0xBE div-long/2addr v0, v2 計算v0,v0+1 / v2,v2+1並將結果存入v0,v0+11

    rem-long/2addr v0, v2 #opcode=0xBF rem-long/2addr v0, v2 計算v0,v0+1 % v2,v2+1並將結果存入v0,v0+11

    and-long/2addr v0, v2 #opcode=0xC0 and-long/2addr v0, v2 計算v0,v0+1 v2,v2+1並將結果存入v0,v0+11

    or-long/2addr  v0, v2 #opcode=0xC1 or-long/2addr v0, v2 計算v0,v0+1 v2,v2+1並將結果存入v0,v0+11

    xor-long/2addr v0, v2 #opcode=0xC2 xor-long/2addr v0, v2 計算v0,v0+1 異或 v2,v2+1並將結果存入v0,v0+11

    const/4 v2, 0x5

    shl-long/2addr v0, v2 #opcode=0xC3 shl-long/2addr v0, v2 左移v0,v0+1v2指定移動的位置,並將結果存入v0,v0+1

    shr-long/2addr v0, v2 #opcode=0xC4 shr-long/2addr v0, v2 右移v0,v0+1v2指定移動的位置,並將結果存入v0,v0+1

    ushr