首页
论坛
课程
招聘
[求助]呼叫非虫,关于Dalvik 指令格式问题
2012-11-10 23:35 26307

[求助]呼叫非虫,关于Dalvik 指令格式问题

2012-11-10 23:35
26307
记得你在一篇文章中写到
------------------------------------------------------
Dalvik OpCodes的大小与内容由最后insnsSize与insns决定,0x2e8指向的数据解析为:
registersSize  1
insSize    0
outsSize    1
triesSize    0
debugInfoOff 0x642
insnsSize    4
Insns    7010 0000 0000 0E00 
到“/dalvik/docs/dalvik-bytecode.html”文件中翻看OpCodes,得到70为invoke-direct,格式为:
invoke-direct {vC, vD, vE, vF, vG}, meth@BBBB 
A: argument word count (4 bits)
B: method reference index (16 bits)
C..G: argument registers (4 bits each) 
指令格式编号为35c,到“/dalvik/docs/instruction-formats.html”文件中查看35c的编码参数说明:
A|G|op BBBB F|E|D|C
[A=5] op {vC, vD, vE, vF, vG}, meth@BBBB
[A=5] op {vC, vD, vE, vF, vG}, type@BBBB
[A=4] op {vC, vD, vE, vF}, kind@BBBB
[A=3] op {vC, vD, vE}, kind@BBBB
[A=2] op {vC, vD}, kind@BBBB
[A=1] op {vC}, kind@BBBB
[A=0] op {}, kind@BBBB
  7010 0000 0000表示,70为invoke-direct,A=1使用“[A=1] op {vC}, kind@BBBB”,G=0表示使用v0,BBBB=0000表示MethodId索引为0,F|E|D|C=0,在DexHeader中DexMethodId 结构定义如下:
struct DexMethodId {
    u2  classIdx;           /* index into typeIds list for defining class */
    u2  protoIdx;           /* index into protoIds for method prototype */
    u4  nameIdx;            /* index into stringIds for method name */
};
第一个字段指向typeId的索引,DexTypeId 结构如下:
struct DexTypeId {
    u4  descriptorIdx;      /* index into stringIds list for type descriptor */
};
第二个字段指向protoId的索引,DexProtoId 结构如下:
struct DexProtoId {
    u4  shortyIdx;          /* index into stringIds for shorty descriptor */
    u4  returnTypeIdx;      /* index into typeIds list for return type */
    u4  parametersOff;      /* file offset to type_list for parameter types */
};
descriptorIdx与shortyIdx都指向了一个DexStringId ,也就是DexHeader中stringIdsOff相应的字符串位置,它的结构如下:
struct DexStringId {
    u4 stringDataOff;      /* file offset to string_data_item */
};
回到刚才的分析,上面代码的Method的methodIdx为0,在DexHeader中methodIdsOff指向0x190,取得classIdx为1,在DexTypeId中取得descriptorIdx为1,得到最终字符串“android/app/Activity”,取得protoIdx为1,在DexProtoId 取得shortyIdx为0x11,取得最终字符串为“V”,取得nameIdx为0,取得最终字符串为“<init>”。
  0E00查得OpCodes代表:return-void
综合上面的分析,得出最终的代码为:
invoke-direct {v0}, Landroid/app/Activity;.<init>:()V // method@0000
return-void
-----------------------------------------------------------
这一段,看不懂啊,你是如何知道A=1的?

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

收藏
点赞0
打赏
分享
最新回复 (22)
雪    币: 2299
活跃值: 活跃值 (331)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2012-11-11 11:54
2
0
3.2.1 Dalvik指令格式
一段Dalvik汇编代码由一系列Dalvik指令组成,指令语法由指令的位描述与指令格式标识来决定。位描述约定如下:
        每16位的字采用空格分隔开来。
        每个字母表示四位,每个字母按顺序从高字节开始,排列到低字节。每四位之间可能使用竖线“|”来表示不同的内容。
        顺序采用A~Z的单个大写字母作为一个4位的操作码,op表示一个8位的操作码。
        “Ø”来表示这字段所有位为0值。
以指令格式“A|G|op BBBB F|E|D|C”为例:
指令中间有两个空格,每个分开的部分大小为16位,所以这条指令由三个16位的字组成。第一个16位是“A|G|op”,高8位由A与G组成,低字节由操作码op组成。第二个16位由BBBB组成,它表示一个16位的偏移值。第三个16位分别由F、E、D、C共四个4字节组成,在这里它们表示寄存器参数。
单独使用位标识还无法确定一条指令,必须通过指令格式标识来指定指令的格式编码。它的约定如下:
        指令格式标识是大多由三个字符组成,前两个是数字,最后一个是字母。
        第一个数字是表示指令有多少个16位的字组成。
        第二个数字是表示指令最多使用寄存器的个数。特殊标记“r”标识使用一定范围内的寄存器。
        第三个字母为类型码,表示指令用到的额外数据的类型。取值见表3-1。
还有一种特殊的情况是末尾可能会多出另一个字母,如果是字母s表示指令采用静态链接,如果是字母i表示指令应该被内联处理。
助记符        位大小        说明
b        8        8位有符号立即数
c        16,32        常量池索引
f        16        接口常量(仅对静态链接格式有效)
h        16        有符号立即数(32位或64位数的高值位,低值位为0)
i        32        立即数,有符号整数或32位浮点数
l        64        立即数,有符号整数或64位双精度浮点数
m        16        方法常量(仅对静态链接格式有效)
n        4        4位的立即数
s        16        短整型立即数
t        8,16,32        跳转、分支
x        0        无额外数据
表3-1 指令格式标识的类型码
以指令格式标识22x为例:
第一个数字2表示指令有两个16位字组成,第二个数字2表示指令使用到2个寄存器,第三个字母x表示没有使用到额外的数据。
另外,Dalvik指令对语法做了一些说明,它约定如下:
        每条指令从操作码开始,后面紧跟参数,参数个数不定,每个参数之间采用逗号分开。
        每条指令的参数从指令第一部分开始,op位于低8位,高8位可以是一个8位的参数,也可以是两个4位的参数,或者为空,如果指令超过16位,则后面部分依次作为参数。
        如果参数采用“vX”的方式表示,表明它是一个寄存器,如v0、v1等。这里采用v而不用r是为了避免与基于该虚拟机架构本身的寄存器命名产生冲突,如ARM架构寄存器命名采用r开头。
        如果参数采用“#+X”的方式表示,表明它是一个常量数字。
        如果参数采用“+X”的方式表示,表明它是一个相对指令的地址偏移。
        如果参数采用“kind@X”的方式表示,表明它是一个常量池索引值。其中kind表示常量池类型,它可以是“string”(字符串常量池索引)、 “type”(类型常量池索引)、“field”(字段常量池索引)或者“meth”(方法常量池索引)。
以指令“op vAA, string@BBBB”为例:
指令用到了1个寄存器参数vAA,并且还附加了一个字符串常量池索引string@BBBB,其实这条指令格式代表着const-string指令。
在Android4.0源码Dalvik/docs目录下提供了一份文档instruction-formats.html,里面详细列举了Dalvik指令的所有格式。读者可以通过它了解Dalvik指令更加完整的信息。

70 = op 1 = A 0 = G
雪    币: 72
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bdw 活跃值 2012-11-11 21:11
3
0
请问我现在想弄这块,你这个内容从哪里获得的?
另外,因为我看到金山毒霸,有自动去除layout广告的功能,想了好久了,怀疑和这块有关,请问你有什么看法?
雪    币: 2299
活跃值: 活跃值 (331)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2012-11-11 21:33
4
0
这段内容是鄙人将要出版(还有两个月)的《Android软件安全与逆向分析》一书中抠出来的一点。
没看法。
雪    币: 72
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bdw 活跃值 2012-11-11 22:47
5
0
怎么说?没看法?
雪    币: 72
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bdw 活跃值 2012-11-11 22:52
6
0
你的书中有点没讲清楚,比如7010 0000 0000 0E00 这个是地址,为什么只取前面的7010 0000 0000
以及他的fomat和这个二进制如何对应的,我想了很久了,都没想通。能不能拜托解释下。
雪    币: 72
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bdw 活跃值 2012-11-11 22:54
7
0
大概什么时候能买到?能不能快点上市?
雪    币: 2299
活跃值: 活跃值 (331)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2012-11-11 23:21
8
0
哪里还没清楚?指令格式“A|G|op BBBB F|E|D|C”就是3个16位,后面的0E00又是单独的16位。仔细的看,认真的想。
雪    币: 190
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
miyunhong 活跃值 2014-11-26 11:43
9
0
有同感,3.2.1 Dalvik指令格式,这一节 看得头晕啊,,感觉例子太少了,,
雪    币: 35
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mlyKnown 活跃值 2014-11-26 11:58
10
0
还没看。
雪    币: 190
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
miyunhong 活跃值 2014-11-26 15:34
11
0
不知道 是不是 本人水平问题还是,,看了接近4章 作者 很喜欢 先讲一堆规则,完了讲一两个例子,
是不是先简单介绍点规则, 接着讲几个小例子, 最后把一些复杂规则和不常见的做个补充,这样是否更容易让人理解,有点类似 王爽写的 汇编语言, 汇编本来很难讲, 但我感觉王爽写得很容易让人理解,再有就是谭浩强的书,
严蔚敏的数据结构也是非常难懂,貌似徐晓凯的还可以。

非虫的这本书的确很强,但感觉对我来说有点难懂, 可能是本人水平问题,
雪    币: 1166
活跃值: 活跃值 (82)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
Ericky 活跃值 6 2014-11-28 11:54
12
0
Hi,请问下Dexfixer 能发一份源码学习吗?1326397@qq.com
雪    币: 191
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liubii 活跃值 2014-11-29 22:44
13
0
这本书看着好难啊,本人没什么基础, 是不是要先熟悉一下android的开发呢
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dawnME 活跃值 2014-12-1 10:27
14
0
终于找到你了
雪    币: 190
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
miyunhong 活跃值 2014-12-1 15:19
15
0
本人超级菜鸟,感觉至少 熟悉java的基本语法, 熟悉android 最简单的 hellowod 是怎么弄的,它的文件结构,怎么添加控件,添加事件,找个android开发的视频看几集,非虫这本书的 第二章有个android的例子 crackme 这个至少得看懂吧,
你最好下载下这本书的源码,书上说的工具都在里面,直接拿来用,
雪    币: 1650
活跃值: 活跃值 (108)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
天易love 活跃值 18 2015-1-20 10:12
16
0
7010 0000 0000 0E00 颠倒一下就是: 1070  0000 0000
对应的就是:
A=1
G=0
op=70
B=0
C=D=E=F=0
作者肯定是觉得大家水平都很高,所以就在这里省略了xx字
雪    币: 59
活跃值: 活跃值 (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
a傻子真多啊 活跃值 2015-1-21 14:45
17
0
额,看书的时候偶然发现,在第80页,7010 0400 0000 这块,A=1,G=0,op=70,但是BBBB=0004吧,- -不应该是书上写的等于0.。。并且下面的smali代码写的也好像是,在DexMethodId列表的第5条,也就是BBBB=4对应的方法名。。。虽然BBBB=0对应的方法和等于4对应的都是<init>方法,但是类类型是不一样的啊,这个应该是Object的<init>吧。。。。是不是这样呢。。。。小菜鸟疑惑啊 - -,万一错了,大神见谅啊。。。
雪    币: 227
活跃值: 活跃值 (62)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 活跃值 3 2016-5-25 16:18
18
0
哈哈看到了,那个A其实是7010中的第三位,G是第4位,所以op A G ,A=1,G=0,,我觉得那个指令格式怎么不写成
op|A|G BBBB F|E|D|C

这样看起来会好很多啊,奇怪为什么指令格式要把A|G放在op前面
雪    币: 227
活跃值: 活跃值 (62)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 活跃值 3 2016-5-25 16:21
19
0
是的P80页说,7010后面的两个16位都为0,

但是紧接着作者说了,因此BBBB=4,但前后说话还是有点不一致
雪    币: 1
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天泽 活跃值 2017-3-26 21:21
20
0
我也感觉指令格式与指令对应没讲清楚,看的有点晕
雪    币: 2299
活跃值: 活跃值 (331)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2017-3-27 14:04
21
0
天泽 我也感觉指令格式与指令对应没讲清楚,看的有点晕
是的 BBBB=0004,这个错误在新版本中修正了,另一个大王叫我挖坟 提到的原因是小端字节序我没有说清楚, 天易love 在帖子中回复了。
雪    币: 1053
活跃值: 活跃值 (391)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
王嘟嘟 活跃值 2017-12-21 17:35
22
0
来学习了,Dalvik指令现在都是遇到就回来查,没有认认真真的研究过,会不会走向歧途
雪    币: 3124
活跃值: 活跃值 (321)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
淡定小胖子 活跃值 2019-4-23 11:38
23
0
想要看懂这种解析文章,需要具备啥知识呢
游客
登录 | 注册 方可回帖
返回