用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阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359

推荐阅读更多精彩内容