0

マイクロソフトの迂回路を使用して基本的なフックを取得しようとしています。私のプログラムはCreateProcessWithDllExを正常に実行し、dllを挿入することができます。しかし、実際のフックされたプログラムを再開することはできないようです。テストにメモ帳を使用していて、プロセスリストでnotepad.exeが実行されているのを確認できますが、メモ帳ウィンドウが実際に表示されることはありません。

私のdllは次のとおりです。

#undef UNICODE
#include <cstdio>
#include <windows.h>
#include <detours.h>
#pragma comment(lib, "detours.lib")

typedef void (WINAPI *pFunc)(void);
DWORD WINAPI MyFunc(void);

pFunc FuncToDetour = (pFunc)DetourFindFunction("Winmm.dll", "timeGetTime"); //Set it at address to detour in 
//the process

extern "C" __declspec( dllexport )VOID NullExport( VOID )
{
}

INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
  switch(Reason)
  {
    case DLL_PROCESS_ATTACH:
    {
        DisableThreadLibraryCalls(hDLL);
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        //DetourAttach(&(PVOID&)FuncToDetour, MyFunc);
        //DetourTransactionCommit();
    }
    break;
    case DLL_PROCESS_DETACH:
          DetourTransactionBegin();
          DetourUpdateThread(GetCurrentThread());
          DetourDetach(&(PVOID&)FuncToDetour, MyFunc);
          DetourTransactionCommit();
    break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH: 
    break;
  }
  return TRUE;
}
DWORD WINAPI MyFunc()
{
   return 0;
}

そして私のインジェクターは次のとおりです:

#undef _UNICODE
#include "stdafx.h"
#include <cstdio>
#include <windows.h>
#include <detours.h>

int main()
{
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   ZeroMemory(&si, sizeof(STARTUPINFO));
   ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
   si.cb = sizeof(STARTUPINFO);

   WCHAR DirPath[MAX_PATH+1];
   wcscpy_s(DirPath, MAX_PATH, L"C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2010\\Projects\\hbotinjector\\Release");

   char DLLPath[MAX_PATH+1] = "C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2010\\Projects\\hbotinjector\\Release\\hbotdll.dll";

   WCHAR EXE[MAX_PATH+1]={0};
   wcscpy_s( EXE, MAX_PATH, L"C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2010\\Projects\\hbotinjector\\Release\\notepad.exe" ); 

   STARTUPINFO _StartupInfo;
   PROCESS_INFORMATION _Information;
   ZeroMemory( &_Information, sizeof( PROCESS_INFORMATION ) );  

   if(DetourCreateProcessWithDllEx( EXE, NULL, NULL, NULL, TRUE, 
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, DirPath, &_StartupInfo, &_Information,
     DLLPath, NULL ))
     {
          MessageBoxA(NULL,"INJECTED", NULL, NULL);
          ResumeThread(_Information.hThread);
          WaitForSingleObject(_Information.hProcess, INFINITE);
     }
     else
     {
          char error[100];
          sprintf(error, "%d", GetLastError());
          MessageBoxA(NULL, error, NULL, NULL);
     }

     return 0;
 }

そして、.defファイルを使用してdllをビルドし、迂回が正しく機能するために序数1に必要な関数があることを確認します。

LIBRARY HBOTDLL
EXPORTS

NullExport @1

プロセスが実行されない原因を誰かが知っていますか?ちなみに、私は空白のdllでも試してみましたが、序数1で必要な関数が含まれているだけで、他には何も含まれておらず、同じ結果になるようです。

また、notepad.exeプロセスがプロセスリストに表示されている限り、インジェクターは永久に実行されます。これは、プロセスが正しく生成されたことを示しているように見えるWaitForSingleObjectへの応答です。

4

1 に答える 1

0

Hans Passantのコメントで、私は戻って、piとsi、および_Informationと_StartupInfoを宣言したことに気付きました。私が作成した2番目のグループをゼロにするのではなく、それが私が使用していたグループでした。そこで、CreateProcessWithDllExの呼び出しを変更して、&piと&siを使用しました。これですべてが正常に機能します。

于 2012-07-22T20:21:07.110 に答える