5

私は現在、smali / "code obfuscator"について調査を行っており、現在、逆コンパイルされたソースコードに慣れようとしています。このために、私は簡単なアプリを作成し、smaliで逆コンパイルしました。

後でコード難読化ツールを使用した後、セキュリティを改善して(逆コンパイルに対して)比較するために、逆コンパイルされたソースコードを理解しようとしています。ほとんどのsmaliソースコードはそれほど難しくはありませんが、それでも図のフォーマット変換で問題が発生することがあります。

次の行など、私に説明してもらえますか。値は5になるはずですが、これがどの種類のバイナリ形式かはわかりません。それを計算する方法0x4014=5 ???

const-wide/high16 v0, 0x4014       // 100000000010100        (5 = 101)

添付されているのは、このテスト関数の完全なjavaおよびsmaliコードソースです。

Javaソース:

 boolean test(int a, double d) {
        if (a < 5 && d < 5)
            return true;
        else 
            return false;
    }

Smaliソース:

.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
4

3 に答える 3

12

残念ながら、dalvikバイトコードは整数型(short / integer / long / etc。)と浮動小数点型(float / double)を区別しません。したがって、baksmaliは、そのような定数を浮動小数点として表示するか整数として表示するかを判断できないため、デフォルトで整数になります。

これは、あなたが言及したような命令の存在によってさらに複雑になります。dalvikドキュメントのdalvik-bytecodeページから

「指定されたリテラル値(右ゼロ-64ビットに拡張)を指定されたレジスタペアに移動します。」

そのため、この命令は実際に値0x4014000000000000をv0およびv1レジスタにロードします。これは、標準の64ビットIEEE-754浮動小数点表現です。最初の(最上位)ビットは符号ビット、次の11ビットは指数(基数2)、最後の52ビットは仮数です。この場合、次のバイナリ表現があります。

0100000000010100000000000000000000000000000000000000000000000000
SEEEEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

符号ビットの場合、0は正、1は負です。

指数の場合、11ビットの整数値(この場合は1025)を取得し、指数が2の場合は1023を減算します。

仮数の場合、2 ^ 0の場所の前に暗黙の「1」があり、次の数字は通常の2 ^ -1、2 ^ -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は優れたものの1つと思われます。

于 2010-12-05T07:41:32.813 に答える
1

私はこれをメモリから行っていますが、私が覚えている限り、浮動小数点数は通常次のように格納されます。

100000000010100
smmmmmmmmmmmmee

s=符号、m=仮数、e=指数。したがって、あなたの場合、符号は1または正でなければならず、仮数は5であり、指数はゼロです。

+5 x 2 ^ 0 = 5

詳細については、浮動小数点に関するWikipediaの記事を参照してください。どうやらあなたのエンコーディングは15ビットを使用しているようですが、これは浮動小数点数にはあまり多くありません。特に指数には2ビットしかないので、まったく別のものかもしれません。これは私の知識に基づく推測です。詳細については、他の数値を入力し、逆コンパイルされたコードを調べてみてください。

于 2010-12-04T15:48:46.277 に答える
0

その浮動小数点型の2番目のパラメーターと比較するために、doubleとしての「5」の適切なバイナリエンコードであるようです。

于 2010-12-04T13:39:34.520 に答える