首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的控制台在加载Dll时不出现?

为什么我的控制台在加载Dll时不出现?
EN

Stack Overflow用户
提问于 2022-07-08 00:19:58
回答 1查看 68关注 0票数 2

我有两个文件,用于将Dll加载到进程中的文件如下:

代码语言:javascript
运行
复制
#include <Windows.h>

int main()
{
    // path to our dll
    LPCSTR DllPath = any_path;

    // Open a handle to target process
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 26188);

    // Allocate memory for the dllpath in the target process
    // length of the path string + null terminator
    LPVOID pDllPath = VirtualAllocEx(hProcess, 0, strlen(DllPath) + 1,
        MEM_COMMIT, PAGE_READWRITE);

    // Write the path to the address of the memory we just allocated
    // in the target process
    WriteProcessMemory(hProcess, pDllPath, (LPVOID)DllPath,
        strlen(DllPath) + 1, 0);

    // Create a Remote Thread in the target process which
    // calls LoadLibraryA as our dllpath as an argument -> program loads our dll
    HANDLE hLoadThread = CreateRemoteThread(hProcess, 0, 0,
        (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("Kernel32.dll"),
            "LoadLibraryA"), pDllPath, 0, 0);

    // Wait for the execution of our loader thread to finish
    WaitForSingleObject(hLoadThread, INFINITE);

    // Free the memory allocated for our dll path
    VirtualFreeEx(hProcess, pDllPath, strlen(DllPath) + 1, MEM_RELEASE);

    return 0;
}

到目前为止,它工作正常,并将Dll加载到文件中,但是,Dll似乎无法工作:

代码语言:javascript
运行
复制
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <TlHelp32.h>

DWORD WINAPI HackThread(HMODULE hModule)
{
    //Create Console
    AllocConsole();
    FILE* f;
    freopen_s(&f, "CONOUT$", "w", stdout);

    std::cout << "ttt" << std::endl;
    std::cin.get();
    fclose(f);
    FreeConsole();
    FreeLibraryAndExitThread(hModule, 0);
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)HackThread, hModule, 0, nullptr);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

我知道Dll正在正确加载,因为进程碰到了'DLL_PROCESS_ATTACH‘情况,当我用消息框而不是CreateThread测试它时,它出现了,但是,我似乎无法让控制台显示出来。会有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-08 01:00:08

我看到的一个问题是,您的线程只将stdout重新映射到新控制台,但它也不是重新映射stdin。因此,很可能(使用调试器来验证这一点),std::cin.get()失败了,因此不会阻止线程在创建控制台后立即关闭它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72905471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档