安卓逆向 二

2021-10-24 23:26:32 字數 3656 閱讀 6155

基礎位元組碼 - 名稱字尾/位元組碼字尾 目的暫存器 源暫存器

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還生成個雞毛喲...