ストリームの手動クローニング。 アセンブラー+ C#= Loveの場合

ポイントに直行します。 タスク:コードの任意の時点で、specを呼び出します。 メソッドを呼び出して、親スレッドでこのメソッドの呼び出しポイントから実行を開始し、デバッグ機能とメソッド呼び出しのすべてのレベルですべてのローカル変数の値を保持します。

実装は、最終プラットフォーム(.Net / Java)から独立しています。 C ++ / Asmで書かれていますが、ユーザーコードはC#で作成されています 私はそれに書きます。

画像

勇気を得て、ようやく32ビットシステムの例を安定させたので、完全に準備が整ったとして公開する準備ができました。 そして、はい、繰り返します:適応中はどのプラットフォームでも動作します




目標


この作業の目的は、オペレーティングシステムによって提供されないスレッドに関連する機能を構築することです。 たとえば、Linux Fork()メソッドを使用しましたが、これはWindows OSの現実に合わせて修正されました。

そのため、Originメソッドがあり、その内部でFork.CloneThread()メソッドが呼び出されると、実行の2番目のスレッドが表示されます。その開始はFork.CloneThread()メソッドの呼び出しポイントに等しく、メソッドの終了時に実行は終了します元のスレッドのローカル変数のすべての値が2番目の実行スレッドに保存されるような方法でオリジナル。 つまり、CloneThread()を呼び出して、現在のスレッドを2つに分割します。

読者から求められるもの



準備のための材料:


フロークローニング


最初は何がありますか? ストリームがあります。 また、そこでコードを実行して、新しいスレッドを作成したり、スレッドプールでタスクをスケジュールしたりすることもできます。 また、ネストされた呼び出しに関する情報は呼び出しスタックに格納され、必要に応じて操作できることも理解しています(たとえば、C ++ / CLIを使用)。 さらに、規則に従って、スタックの最上部にあるEBPレジスタの値、ret命令の戻りアドレスを入力し、ローカル命令にスペースを割り当てると(必要な場合)、この方法でメソッド呼び出しをシミュレートできます。
フローを複製するには何をしなければなりませんか?

どうして


これが行われる最も重要なことは、すべてがどのように機能するか、そしてもしあなたが知っていればそれを操作し始めることができるかについての理解を強化することです。

資源


Source: https://habr.com/ru/post/J238947/


All Articles