2012-03-07 7 views
5

64ビットプロセスに64ビットDLLを挿入しようとしています。
私はRemote-thread \ Window Hooksの手法を試しましたが、いくつかのアンチウィルスは私のローダーを偽陽性として検出します。
この記事を読んだ後:Dll Injection by Darawk、私はコード洞窟を使用することに決めました。
これは32ビットではうまくいきましたが、VSが64ビットのインラインアセンブリをサポートしていないため、オペコードとオペランドを明示的に記述しなければなりませんでした。
私はこの記事を見て:64Bit injection using code cave、記事の状態として、いくつかの違いがあります。コード洞窟を使用して64ビットDLLを注入

ここに組み込まれなければならなかったいくつかの違いがあります。

  1. がMASM64はfastcallを使用するため、関数の引数は レジスタに渡され、スタックには渡されません。
  2. アドレスの長さ(32ビットvs. 64ビット)を考慮する必要があります。
  3. MASM64には、 がスタック上のすべてのレジスタを(32ビットのpushadのように)プッシュしないので、すべてのレジスタを明示的にプッシュして を実行する必要があります。

私は、これらのガイドラインに従い、記事の例が、私が働いたかのどれを実行しました。
私はメインスレッドを再開した瞬間にターゲットプロセスがクラッシュしましたが、ollydbgには64ビットのサポートがないため、実際に調べる方法はわかりません。

これは私がそれを注入された前のコードがどのように見えるかです:

codeToInject: 
000000013FACD000 push  7741933Ah 
000000013FACD005 pushfq 
000000013FACD006 push  rax 
000000013FACD007 push  rcx 
000000013FACD008 push  rdx 
000000013FACD009 push  rbx 
000000013FACD00A push  rbp 
000000013FACD00B push  rsi 
000000013FACD00C push  rdi 
000000013FACD00D push  r8 
000000013FACD00F push  r9 
000000013FACD011 push  r10 
000000013FACD013 push  r11 
000000013FACD015 push  r12 
000000013FACD017 push  r13 
000000013FACD019 push  r14 
000000013FACD01B push  r15 
000000013FACD01D mov   rcx,2CA0000h 
000000013FACD027 mov   rax,76E36F80h 
000000013FACD031 call  rax 
000000013FACD033 pop   r15 
000000013FACD035 pop   r14 
000000013FACD037 pop   r13 
000000013FACD039 pop   r12 
000000013FACD03B pop   r11 
000000013FACD03D pop   r10 
000000013FACD03F pop   r9 
000000013FACD041 pop   r8 
000000013FACD043 pop   rdi 
000000013FACD044 pop   rsi 
000000013FACD045 pop   rbp 
000000013FACD046 pop   rbx 
000000013FACD047 pop   rdx 
000000013FACD048 pop   rcx 
000000013FACD049 pop   rax 
000000013FACD04A popfq 
000000013FACD04B ret 

は私には罰金だが、私は、私は何かが欠けてると思います。
完全なコードはここにあります:Source code

どのようなアイデアですか?

+1

WinDbgをデバッグに使用すると何が問題になりますか?それはネイティブなx64プロセスをうまくサポートしており、OllyDbgよりはるかに安定していて信頼性が高いとわかります。 – RaptorFactor

+0

64ビットプロセスから注入していますか?もしそうでなければ、 'LoadLibrary'のアドレスを使うことはできません。 – pezcode

+2

また、 'LoadLibrary'を呼び出すと、スタックが16バイトに整列していることを確認してください。 – pezcode

答えて

1

明らかに、主な問題は、EXECUTE_PAGE_READWRITE権限のないコード洞窟データを割り当てたため、データのチャンクがデータとして扱われ、オペコードとして扱われないことでした。

+0

Omer、修正は正確に何でしたか?私は97行目のコード洞窟割り当てにPAGE_EXECUTE_READWRITEフラグを追加してコードを再利用しようとしましたが、クラッシュは私のために残っていました。あなたの最終的なコードを共有できますか? – zah

+2

Nevermindは、すべてのpezcodeの提案を適用して修正しました:http://pastebin.com/34xCSrL2 – zah

3

戻り値を格納する最初のプッシュでは、32ビットの値だけがプッシュされます。コード内のdwOldIPDWORDで、それはDWORD64である必要があります。 )

LoadLibraryへのコールを入力すると、スタックが16バイトに整列されていることを確認してください。スタックが正しく整列されていない場合、一部のAPIは例外をスローします。

+0

スタックアライメントの意味は、RSPは16の倍数でなければなりません。適切なスタックフレームを設定することによって、 – pezcode

+0

私が奇妙に思ったのは、作者がIPの下位DWORDだけを選んだ理由です。私はそれを修正しようとしました。私は非常に錆びています@ ASMので、私は何が正しいか分かりません。私は2つのX DWORDプレースホルダをプッシュし、RIPレジスタ全体をコピーしましたが、それでもクラッシュします。コールの前にスタックアラインメントコードがあるかどうか調べましたが、何もありません。他の考え?ありがとう – Omer

+0

'mov rax、old_eip;を使うこともできます。プッシュレックス '、おそらくあなたは何とか2つの部分に正しくコピーされていません。正直なところ、あなたのコードをデバッグしてください。私たちはあなたの問題が何であるかを推測することができます。 – pezcode

関連する問題