V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
GeekHub
hkitdog
V2EX  ›  问与答

远程注入 DLL 成功后,有些程序没有运行 DLL

  •  
  •   hkitdog · 315 天前 via iPhone · 634 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。
    参考了 Window 核心编程里的远程注入 DLL。远程注入 DLL 成功后,某些程序没有运行 DLL,有些程序正常执行了 DLL,这是什么原因?
    DLL 里只是简单的调用了下 messagebox
    代码如下:
    BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile)
    {
    //如果函数执行失败
    BOOL bOk = FALSE;
    HANDLE hProcess = NULL, hThread = NULL;
    PWSTR pszLibFileRemote = NULL;

    __try
    {
    hProcess = OpenProcess(
    PROCESS_QUERY_INFORMATION |
    PROCESS_CREATE_THREAD | //用于创建远程线程
    PROCESS_VM_OPERATION | //用于 virtualAllocEx/VirtualFreeEx
    PROCESS_VM_WRITE, //用于写入进程内存
    FALSE, dwProcessId);
    if (hProcess == NULL)
    __leave;

    //计算 DLL 路径名所需的字节数
    int cch = 1 + lstrlenW(pszLibFile);
    int cb = cch * sizeof(wchar_t);

    //在远程进程中为路径名分配空间
    pszLibFileRemote = (PWSTR)
    VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
    if (pszLibFileRemote == NULL)
    __leave;

    //复制 DLL 路径到远程进程地址空间
    if (!WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID)pszLibFile, cb, NULL))
    __leave;

    //获取在 Kernel32 中 loadlibraryW 的真实地址
    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
    GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryW");

    if (pfnThreadRtn == NULL)
    __leave;

    //创建远程线程并调用 LoadLibraryW(DLLPathname)
    hThread = CreateRemoteThread(hProcess, NULL, 0,
    pfnThreadRtn, pszLibFileRemote, 0, NULL);
    if (hThread == NULL)
    __leave;

    WaitForSingleObject(hThread, INFINITE);
    bOk = TRUE;
    }
    __finally
    {
    if (pszLibFileRemote != NULL)
    VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    if (hThread != NULL)
    CloseHandle(hThread);
    if (hProcess != NULL)
    CloseHandle(hProcess);
    }

    return bOk;
    }
    hehe12dyo
        1
    hehe12dyo   315 天前
    中华人民共和国刑法
    after1990s
        2
    after1990s   315 天前 via Android
    这种问题应该打 log,检查调用出错 API 的错误码。再根据错误码分析。
    hkitdog
        3
    hkitdog   315 天前 via iPhone
    @hehe12dyo 老哥,我良好市民
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2304 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:51 · PVG 13:51 · LAX 22:51 · JFK 01:51
    ♥ Do have faith in what you're doing.