用python一步步解剖dex文件(四)--- 反匯編框架

請勿轉載,謝謝!!!?

另祝大家新年快樂,萬事大吉!


Dalvik 字節碼格式的官方說明:

字節碼格式:?https://source.android.google.cn/devices/tech/dalvik/dalvik-bytecode

說明格式:?https://source.android.google.cn/devices/tech/dalvik/instruction-formats

之前有介紹過指令字節碼如何反編譯的,參考文章最后部分:

用python一步步解剖dex文件(二)

每段指令字節碼的第一個字節就是指令碼,指令碼的范圍在[0x00 - 0xff],就是256個以內。

每個指令碼都對應一個格式解析說明,該說明詳細指出了該段字節指令碼占用了幾個字節,使用幾個寄存器,以及如何讀取的。

以這個指令格式說明為基礎,我設計了反匯編框架,代碼地址:

https://github.com/callmejacob/dexfactory/tree/master/disassemble


指令字節數組的最小單位解析

指令字節數組的最小單位,只有一個指令碼,后面跟著對應的指令數據。

以'4rcc'指令格式為例子,它的格式說明如下:

4rcc格式說明

它占用了4 * 2 = 8個字節,這8個字節可以按照最左側的格式進行分解,得到AA, BB, CCCC, HHHH,繼而算出 NNNN = CCCC + AA - 1。

反編譯出來的代碼如下:

op> {vCCCC ... vNNNN}, meth@BBBB, proto@HHHH

其中op就是字節碼; CCCC, NNNN, BBBB,HHHH是解析或者計算好的數值。

而meth是一種kind類型,表示一種常量池的索引,而且每個指令碼對應的kind類型可能不一樣(后面有詳細說明)。

最后的proto是固定的,表示proto類型的常量池。

我們把這個反編譯出來的用格式化表示:?

總格式: ?'%s> {v%d ... v%d}, %s, %s' % (op_map[op], CCCC, NNNN, '%s', '%s')

最后兩個為什么用%s呢? 因為也把kind類型的和proto類型的做格式化處理,最后合并到上面的總格式中。

這兩個格式都用下述格式表示:

kind格式: ?'%s@%.4x'

它的第一個參數是kind類型,第二個就是kind類型的數值,比如

meth@0003

代表method常量池的第3個子項。

我們用代碼實現如下:

解析過程

上面的desc就是我們說的總格式,而kind_x, proto_x都是用來形成kind格式的數值。

如果我們拼接好kind格式之后,使用下面的方法匯總到總格式:

總格式拼接

打印方法:

打印方法

上面的例子中,'4rcc'格式比較有代表性,它包含了[op, 變量,kind, proto]四個重要的信息。

下面我們介紹通用的解碼過程(decode)。

decode會根據指令碼和對應的說明格式進行一一解析,這需要建立一些指令碼類型的映射集合,詳細如下。

指令碼集合(片段):

指令碼集合

常量池類型定義(kind):

常量池類型定義

指令碼對應的kind類型映射(片段):

指令碼和kind的映射

指令碼到解釋格式的映射集合(片段):

指令碼到解釋格式的映射

利用op_map可以獲取到指令碼描述;

利用format_map可以獲取到指令碼說明格式,并根據該格式進行變量解析;

利用kind_map可以獲取到拼接kind格式的類型。

最后,根據上述信息,匯總到總格式字符串中。

這樣,一個最小單位的指令字節碼就解析完成了。

我們將上述方法都封裝到類InsnsItem中,它能夠解析一個最基本的指令字節碼,并且能夠打印出來相關的反匯編代碼。

代碼片段如下:

類InsnsItem

指令字節碼全段解析

指令字節數組可以分解為若干個最小單位的指令字節碼,形成一個item_list。

指令字節數組全解碼

其中的InsnsItem中的kind格式信息,還是最原始的,比如meth@0003。

為了獲取它實際信息,我們定義一個kind到對應section信息的一個映射和獲取方法:

kind到section的映射信息

在上述映射的基礎上,我們可以把item信息轉換成真實的反匯編信息。

打印過程:

指令字節碼反匯編打印

其中的context,就是包含section信息的上下文,通過它我們把kind和proto兩個格式字符串格式化,獲取到kind_desc和proto_desc(它們包含了真實信息),最終再填充到總格式化字符串中。

最后我們把這兩個過程封裝到類Insns中,它以指令字節數組為參數,可以反編譯出對應的指令代碼。


反匯編和Dex解析框架

我們把這個反匯編框架和之前的dex格式解析框架結合起來。

全解析框架參考:

用python一步步解剖dex文件(三)

先在Context類中,定義一個變量來代表反編譯類的class,并提供設置方法。

context的insns類

然后在code_item段中,對于解析出來的每段insns字節碼數組進行反匯編:

字節碼反匯編

反匯編測試

測試代碼

其中"#反匯編"這段不是必要的,因為后面反匯編類掛接到context中后,也能夠直接反匯編解析,這里是為了測試。?

這段的打印結果如下: ?(格式是字節碼數組和反匯編解釋)

反匯編測試

使用反匯編的類信息打印如下:

帶反匯編信息的類信息




待續

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容