50

Dalvik VM、dex、Smali について少し学習します。

私は smali について読んだことがありますが、コンパイラのチェーンのどこに位置するのかまだ明確に理解できません。そして、その目的は何ですか。
ここでいくつかの質問:

  1. 私が知っているように、他の仮想マシンと同様に dalvik はバイトコードを実行しますが、Android の場合は dex バイト コードです。
  2. スマリとは?Android OS または Dalvik Vm は直接動作しますか、それとも同じ dex バイトコードですが、人間にとってより読みやすいですか?
  3. Windows用の逆アセンブラ(OllyDbgなど)プログラムの実行可能ファイルは、さまざまなマシンコード( D3 、 5F など)で構成され、各マシンコードに適切なアセンブリコマンドがありますが、Dalvik Vmもソフトウェアであるため、smaliはバイトコードの読み取り可能な表現です
  4. 新しいART環境があります。まだバイトコードを使用していますか、それともネイティブ コードを直接実行しますか?

前もって感謝します。

4

2 に答える 2

1

高水準言語プログラミングには、プログラミングを容易にし、プログラマーの時間を節約するための追加ツールが含まれています。プログラムをコンパイルした後、逆コンパイルする場合、元のソース コードに戻るには、プログラム コードの構造とフローを決定するために、多くのコード分析が必要になります。次に、逆コンパイラは、コードをコンパイルしたコンパイラの機能、バージョンまたはコンパイラ、およびコンパイルされたオペレーティングシステムに基づいてソースを構造化する必要があります。OS 固有の機能、フレームワーク、パーサー、または外部ライブラリ (.net や dome.dll など) とそれらのバージョンなどが関係していた場合

次善の策は、ソース コードが 1 つの大きなファイルに記述されているかのように、プログラム フロー全体を出力することです。個別のオブジェクト、ライブラリ、依存関係、継承、クラス、API はありません。これは、他のファイル/依存関係のソースコードと構造にアクセスできないため、コンパイル時にエラーが発生するコードを逆コンパイラが吐き出す場所です。こちらの例を参照してください

3番目の最良のオプションは、プログラムされた命令に基づいてオペレーティングシステムが実行していることに従うことです。これは、マシンコードまたはdex(Androidの場合)です。Morpheus が指揮する Nebuchadnezzar に座っていて、プロセッサが実行しているアーキテクチャの命令セット内のすべてのオペコードをデコードする時間がない場合を除き、監視中に画面上をスクロールする Unicode 文字よりも読みやすいものが必要になるでしょう。プログラムの流れ/実行。 モニターに表示されたマシンコードの実行 ここで、アセンブリ コードが違いを生みます。これは、機械コードを人間が読める形式にほぼ直接翻訳したものです。マイクロプロセッサには、マイクロコード、パイプライン用のマルチスレッダー、ハードウェアアクセラレータなどのヘルパーがあり、ユーザーエクスペリエンスを向上させるため、「ほぼ」直接と言います。

ソース コードがある場合、コードが記述されている言語で編集することになります。同様に、ソース コードがなく、コンパイルされたアプリを編集している場合でも、コードが記述されている言語で編集することになります。この場合、それはマシン コード、または次善の策: smaliです。

これは、「Dalvik VM、dex、および Smali」と「コンパイラのチェーンにおけるその位置」を示す図です。 Java の dex

于 2021-08-29T17:07:07.590 に答える