0

私は別のアプリケーション内に注入しましたが、この「ユーザー呼び出し」関数を呼び出したいと思っています。そこで、正しいレジスターにパラメーターを配置して関数を呼び出す単純な ASM ラッパーを作成しました。

これは、私の ASM バイトをアプリケーションに配置するための私のコードです。

ASMWrapper = Marshal.AllocCoTaskMem(asm.Length);
Marshal.Copy(asm, 0, ASMWrapper, asm.Length);

この後、この場所でデリゲートを登録するだけで、準備完了です。面白いことに、これはテストした 5 台のコンピューターのうち 4 台で動作し、最後にクリーンな Windows 7 Ultimate でフォーマットしてインストールしようとしたコンピューターで動作します。他のコンピューターと同じように。それでもうまくいきません。

私にできることはWriteProcessMemory、ASM コードを記述することだけです。これを行うと、元のコードがある場所にコードを配置できるため、機能します。

なぜこのように振る舞うか知っている人はいますか?AllocCoTaskMem手動で配置する場所を探すのではなく、自分の asm を配置する方法を使用することをお勧めします。

4

1 に答える 1

4

VirtualAlloc書き込みと実行の両方が可能なメモリ ブロックにほかならない、またはそれVirtualProtectを与えることはできません。使用する

VirtualAlloc(0, Size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);

使用するアロケータは、割り当てたメモリの実行を許可しません。

クラッシュは、システムと BIOS のデータ実行防止 (DEP) の設定、および CPU がそれをサポートしているかどうかに左右されます。しかし、普及型の DEP は、業界が目指す方向であり、うまくいく可能性があります。

于 2013-02-18T21:08:49.893 に答える