0

apktool を使用して apk を逆コンパイルすると、double の配列が以下のコードに変換されることがわかりました。apktool はどのようにそれを行いますか?

:array_0
 .array-data 0x8
     0xc7t 0x55t 0x9at 0xf4t 0x6dt 0x5bt 0x44t 0x40t
     0xfet 0x6t 0xdat 0x35t 0x7et 0x5bt 0x44t 0x40t
     0xd4t 0x57t 0x45t 0xf8t 0x59t 0x5bt 0x44t 0x40t
     0xf6t 0xe8t 0xaat 0x3et 0x4et 0x5bt 0x44t 0x40t
     0xc7t 0x55t 0x9at 0xf4t 0x6dt 0x5bt 0x44t 0x40t
 .end array-data
4

2 に答える 2

1

サンプルプログラムをビルドし、逆コンパイルしました。数値は double で、行ごとに 1 つです。各 double は、LSB が最初のIEEE754形式でエンコードされます。私の配列は次のように定義しました:

double array[]={ 0, 1, 0.5, 2 };

結果の baksmali は次のようになります。

:array_0
.array-data 0x8
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x0t
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0xf0t 0x3ft
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0xe0t 0x3ft
    0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x0t 0x40t
.end array-data

1 の IEEE754 表現は であるため、0x3ff0000000000000double はリトルエンディアン IEEE754 に格納されていると結論付けることができます。

プログラム内の数値を変換することだけが必要な場合は、オンライン コンバーターを使用できます(このリンクでは、最初の double が既に入力されています)。

シャチャー

于 2012-07-09T19:34:04.507 に答える
0

理解しようとしているだけなのか、それとも apktool が単に APK の逆コンパイルに失敗したのかについては言及していません。後者の場合、私はzzosと呼ばれる「競合する」ツールを作成しました。

この形式に関心がある場合は、Android には複数の浮動小数点形式が含まれていることをご理解ください。浮動小数点は、IEEE 標準形式で保存されることもありますが、他のほぼ固定小数点形式で保存されることもあります。引用する「ダブル」の正確な意味は、それらがどこから取得され、どのようにエンコードされたかによって異なります。

それらを理解しようとする最も簡単な方法は、APK に対して「aapt d --values resources apkfile」を実行し、そこで値を検索することです。結果の関連部分をここに貼り付けていただければ、何が起こっているのかを正確に理解するのに役立ち、そこにエンコードされている適切な場所を示すことができます。

シャチャー

于 2012-07-08T19:52:40.003 に答える