仮想マシンの概要 いわゆる仮想マシン保護技術とは、コードを機械や人間が認識できない疑似コード バイト ストリームの文字列に変換することを指します。具体的な実行時には、これらの疑似コードが一つずつ翻訳・解釈され、徐々に元のコードに復元されて実行されます。 疑似コードを変換し、特定の実行を担当するこのサブルーチンは、仮想マシン VM (抽象 CPU のような) と呼ばれます。これは関数の形で存在し、関数のパラメータはバイトコードのメモリ アドレスです。 現在、ビジネスに仮想マシンを適用する保護シェルは、Vmprotect、themida、execrypt の 3 つです。 仮想マシンアーキテクチャ コード内の指示は多様であり、その構成形式も常に変化していることがわかっています。仮想マシンがあらゆる特定の状況を翻訳して処理することは不可能です。考えられるすべての命令は、まず抽象的に分類され、次にいくつかの単純な小さな命令に分割され、その後、処理のためにさまざまな特殊なサブルーチン (ハンドラー) に渡される必要があります。 コンパイラ理論を学んだ学生なら、3 進コード (3 アドレス コードとも呼ばれる) について知っているはずです。つまり、割り当て式がどんなに複雑であっても、いくつかの 3 アドレス コード シーケンスに分解できます。 (3 アドレス コードとは何ですか? 3 アドレス コードは、バイナリ演算、比較、分岐ジャンプ演算など、1 つの演算のみを完了します。) 同様に、命令がいかに複雑であっても、分割できないアトミック命令のシーケンスに分解できます。 仮想マシン (CPU) のアーキテクチャは、スタック ベース、レジスタ ベース、3 アドレス マシンの 3 つのタイプに分けられます。ここでは、スタックベースの仮想マシン アーキテクチャ (スタック ベース) についてのみ説明します。このアーキテクチャの仮想マシンはスタックを頻繁に操作する必要があり、使用する仮想レジスタ (仮想 eax、ebx など) はスタックに保存されます。各アトミック命令のハンドラーはプッシュとポップを行う必要があります。 今日の CPU には多数のレジスタがあり、スタックは一般的に関数にパラメータを渡すときにのみ使用されます (PC で使用される x86 シリーズ CPU など)。しかし、スタックやレジスタを持たず、メモリのみで動作する CPU もいくつかあります。このタイプの CPU を使用するマシンは 3 アドレス マシンと呼ばれます。 スタックベースの CPU または仮想マシンには、一時変数やレジスタの概念はありません。すべてがスタックに置かれます。命令内でオペランドを指定する必要がないため、レジスタベースの命令よりも命令が短くなります。そのため、比較的シンプルで、組み込みシステムで広く使用されています。コードを保護するためにもこれを選択します。 たとえば、add 命令の場合、スタックベースの CPU は最初にスタックから 2 つの数値をポップし、次に 2 つの数値を加算して、その合計をスタックにプッシュします。 Add 命令は 1 バイトのみを占有します。レジスタベースの CPU の場合、対応する命令は add Reg1, Reg2 であり、3 バイトが必要です。レジスタのない CPU の命令がどのようなものになるか、またどれほど簡潔になるかをよく想像してください。もちろん、簡潔な指示の欠点は効率が低いことです。 ここで説明する仮想マシン保護テクノロジは、レジスタベースの CPU コードをスタックベースの CPU 疑似コードに変換することです。その後、疑似コードはスタックベースの仮想マシン (CPU) によって解釈され、実行されます。 コマンドシステム 鍵となるのは、仮想スタックベースの仮想マシン (CPU) 命令システムを設計することです。命令システムが単純で再利用性が高いほど、優れています。 add 命令を例に挙げてみましょう。 X86 シリーズ CPU の add 命令には、add reg,imm、add reg,reg、add reg,mem、add mem,reg など、さまざまな形式があります。スタックベースの仮想マシン CPU には、それほど多くのトリックはありません。加算命令は 1 つだけであり、パラメーターと戻り値はすべてスタック内にあります。 仮想マシンの CPU シミュレーションには、次のような追加コマンドを実装する必要があります。 元の add コマンド パラメータを push コマンドに変換する必要があります。プッシュ オブジェクトに応じて、異なる実装が必要になります。 Push コマンドがあり、Pop コマンドも必要です。 スタックベースの仮想マシン命令システムは、1 バイトのアクション命令 (add、dec など) と、push、pop などのさまざまなスタック操作命令というシンプルなものです。複雑なレジスタやメモリの操作はありません。 x86 CPU 命令を仮想マシン CPU 命令に変換する必要があります。例: Call 命令は、Call 関数が仮想マシンの疑似コードではない可能性があるため、比較的面倒です。したがって、Call 命令に遭遇すると、仮想マシンを終了し、処理を実際の CPU に引き渡す必要があります。コードは次のようになります。 さらに、フラグ、非シミュレート命令、命令の最適化の処理にも注意を払う必要があります。例外処理もありますが、ここでは詳しく説明しません。 VStartVM は仮想マシンのエントリ ポイントであり、動作環境 (各レジスタの値) の保存とスタックの初期化 (仮想マシンが使用するすべての変数がスタック内にある) を担当します。 バイトコードは疑似コードです。 VMDispatcher は疑似コードを 1 つずつ読み取って処理し、次のサブルーチン (Handler) に配布します。 パッカーはまず既知の X86 命令をバイトコードに解釈し、それを PE ファイルに格納し、元のコードを削除して同様のコードに置き換え、仮想マシン実行ループに入ります。 VStartVM が初期化された後、スタックは次のようになります。 edi は VMcontext を指します。 esi は疑似コードのアドレスを指します。 ebp は実際のスタックの先頭を指します。これら 3 つのレジスタは VM 内で変更しないでください。 VMContext は、仮想マシン VM によって使用される仮想環境構造です。 VM がスタックを使用して独自のレジスタ構造を保存する理由は、マルチスレッド プログラムの互換性を考慮するためです。 開梱時のスタックバランスの原則は誰もが知っています。同様に、仮想マシンが変換されたプログラム コードを実行する場合、元のスタック アドレスを任意に変更することはできません。また、スタック内の VMcontext 構造がフラッシュされていないことを頻繁に確認する必要があります。 |
<<: Ready Player Oneの開発元であるDirective GamesはAWS上で稼働しています
私はいわゆるウェブサイトSEO担当者です。私の日々の仕事は、外部リンクの投稿、フレンドリーリンクの作...
ビリビリの若々しい場所では、10代の若者たちが成長し、父親や妻になるなど、社会の主流に入り、役割を果...
最近、テレビシリーズ「お父さん、どこへ行くの?」で全国的に有名になった林志瑩は、すぐに独自の健康飲料...
【はじめに】垂直電子商取引は100メートル短距離走というよりマラソンのようなもので、規模を追求するゲ...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス時代と中国経済の継続的な...
企業はコンプライアンスを達成できますが、業界の変化、ビジネスの成長、規制の変更のペースを考えると、コ...
現在、SEOを行う人の90%は、最適化のメインワードに重点を置いています。ウェブサイト最適化のターゲ...
8月23日、IBM 2011 Cloud Computing Summitが上海で開催されました。こ...
4月2日の午後、クラウドコンピューティングは間違いなく現在のインターネット業界でホットな話題と見なさ...
私がウェブマスターになってからちょうど5年が経ちました。この5年間、ウェブサイトを運営する上で多くの...
多くの電子商取引サイトは資金繰りが悪化し、上場の見込みがなくなったため、「資金繰りを厳しくする」必要...
「海賊版を拒否し、オリジナル性を守る」というのは、私たちが生活の中でよく耳にする言葉ですが、それを実...
[[258103]]テンセントテクノロジーニュース:フォーブスの寄稿者であるスティーブ・ウィルクス氏...
多くの企業は、コンピューティング能力をデータ ソースやエンド ユーザーの近くに配置できるため、エッジ...
アクティビティはローカル ウェブサイトの成長の核心です。インターネットの継続的な発展に伴い、ネットユ...