2009-06-21 7 views
1

私はDLLを注入して別のアプリケーションを起動するアプリケーションを持っています(Detoursを使用)。エントリポイントはDllMainです。私はDllMainから多くを行うことはできませんし、確かにループすることはできません。だから私は毎秒私のDLLモニタ関数を呼び出すのですか? DllMainからスレッドを作成することはできません。だから私はスレッドのイベントを添付して作成しようとしたと私はクラッシュした。だから今私がやろうとしているのは、モジュールハンドルを得るために、再度注入することです(Detoursが失敗した場合)。次に、スレッドを作成する初期化関数のアドレスを取得します。私はモジュールをうまく処理するが、私は関数のアドレスを取得できるとは思わない。私はその機能を空にしたが、それでも私は墜落した。だから、それは関数を呼び出すまでは得られません。 Visual Studioには私には読み取りアクセス権がないと言われています。内部にDLLを注入してループしますか?

私は何をすると思われますか?あなたは、あなたが付属のプログラム(exe)を所有していないときにあなたのDLL機能をループするために何をしますか?

//Application.exe 
STARTUPINFO si = {sizeof(STARTUPINFO)}; 
     PROCESS_INFORMATION pi = {0}; 

     DetourCreateProcessWithDll(filename, NULL, NULL, NULL, TRUE, 
            CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, path, 
            &si, &pi, detoured, hook, NULL); 

     processID = pi.dwProcessId; 

     hDll = InjectDLL(processID, hook); 


if(hDll != NULL) 
{ 
STARTER Starter = (STARTER)GetProcAddress(hDll, "Starter"); 

if(Starter != NULL) 
    Starter(); 
} 

     ResumeThread(pi.hThread); 

ファンクションスターターはエクセルCでエクスポートされ、細かく検査されます(序数1です)。

私はおそらく何が間違っているのか分かりません。ただ、このトピックに関する経験があり、クラッシュすることを願っています。

ここでDLLのコードがあります:

//Hook.h 
extern "C" 
{ 
    void __declspec(dllexport) Starter(void); 
} 

//Hook.cpp 
void Starter(void) 
{ 

} 

おかげ

答えて

1

DLLを異なるプロセスに注入されていて、アドレスに関数を実行しようとしているので、あなたがそのように行うことができませんあなたのフックプロセスのスペース。

CreateRemoteThreadを呼び出して、GetProcAddressから取得したアドレスをlpStartAddressパラメータで渡します。これにより、リモートプロセス上に新しいスレッドが作成され、新しいスレッドのコンテキストでそのプロセスのアドレス空間で関数が実行されます。

技術的には、他のスレッドと同期していない限り、DllMain/DLL_PROCESS_ATTACHに新しいスレッドを作成することができるはずですが、お勧めしません。私はDLLが注入されているときにこれを行う場合にどのような問題が存在するのかわかりません。

関連する問題