2

x86 dll インジェクターに取り組んでおり、x86 コードを x64 プロセス スレッドに挿入して実行したいと考えています。まず、x64 プロセスでのCreateRemoteThreadの呼び出しに失敗し、エラー コード 5 が発生しました。次に、このトリックを見つけ、それを使用してリモート スレッドを作成することができました。しかし、ResumeThreadを実行して x64 プロセス内でその x86 コードを実行しようとすると、プロセス全体がクラッシュします。

x86 から x86 への注入はうまく機能しますが、問題は x86 から x64 のみです。

だから、私の質問は - x64 プロセス内でコピーされた x86 コードをエミュレートして実行することは何とか可能ですか? これを行う 1 つの方法は、同じコードの 2 つのバージョンを用意し、リモート プロセスのアーキテクチャに応じて 1 つを選択することですが、これが最善の方法だとは思いません。

ありがとう。

4

3 に答える 3

5

セグメント セレクターはビット数を決定するため、適切なセグメント セレクターを使用して「何らかの形で遠くにジャンプする」だけです。64ビットでは、それを行う方法はそれほど多くありません。retfまだ動作します。

テストされていませんが、要点はわかります:

sub rsp, 8
mov dword [rsp+4], 0x23   // 32 bit segment selector
mov dword [rsp], offset some32bitcode
retf

これで、32 ビット モードになりました。おそらく大きな破損を引き起こすでしょう (特に、Windows 関数を呼び出そうとした場合)。

少し簡単に元に戻すことができます:

jmp far 33h:some64bitcode // 64 bit segment selector

ダイレクトファージャンプは、64 ビットモードではエンコードできません。間接ファー ジャンプ/ファー コールはまだ存在し、ファー リターンも明らかに間接的です。

23h と 33h はウィンドウの値です。他のオペレーティング システムでは異なる場合があります (おそらく異なる)。

もちろん、それでも 64 ビット プロセスを別の方法で処理する必要があります。

于 2012-07-27T21:08:27.450 に答える
3

x64 プロセス内で x86 コードを実行することはできません。限目。OSは単にそれを許可しません。x86 コードを x86 プロセスに挿入することと、x64 コードを x64 プロセスに挿入することしかできません。

于 2012-07-27T19:48:22.980 に答える
-1

これがうまくいくかどうかは本当に疑問です。AMD64 アーキテクチャでは、REX プレフィックスに置き換えるためにオペコードINCとオペコードがすべて破棄されましたが、命令自体は 2 バイトの同等のものに置き換えられたことを思い出してください。DECつまり、x86 コードに 1 バイトとしてエンコードされたINCまたはが含まれている場合DEC、CPU は x64 で作業するときにそれを REX プレフィックスとして扱い、命令ストリームの次のバイトを通常の命令としてデコードしようとします。命令が不合理なものとしてデコードされるため、一般的な保護違反または同様のものが確実に発生します。

これが例です。次のコード (NASM) を使用して、ループ内の配列にアクセスしたいとしましょう。

bits 32
mov ecx, 200
myloop:
 dec ecx
 mov eax, [myarray+ecx*4+0x100]
 jnz myloop
myarray resb 10

これをフラット バイナリとしてコンパイルし、64 ビット コードとして逆アセンブルすると、次のようになりndisasmます。

00000000  B9C8000000        mov ecx,0xc8
00000005  498B048D0F010000  mov rax,[rcx*4+0x10f]
0000000D  75F6              jnz 0x5

ご覧のとおり、「ループ」は実際にはもうループではありません。これは、そのカウンターがデクリメントされることはなく、最後にゼロ フラグを変更した命令に従ってジャンプが行われるためです。これは、命令デコーダが 32 ビット モードと 64 ビット モードで大きく異なる動作をすることを明確に示しており、64 ビット モードで実行している場合、32 ビットとしてアセンブルされたコードを実行することは効果的に無効になっています。

于 2012-07-27T21:43:11.763 に答える