2017-07-05 11 views
3

process.exeに注入するプログラム(.DLL)を作成しました。デバッグ.DLL注入の問題 - 想定していないコードを実行していると思われるブレークポイント

DLLインジェクタコード:注入される.DLLの

Bool InjectDll(DWORD pID, const char* dllPath) { 
    Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); 
    if (!Proc) 
    { 
     return false; 
    } 
    void* LoadLibAddr = (void*)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); 
    void* RemoteString = (void*)VirtualAllocEx(Proc, NULL, strlen(dllPath), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
    WriteProcessMemory(Proc, (LPVOID)RemoteString, dllPath, strlen(dllPath), NULL); 
    HANDLE ret = CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, (LPVOID)RemoteString, CREATE_SUSPENDED, NULL); 
    if (ret) { 
     return true; 
    } 
} 

のDllMain()関数:

#include <Windows.h> 

extern void vMain(); 

BOOL APIENTRY DllMain(HMODULE hModule, 
    DWORD ul_reason_for_call, 
    LPVOID lpReserved 
    ) 
{ 
    switch (ul_reason_for_call) { 
    case DLL_PROCESS_ATTACH: 
     CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&vMain, 0, 0, 0); 
     return true; 
    } 
    return false; 
} 

VMAIN:

void vMain() { 
    CreateConsole();   
    std::cout << "vMain() has executed!\n"; 
} 

注入する.DLLが正常に動作しVisual StudioでコンパイルするとQT CreatorでコンパイルするとvMain()は決して実行されません。インジェクタ、.DLL、ターゲットプロセスはすべて32ビットです。だから私はにブレークポイントを設定し、スレッドを再開し、ブレークポイントからの実行をステップ実行し、戻り値を表示するように、CREATE_SUSPENDEDフラグで.DLLインジェクタコールCreateRemoteThread()を呼び出すことによってターゲットプロセスをデバッグしようとしました。しかし、LoadLibraryA()の私のブレークポイントはヒットしていません。

私はリモートスレッドが作成されていることを確認するために.DLLインジェクタアプリケーションをデバッグしました。

ThreadList

はスレッドがまだ中断される点に注意してください。私はそれは、CreateRemoteThread()の戻り値にGetThreadID()を呼び出し、それを出力し、ターゲットプロセスのスレッドリストでそのスレッドを表示していることを確認しました。さらに検査すると、EIPは_RtlUserThreadStart()の最初の指示を指し示します。私はこの命令にブレークポイントを設定しました。その後、私の.DLLインジェクタプログラムからResumeThread()を呼び出して、中断されたスレッドを再開します。ブレークポイントはヒットしません。

ターゲットアプリケーションにはアンチブレイクポイント機構がないことに注目してください。ブレークポイントは、このインスタンスを除いて私にとってうまくいきました。

どのようにして問題を把握できますか?ブレークポイントがヒットしない理由はありますか?問題をデバッグするより良い方法はありますか?

+0

'dllPath'はフルパスですか?そうでない場合は、Qt Creatorから実行したときに到達できることを確認していますか? – Bogdan

答えて

0

DLL内からのコンソール出力をやって、あなたはコンソールにstdoutをリダイレクトする必要があります。

// AllocConsole() instead of CreateConsole() 
AllocConsole(); 
freopen("CONOUT$", "w", stdout); // <==== 
std::cout << "vMain() has executed!\n"; 

さらに、それはDllMain()内部のスレッドを作成するのは良い考えではありませんし、ここにある理由:

関連質問:私は、私は過去にそれでいくつかの問題を持っていたし、推奨されているように、私は、DllMain()内部スレッド/ウィンドウを作成するようなことをやって停止した覚え

まだ動作する場合がありますが、私はそれを信用しません。

これはうまくいかない場合は、vMain()にスレッドなしで直接電話して何が起こるかを確認してください。

関連する問題