首页
社区
课程
招聘
[讨论]非常喜欢此书 但是觉得有一个细节需要修改
发表于: 2014-11-11 00:29 25181

[讨论]非常喜欢此书 但是觉得有一个细节需要修改

2014-11-11 00:29
25181
非常感谢Pediy此书带我领进门,根据教程已经自己写了第一个CrackMe也掌握了smali分析以及IDA破解的方法
书还没看完,但是觉得书中第49页的比较指令对于读者来说逻辑性上会有些困扰。
书中的cmpl-float 与cmpg-float指令描述一模一样,实际上两个指令的解释应该是不同的。
参考上文3.3.10中的if-lt是if-little than 的缩写,if-gt 是if greater than的缩写
所以这里的 l 与 g 分别代表 little 与greater

所以希望在书中修改为
cmpl-float  是比较两个单精度浮点数谁较小,如果vBB寄存器小于vCC寄存器,则结果为1,相等则结果为0,大于的话为结果为-1  
cmpg-float  是比较两个单精度浮点数谁较大,如果vBB寄存器大于vCC寄存器,则结果为1,相等则结果为0,小于的话为结果为-1  
cmpl-double 是比较两个双精度浮点数谁较小,如果vBB寄存器小于vCC寄存器,则结果为1,相等则结果为0,大于的话为结果为-1
cmpg-double 是比较两个双精度浮点数谁较小,如果vBB寄存器大于vCC寄存器,则结果为1,相等则结果为0,小于的话为结果为-1



这里的l与g都是有对应含义的,如果觉得没必要修改,还请海涵,第一次反馈意见 : )
非常感谢1L @option的提醒,这里的g是greater

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
if-gt 是if greater than的缩写
2014-11-11 06:23
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
感谢您的指正!~
2014-11-11 08:26
0
雪    币: 66
活跃值: (1880)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
什么书?
2014-11-11 09:08
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主也在学习android啊,有时间一起交流,我也在学习
2014-11-11 09:13
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lay
6
谢谢分享,帮顶了哦。
2014-11-11 12:24
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
当年许金富教授讲fortran时所学,如今已忘记差不多了。顺便问一句,你看的是什么书?
2014-11-11 14:40
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
Android软件安全与逆向分析-非虫
看雪学院非虫的书~ 正在读!~ 非常感谢您的指正
2014-11-11 14:51
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
认真看哈,书里没错,它的结果描述的值是不一样的哦。
coml  相关指令l应该是less的意思吧。
2014-11-11 16:25
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
我木有说书里错了呀~ 我只是说应该小小的修改下....~
2014-11-11 17:52
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
11
楼主解释的不错,不过我有个疑问
今天在看一个smali代码的时候遇到了cmpl-doulbe指令单独解释没有问题
而当cmpl-doulbe和if-lez 两条指令连用的时候意思就不同了
因为按照字面意思,程序的执行结果与事实不符;实例如下代码(遇到多处只列举其一):
.local v0, "levelNew":I
    iget-wide v1, p0, Lsk/bielyvlk/spectrumanalyzer/Band;->levelAnalog:D
    sget-wide v3, Lsk/bielyvlk/spectrumanalyzer/Band;->NOISE_LEVEL:D
    cmpl-double v1, v1, v3
    if-lez v1, :cond_0
    .line 68
    const-wide v1, 0x40d3880000000000L
    iget-wide v3, p0, Lsk/bielyvlk/spectrumanalyzer/Band;->levelAnalog:D
    sget-wide v5, Lsk/bielyvlk/spectrumanalyzer/Band;->NOISE_LEVEL:D
    sub-double/2addr v3, v5
    invoke-static {v3, v4}, Ljava/lang/Math;->log10(D)D
    move-result-wide v3
    mul-double/2addr v1, v3
    double-to-int v0, v1
    .line 69
    if-gez v0, :cond_0
    .line 70
    const/4 v0, 0x0
    .line 73
    :cond_0
    ......
按照字面意思解释的话还原代码如下
if (this.levelAnalog < this.NOISE_LEVEL) {
v1 = 20000.0D;
v3 = Math.log10(this.levelAnalog-this.NOISE_LEVEL);//这时this.levelAnalog-this.NOISE_LEVEL无意义因为公式LOG(N),要求N>0
v1 = v1 * v3;
v0 = (int)v1;
if (v0<0) {
        v0 = 0;
    }
}
所以smali指令
1.cmpl-double v2, v0, v2
2.if-lez v2, :cond_0
连用的意思可能是v0<=v2时跳转到cond_0
这样解释虽然与指令介绍不符但是,逻辑却合理,莫非反编译引擎有问题?
2014-12-24 23:37
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
1.cmpl-double v2, v0, v2
比较v0与v2,将比较的结果赋值给v2,这里是判断v0是否小于v2.

2.if-lez v2, :cond_0
如果v2小于0 ,跳转cond_0.

参考资料
https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html

Perform the indicated floating point or long comparison, setting a to 0 if b == c, 1 if b > c, or -1 if b < c. The "bias" listed for the floating point operations indicates how NaN comparisons are treated: "gt bias" instructions return 1 for NaN comparisons, and "lt bias" instructions return -1.
For example, to check to see if floating point x < y it is advisable to use cmpg-float; a result of -1 indicates that the test was true, and the other values indicate it was false either due to a valid comparison or because one of the values was NaN.

在这里如果v0<v2 ,那么v2=-1
也就是v0<v2跳转cond_0
这里如果v0=v2的话 返回值为0 ,也就是说如果为0 是不会跳转cond_0
2015-1-10 10:58
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
13
楼上兄弟,你说的我有点疑问,下面这句话理解有点问题
cmpl-float v0, v6, v7
Compares the float values in v6 and v7 then sets v0 accordingly. NaN bias is less-than, the instruction will return -1 if any of the parameters is NaN.
如果我理解为v6 < v7时,v0=-1的话,这与上面书中的描述相反,翻译有误吗?
2015-1-10 11:42
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
cmpkind vAA, vBB, vCC
比较函数
2d: cmpl-float (lt bias)
    单精度浮点比较(比较谁更小)
2e: cmpg-float (gt bias)
    单精度浮点比较(比较谁更大)
2f: cmpl-double (lt bias)
    双精度浮点比较(比较谁更小)
30: cmpg-double (gt bias)
    双精度浮点比较(比较谁更大)
31: cmp-long
    [长整形比较?]

A: destination register (8 bits)
A: 目的寄存器
B: first source register or pair
B: 第一源寄存器
C: second source register or pair
C: 第二源寄存器

Perform the indicated floating point or long comparison
浮点型以及long类型比较说明[抱歉这里的long我不知道是什么类型了]
setting a to 0  if b == c,
如果vBB=vCC 则将vAA设置为0
setting a to 1  if b >  c,
如果vBB>vCC 则将vAA设置为1
setting a to -1 if b < c.
如果vBB<vCC 则将vAA设置为-1
The "bias" listed for the floating point operations indicates how NaN comparisons are treated: "gt bias" instructions return 1 for NaN comparisons, and "lt bias" instructions return -1.
比较"偏向" 列出浮点类型比较的处理方法:" 比较较大 " 返回1 ," 比较较小 "返回-1
For example, to check to see if floating point x < y it is advisable to use cmpg-float; a result of -1 indicates that the test was true,
例如,如果 x < y , 如果使用cmpg-float(比较较大数值), 这里的返回值就是-1   
补充:如果 x < y , 如果使用cmpl-float(比较较小数值), 这里的返回值也是-1
and the other values indicate it was false either due to a valid comparison or because one of the values was NaN.

不同的比较方式,返回值虽然相同,但是意思不同,不知道楼上能否理解我的意思? 还有您问的那个"这与上面书中的描述相反,翻译有误吗? " 是哪里啊?
2015-1-10 14:38
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
15
就是画线的那条,指令cmpl-float vAA,vBB,vCC,如果vBB>vCC,vAA=-1,与你说的相反吧
上传的附件:
2015-1-10 22:44
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=AJISky;1344357]就是画线的那条,指令cmpl-float vAA,vBB,vCC,如果vBB>vCC,vAA=-1,与你说的相反吧
[/QUOTE]

参考楼上补充内容
补充:如果 x < y , 如果使用cmpl-float(比较较小数值), 这里的返回值也是-1
cmpl-float vAA,vBB,vCC
正常情况是 vBB<vCC.    vAA = -1
这里是     vBB>vCC     vAA =  1
没错呀
2015-1-11 08:37
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
17
卧槽了,哥们,你自己还注释着呢,vbb<vcc结果为1好吗,能不能仔细看下
2015-1-12 11:06
0
雪    币: 24
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
都不知道您看的 是什么书
2015-1-25 14:34
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
19
仔细过了一遍 dalvik 指令,这两条指令实际上一样,区别只是倾向于先比较小于还先比较大于
参考这里 http://androidxref.com/8.0.0_r4/xref/art/runtime/interpreter/interpreter_switch_impl.cc#657

2019-4-26 19:28
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
GeneBlue 仔细过了一遍 dalvik 指令,这两条指令实际上一样,区别只是倾向于先比较小于还先比较大于 参考这里 http://androidxref.com/8.0.0_r4/xref/art/runtim ...
也可能是google开始实现时就错了,将错就错到现在
2019-4-26 19:30
0
游客
登录 | 注册 方可回帖
返回
//