gpt4 book ai didi

c++ - 调试 .DLL 注入(inject)问题 - 假定执行代码未被命中的断点

转载 作者:太空狗 更新时间:2023-10-29 23:12:38 25 4
gpt4 key购买 nike

我已经编写了一个程序(.DLL),它将被注入(inject)到 process.exe 中。

DLL注入(inject)器代码:

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;
}
}

要注入(inject)的.DLL的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;
}

主要内容:

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

要注入(inject)的 .DLL 在 vi​​sual studio 中编译时工作正常,但在 QT Creator 中编译时,vMain() 永远不会执行。注入(inject)器、.DLL 和目标进程都是 32 位的。因此,我尝试通过使用 CREATE_SUSPENDED 标志调用 .DLL 注入(inject)器调用 CreateRemoteThread() 来调试目标进程,这样我就可以在 LoadLibraryA 上设置断点(),恢复线程,从断点开始单步执行,查看返回值。但是,我在 LoadLibraryA() 上的断点没有被击中。

所以我调试了 .DLL 注入(inject)器应用程序以确保正在创建远程线程。我通过在 CreateRemoteThread() 的返回值上调用 GetThreadID(),输出它,并在目标进程的线程列表中查看该线程来确认它:

ThreadList

请记住线程仍处于挂起状态。经过进一步检查,EIP 指向 _RtlUserThreadStart() 中的第一条指令。我在这条指令上设置了一个断点。然后,我通过从我的 .DLL 注入(inject)程序调用 ResumeThread() 来恢复挂起的线程。断点没有命中。

值得注意的是,目标应用程序没有任何反断点机制,除此实异常(exception),断点对我来说工作正常。

那么我怎样才能弄清楚问题出在哪里呢?我的断点没有被击中是有原因的吗?有没有更好的方法来调试问题?

最佳答案

当从 DLL 内部执行控制台输出时,您可能需要将 stdout 重定向到控制台:

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

此外,在 DllMain() 中创建线程不是一个好主意,原因如下:

相关问题:

我记得我过去在使用它时遇到过一些麻烦,我不再按照建议在 DllMain() 中创建线程/窗口等操作。

尽管如此,在某些情况下它仍然有效,但我不相信它。

话虽如此,如果以上方法不起作用,请尝试在没有线程的情况下直接调用您的 vMain(),看看会发生什么。

关于c++ - 调试 .DLL 注入(inject)问题 - 假定执行代码未被命中的断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44916346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com