1

そのため、DLLを挿入して(Detoursを使用して)別のアプリケーションを起動するアプリケーションがあります。エントリポイントはDllMainです。私はDllMainから多くを行うことができず、確かにループすることはできません。では、DLLモニター関数をx秒ごとに呼び出すにはどうすればよいですか?DllMainからスレッドを作成することはできません(少なくともそれが戻るまで)、そしてそれが私をクラッシュさせたので本当です。そこで、attach threadイベントで作成しようとしましたが、クラッシュしました。だから今私がやろうとしているのは、モジュールハンドルを取得できるように(迂回が失敗した場合に)それを再度注入することです。次に、スレッドを作成する初期化関数のアドレスを取得します。モジュールハンドルは正常に取得できますが、関数アドレスを取得できないと思います。関数を空にしましたが、それでもクラッシュしました。そのため、関数を呼び出すことすらできません。Visual Studioによると、読み取りアクセス権がありません。

それで、私は何をすると思いますか?アタッチされたプログラム(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);

関数StarterはexternCでエクスポートされ、正常に検査されているように見えます(序数1)。

何が間違っているのかわかりません。誰かがこのトピックを経験してクラッシュしたことを願っています。

DLLコードは次のとおりです。

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

//Hook.cpp
void Starter(void)
{

}

ありがとう

4

1 に答える 1

1

DLLが別のプロセスに挿入され、フッキングプロセスのアドレス空間で関数を実行しようとしているため、そのようにすることはできません。

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

ところで、技術的には、他のスレッドとの同期を行っていない限り、DllMain / DLL_PROCESS_ATTACHに新しいスレッドを作成できるはずですが、推奨されていません。ただし、DLLが挿入されているときにこれを行うと、どのような問題が発生する可能性があるのか​​わかりません。

于 2009-06-21T09:51:19.500 に答える