2016-05-19 2 views
1

dexesファイルのendian_tagは実際にどのように機能しますか? Documentationは一定のENDIAN_CONSTANTは、それが見出される ファイルのエンディアンを示すために使用されるdexファイルのendian_tag

と述べています。標準の.dex形式は リトルエンディアンですが、実装はバイトスワップを実行することがあります。 インプリメンテーションはENDIAN_CONSTANTではなく REVERSE_ENDIAN_CONSTANTのendian_tagを持つヘッダーを参照すると、 というファイルが予期された形式からバイトスワップされていることがわかります。

REVERSE_ENDIAN_CONSTANTがある場合、ファイルはビッグエンディアンを使用すると考えられます。これは正しい?さらに、ファイルのどの部分がこのビッグエンディアンを使用することになっていますか?header_itemを含むファイル全体?

答えて

2

ビッグエンディアンフラグは、ファイル内の任意のマルチバイト値に適用されます。ファイルのバイトオーダーからホストのバイトオーダーにすべてのマルチバイト値を変換することを担当するDexSwapVerify sourceを見ることで、それが適用される正確なセットを見ることができます。これは、VMまたはツールの他の部分が値にアクセスするたびにスワップする必要がないように行われます。

ほとんどのAndroidデバイスはリトルエンディアンのARMまたはx86であるため、スワップ操作はno-opsです。一部のAndroid OS開発者は、初期にPPC Macを使用していましたが、一部のビッグエンディアンデバイス(MIPSなど)があるため、スワップコードが問題になります。それは逆のエンディアン定数をチェックしていない

if (pHeader->endianTag != kDexEndianConstant) { 
    ALOGE("Unexpected endian_tag: %#x", pHeader->endianTag); 
    return false; 
} 

注 - コードはビッグエンディアンDEXファイルを見つけることを期待していません。特に関心の

1行がこれです。 「生の」DEXファイルはリトルエンディアンでなければなりません。フォーマットはビッグエンディアンになる方法を提供しますが、私はほとんどのツールがそれらを脅かすと予想します。

最適化されたDEX(.odex)ファイルはホストバイトオーダーで保存されるため、.odexから読み取るときにバイトスワップステップはスキップされます。最適化されたDEXファイルは、生成されたシステムでのみ読み込まれることが期待されます。

+0

したがって、私はdexファイル***を1バイトずつ読みます*** ***ネイティブのdexファイルはリトルエンディアンなので、常に "78:56:34:12"になりますか?それは正しい? – Drecker

+0

これは「生の」DEXファイルに対する私の期待です。 – fadden

+0

@faddden - ありがとうございます:) – Drecker

関連する問題