首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android smali问题

Android smali问题
EN

Stack Overflow用户
提问于 2010-12-04 20:56:36
回答 3查看 5.6K关注 0票数 5

我目前正在做一些关于smali/"code obfuscator“的研究,目前我正在尝试熟悉反编译的源代码。为此,我创建了一个简单的应用程序,并通过smali对其进行了反编译。

我现在正在尝试理解反编译的源代码,以改善和比较稍后使用代码混淆程序后的安全性(相对于反编译)。虽然大多数smali源代码并不是那么困难,但我仍然有时会遇到图形格式转换的问题。

你能给我解释一下下面这行吗?我猜它的值应该是5,但我不确定这是哪种二进制格式。如何计算0x4014 =5?

代码语言:javascript
复制
const-wide/high16 v0, 0x4014       // 100000000010100        (5 = 101)

以下是此测试函数的完整java和smali代码源代码:

Java源:

代码语言:javascript
复制
 boolean test(int a, double d) {
        if (a < 5 && d < 5)
            return true;
        else 
            return false;
    }

Smali来源:

代码语言:javascript
复制
.method test(ID)Z
    .locals 2
    .parameter "a"
    .parameter "d"

    .prologue
    .line 28
    const/4 v0, 0x5

    if-ge p1, v0, :cond_0

    const-wide/high16 v0, 0x4014

    cmpg-double v0, p2, v0

    if-gez v0, :cond_0

    .line 29
    const/4 v0, 0x1

    .line 31
    :goto_0
    return v0

    :cond_0
    const/4 v0, 0x0

    goto :goto_0
.end method
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-05 15:41:33

不幸的是,dalvik字节码没有区分整数类型(短整型/整型/长整型/等)和浮点型(浮点型/双精度型)。所以baksmali不知道是将这样的常量显示为浮点型还是整型,所以它只缺省为整型。

像你提到的那样的指令的存在使情况变得更加复杂。从dalvik-bytecode page from the dalvik documentation

“将给定的文字值(右零扩展到64位)移到指定的寄存器对中。”

因此该指令实际上会将值0x4014000000000000加载到v0和v1寄存器中。这是标准的64位IEEE-754浮点表示。第一位(最高有效位)是符号位,接下来的11位是指数(以2为底),最后52位是尾数。在本例中,我们有一个二进制表示

代码语言:javascript
复制
0100000000010100000000000000000000000000000000000000000000000000
SEEEEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

对于符号位,0为正,1为负。

对于指数,取11位的整数值(在本例中为1025),然后减去1023,指数为2。

对于尾数,在前面的2^0位置有一个隐含的"1“,下面的数字是通常的2^1,2^2,等等。所以在这个例子中,我们有二进制数1.01,或1*2^0 + 1*2^-2,或1.25。

用于该值的计算的一般形式为

-1^(2+S) *M* 2^E

其中S、M和E是符号、尾数和指数。

在本例中,我们有-1^(2+0) * 1.25 * 2^2 =1* 1.25 *4=5

如果你不想每次都手动计算,有各种在线计算器可以帮你完成。http://babbage.cs.qc.edu/IEEE-754/64bit.html似乎是更好的选择之一。

票数 12
EN

Stack Overflow用户

发布于 2010-12-04 23:48:46

我是在内存中这样做的,但据我所知,浮点数通常是这样存储的:

代码语言:javascript
复制
100000000010100
smmmmmmmmmmmmee

s =符号,m =尾数,e =指数。因此,在您的示例中,符号必须为1或正,尾数为5,指数为零:

+5 x 2^0 =5

有关更多信息,请参阅floating point上的维基百科文章。显然,您的编码使用15位,这对于浮点数来说并不是很多,特别是指数只有2位,所以它可能是完全不同的东西。这只是我有根据的猜测。您可以尝试输入其他数字并检查反编译的代码,以了解更多信息。

票数 1
EN

Stack Overflow用户

发布于 2010-12-04 21:39:35

这显然是将"5“作为双精度型的适当的二进制编码,以便与浮点类型的第二个参数进行比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4353580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档