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インジェクタアプリケーションをデバッグしました。
はスレッドがまだ中断される点に注意してください。私はそれは、CreateRemoteThread()
の戻り値にGetThreadID()
を呼び出し、それを出力し、ターゲットプロセスのスレッドリストでそのスレッドを表示していることを確認しました。さらに検査すると、EIPは_RtlUserThreadStart()
の最初の指示を指し示します。私はこの命令にブレークポイントを設定しました。その後、私の.DLLインジェクタプログラムからResumeThread()
を呼び出して、中断されたスレッドを再開します。ブレークポイントはヒットしません。
ターゲットアプリケーションにはアンチブレイクポイント機構がないことに注目してください。ブレークポイントは、このインスタンスを除いて私にとってうまくいきました。
どのようにして問題を把握できますか?ブレークポイントがヒットしない理由はありますか?問題をデバッグするより良い方法はありますか?
'dllPath'はフルパスですか?そうでない場合は、Qt Creatorから実行したときに到達できることを確認していますか? – Bogdan