为什么CreateRemoteThread导致注入目标崩溃

时间:2019-06-19 06:10:44

标签: visual-c++

于2019/6/19更新:

我的环境是win10,原因是这段代码在win10上不起作用?

来源:

我使用此代码仅将int foo() {return 0}注入目标进程。但这会导致目标进程崩溃。

整个vs解决方案在这里:https://github.com/huhuang03/test/tree/master/win/InjectHelloWorld。包括InjectMe和InjectByCode。

    char hand_asm[100] = {0xC3}; // 0xc3 is the retn assembly
    if (!WriteProcessMemory(h_target, targetFuncSpace, &hand_asm, CODE_SPACE_SIZE, NULL)) {
        showError(L"Cna't write targetFuncSpace");
        return EXIT_FAILURE;
    }

    InjectFuncParam param;
    LPVOID injectFuncParamSpace = VirtualAllocEx(h_target, NULL, sizeof(param), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (!injectFuncParamSpace) {
        showError(L"Can't alloc injectFuncParamSpace");
        return EXIT_FAILURE;
    }

    system("pause");
    DWORD remoteThreadId = 0;
    HANDLE h_remoteThread = CreateRemoteThread(h_target, NULL, 0, (LPTHREAD_START_ROUTINE)targetFuncSpace, injectFuncParamSpace, 0, &remoteThreadId);
    if (!h_remoteThread) {
        VirtualFreeEx(h_target, injectFuncParamSpace, 0, MEM_RELEASE);
        VirtualFreeEx(h_target, targetFuncSpace, 0, MEM_RELEASE);
        showError(L"Cant' create rmeote Thread");
        return EXIT_FAILURE;

这导致InjectMe崩溃,我找不到调试它的方法。

顺便说一句,我使用ollydbg在targetFuncSpace处设置了一个断点,但是ollydbg说这不是代码段...为什么,我不得不使用PAGE_EXECUTE_READWRITE来分配空间。

1 个答案:

答案 0 :(得分:0)

我看到的一个问题是,直到目标进程中的远程线程执行完毕,您才能使用VirtualFree targetFuncSpace。

WriteProcessMemory还从hand_asm复制CODE_SPACE_SIZE(4096)个字节,该字节只有100个字节。