基礎位元組碼 - 名稱字尾/位元組碼字尾 目的暫存器 源暫存器
move-wide/from16 vaa,vbbb
dalvik指令集中大多數指令用到了暫存器作為目的運算元或源運算元,其中 a/b/c/d/e/f/g/h 代表乙個4位的數值,aa/bb/…/hh 代表乙個8位的數值,aaaa/bbbb/…/hhhh 代表乙個16位的數值
1、空操作指令
空操作指令的助記符為nop.它的值為00,通常nop指令被用來作對齊**之用,無實際操作。
2、資料操作指令
move
move va,vb 將vb暫存器的值賦給va暫存器,源暫存器與目的暫存器都為4位。
move/form16 vaa,vbbbb 將vbbbb暫存器的值賦給vaa暫存器,源暫存器為16位,目的暫存器為8位。
「move-wide va,vb」:為4位的暫存器對賦值,源暫存器與目的暫存器都為4位。
「move-object va,vb」:為物件賦值。源暫存器與目的暫存器都為4位。
「move-onject/from16 vaa,vbbbb」:為物件賦值。源暫存器為16位,目的暫存器為8位。
「move-object/16 vaa,vbbbb」:為物件賦值,源暫存器與目的暫存器都為16位。
「move-exception vaa」:儲存執行時發生的異常到vaa暫存器。
總結起來,move指令有是三種作用:
第一種作用:進行賦值操作
第二種作用:move-result接收方法返回值操作
第三種作用:處理異常的操作
3、返回指令(重點)
return
「return-void」:表示函式從乙個void方法返回,返回值為空。
「return vaa」:表示函式返回乙個32位非物件型別的值,返回值暫存器為8位的暫存器vaa。
「return-wide vaa」:表示函式返回乙個64位非物件型別的值,返回值為8位的暫存器對vaa。
「return-object vaa」:返回乙個物件型別的值,返回值為8位的暫存器vaa。
4、資料定義指令(重點)
資料定義指令用來定義程式中用到的常量、字串、類等資料。
「const/ va,#+b」:將數值符號擴充套件為32位後賦給暫存器 va。
「const/16 vaa,#+bbbb」:將資料符號擴充套件為32位後賦值給暫存器 vaa。
「const vaa,#+bbbbbbbb」:將數值賦值給暫存器 vaa。
「const/high16 vaa,#+bbbb0000」:將數值右邊零擴充套件為32位後賦給暫存器 vaa。
「const-wide/16 vaa,#+bbbb」:將數值符號擴充套件為64位後賦給暫存器對 vaa。
「const-wide/32 vaa, #+bbbbbbbb」:將數值符號擴充套件為64位後賦給暫存器vaa。
「const-wide vaa, #+bbbbbbbbbbbbbbbb」:將數值賦給暫存器vaa。
「const-wide/high16 vaa, #+bbbb000000000000」:將數值右邊零擴充套件為64位後賦給暫存器vaa。
「const-string vaa,string@bbbb」:通過字串索引構造乙個字串並賦給暫存器vaa。
「const-string/jumbo vaa,string@bbbbbbbb」:通過字串索引(較大)構造乙個字串並賦給暫存器vaa。
「const-class vaa, type@bbbb」:通過型別索引獲取乙個類引用並賦給暫存器vaa。
「const-class/jumbo vaaaa, type@bbbbbbbb」:通過給定的型別索引獲取乙個類引用並賦給暫存器 vaaaa。
這條指令占用兩個位元組,值為0x00ff(android4.0中新增的指令)。
5、例項操作指令
「check-cast vaa, type@bbbb」:
將 vaa暫存器中的物件引用轉換成指定的型別。
如果失敗會報出classcastexception移倉。
如果型別b指定的是基本型別,對於非基本型別的a來說,執行時始終會失敗。
「instance-of va, vb, type@cccc」
判斷 vb暫存器中的物件引用是否可以轉換成指定的型別。
如果可以 va暫存器賦值為1,否則va暫存器賦值為0.
「new-instance vaa, type@bbbb」
構造乙個指定型別物件的新例項,並將物件引用賦值給vaa暫存器。型別符type指定的型別不能是陣列類。
6、陣列操作指令
陣列操作包括獲取陣列長度,新建陣列,陣列賦值,陣列元素取值與賦值等操作。
「array-length va, vb」
獲取給定vb暫存器中陣列的長度並將值賦給va暫存器。
陣列長度指的是陣列的條目個數。
「new-array va, vb, type@cccc」:
構造指定型別(type@cccc)與大小(vb)的陣列,並將值賦給va暫存器。
「filled-new-array ,type@bbbb」:
構造指定型別(type@bbbb)與大小(va)的陣列並填充陣列內容。va暫存器是隱含使用的,除了指定陣列的大小外還指定了引數的個數, vc~vg是使用到的引數寄存序列。
「filled-new-array/range ,type@bbbb」:
指令功能與"filled-new-array ,type@bbbb"相同,只是引數暫存器使用range位元組碼字尾指定了取值範圍,vc是第乙個引數暫存器,n=a+c-1。
「fill-array-data vaa, +bbbbbbbb」:
用指定的資料來填充陣列,vaa暫存器為陣列引用,引用必須為基礎型別的陣列,在指令後面會緊跟乙個資料表。
7、異常指令
「throw vaa」:丟擲 vaa暫存器中指定型別的異常。
8、跳轉指令(重點)
跳轉指令用於從當前位址跳轉到指定的偏移處。
dalvik指令集中有三種跳轉指令:
goto: 無條件跳轉
switch:分支跳轉
packed-switch:有規律跳轉
sparse-switch:無規律跳轉
if:條件跳轉
if-lt:小於/if-le:小於等於
if-gt:大於/if-ge:大於等於
if-egz:等於0/if-nez:不等於0
if-ltz:小於0/if-lez:小於等於0
if-gtz:大於0/if-gez:大於等於0
9、比較指令(cmp)
比較指令用於對兩個暫存器的值(浮點型或長整型)進行比較。
大於(1) / 等於(0) / 小於(-1) => cmgp、cmp
大於(-1) / 等於(0) / 小於(1) => cmpl
例子:10、字段操作
普通字段 => iget讀 / iput寫
靜態字段 => sget讀 / sput寫
11、方法呼叫指令(重點)
根據方法型別不同,共有5條方法呼叫指令
12、資料轉換指令
資料轉換指令用於將一種型別的數值轉換成另外一種型別。
**13、**資料運算指令
安卓逆向學習筆記(10) 安卓逆向學習資料
因為喜歡android安全,而android逆向是android安全的乙個分支,所以小弟利用業餘時間自學了一點android逆向。在學習過程中總結了一點學習資料,特此分享給大家。1 android安全大牛的部落格 鬼哥的部落格 聽鬼哥說故事 jack jia的部落格 android手機病毒分析及研究...
逆向某m 安卓APP記錄
我自己寫的xml檔案的xmlns android為 修改一下,發現不報y.xml的錯了,其他檔案還是繼續報錯,看來要研究下xmlns android 剛才的方法治標不治本,上網找了一下res auto一般用在自定義控制項的xml,在res values attrs.xml 新增 發現title的錯不...
171025 逆向 安卓脫殼(補充實驗)
1625 5 王子昂 總結 2017年10月25日 連續第390天總結 a.xp0int so fun zjdroid安卓脫殼 b.今天補上昨天的遺漏和測試 首先是 之前想的太簡單了,if判斷內部其實是進一步的校驗,而不是我以為的flag生成 估計太晚了腦子有坑了吧,輸入的就是flag還生成個雞毛喲...