【问题标题】:Remote Process does not start远程进程未启动
【发布时间】:2014-12-04 16:42:29
【问题描述】:

我正在尝试从另一个程序调用一个进程,这个进程是我通过 DLL 注入的。第一个,我们加载的库“Client.dll”完美运行,这是由 DllMain (DLL_PROCESS_ATTACH) 中的 MessageBox Debug 播种的。

一旦 DLL 被加载到程序中,我尝试从 Client.dll 调用 MainThread 函数,但是使用相同的方法(复制、粘贴、编辑)不起作用。两个都贴在下面,谁能告诉我为什么?我已经从 MainThread 中删除了所有代码,但出于调试原因。

这里是主线程:

void MainThread(void * Arguments)
{
    MessageBoxA(NULL, "MainThread Started!", "bla", MB_OK); //Not Shown
    for (;;)
    {
         //This loop is here for the main program loop.
    }
    _endthread();
}

这是我加载 Client.dll 并尝试调用主线程的方式,请记住实际注入是有效的,但不是主线程的启动。

bool InjectDLL(DWORD ProcessID, const char* Path)
{
    HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
    if (!Handle)
    {
        std::cout << "Could not access process! Inject Failed!";
        return false;
    }

    LPVOID LoadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    LPVOID Allocate = VirtualAllocEx(Handle, NULL, strlen(Path), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL);

    HANDLE Thread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, Allocate, 0, NULL);
    WaitForSingleObject(Thread, INFINITE); // WAIT FOREVER!
    VirtualFreeEx(Handle, Thread, strlen(Path), MEM_RELEASE);

    //Start DLL Main Thread
    LPVOID MainThreadAddress = (LPVOID)GetProcAddress(GetModuleHandleA("Client.dll"), "MainThread");
    Allocate = VirtualAllocEx(Handle, NULL, 0, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL);

    HANDLE MainThread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)MainThreadAddress, Allocate, 0, NULL);
    WaitForSingleObject(MainThread, INFINITE); // Wait for Main Thread to start
    VirtualFreeEx(Handle, MainThread, strlen(Path), MEM_RELEASE);

    CloseHandle(MainThread);
    CloseHandle(Thread);
    CloseHandle(Handle);
    return true;
}

感谢任何可以提供帮助的人。

【问题讨论】:

    标签: c++ reverse-engineering dll-injection createremotethread


    【解决方案1】:

    我没有看到任何错误检查 - 特别是在您获取“MainThread”地址的情况下。这是成功了吗?

    为了使其工作,您需要通过 .DEF 文件或使用 __declspec( dllexport ) 从 DLL 中显式导出“MainThread”。有关详细信息,请参阅this SO link。

    【讨论】:

    • 这是问题所在,谢谢。虽然我现在已经导出了 MainThread 函数,并添加了检查以确保它获得了它仍然没有获得它的地址。我正在使用一个模块定义文件,它创建了一个 .lib。也许我需要包括这个?抱歉,我是新手,我也不想使用库来初始化一个函数。如果您有任何建议或信息可以帮助,请回复。不过谢谢。
    • 对您的 DLL 运行 dumpbin /exports - 这将为您提供所有导出函数的列表,包括任何类型的名称修改。此命令输出的名称将是您要在任何 GetProcAddress() 调用中指定的名称。您可以通过使用“C”链接定义导出的函数(例如 extern "C" void MainThread(){})来消除一些修改。
    • 谢谢,我花了一些时间才弄清楚。虽然我现在有,感谢您的指导。感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 2018-08-16
    • 1970-01-01
    • 2016-06-21
    • 2019-04-30
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多