注入 dll 在 Windows XP 上不起作用

Posted

技术标签:

【中文标题】注入 dll 在 Windows XP 上不起作用【英文标题】:injecting a dll is not working on windows XP 【发布时间】:2012-07-12 03:51:24 【问题描述】:

所以我正在尝试制作一个注入器来注入我的 dll,它使用 Detours 挂钩游戏客户端,这很简单,但是有一个问题我不知道出了什么问题,它在 Windows Vista+ 上可以正常工作但不是在 XP 上工作...这是我的代码

//the injector
#ifndef INJECTOR_H_INCLUDED
#define INJECTOR_H_INCLUDED

#include <windows.h>
class Injector

private:
    STARTUPINFOA *Startup;
    PROCESS_INFORMATION *Process;
    char *Directory;

    BOOL Start(char *Application);
public:
    Injector(char *Directory);
    ~Injector(void);

    BOOL Attach(char *Application, char *Dll);
;

#endif // INJECTOR_H_INCLUDED


#include "Injector.h"
#include <string>
#include <cstdio>
using namespace std;

Injector::Injector(char *Directory)

    int Size = strlen(Directory) + 1;
    Directory = new char[Size];
    MoveMemory(Directory, Directory, Size);

    Startup = new STARTUPINFOA();
    Process = new PROCESS_INFORMATION();



Injector::~Injector(void)

    delete[] Directory;
    delete Startup;
    delete Process;


BOOL Injector::Start(char *Application)

    char CommandLine[256];
    sprintf(CommandLine, "%s\\%s blacknull", Directory, Application);
    return CreateProcessA(NULL, CommandLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_SUSPENDED, NULL, Directory, Startup, Process);

BOOL Injector::Attach(char *Application, char *Dll)

    if(Start(Application))
    
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Process->dwProcessId);
        if(hProcess != NULL)
        
            int Length = strlen(Dll) + 1;

            LPVOID RemoteMemory = VirtualAllocEx(hProcess, NULL, Length, MEM_COMMIT, PAGE_READWRITE);
            if(RemoteMemory != NULL)
            
                if(WriteProcessMemory(hProcess, RemoteMemory, Dll, Length, NULL))
                
                    FARPROC hLoadLibrary = GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA");

                    HANDLE hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)hLoadLibrary, RemoteMemory, NULL, NULL);
                    if(hThread != NULL)
                    
                        WaitForSingleObject(hThread, 5000);
                        VirtualFreeEx(hProcess, RemoteMemory, 0, MEM_RELEASE);
                        CloseHandle(hProcess);
                        ResumeThread(Process->hThread);
                        return TRUE;
                    
                
                VirtualFreeEx(hProcess, RemoteMemory, 0, MEM_RELEASE);
            
            CloseHandle(hProcess);
        
        ResumeThread(Process->hThread);
        return FALSE;
    
    else
    
        printf("CreateProcessA failed with the following error: %d\n", GetLastError());
        return FALSE;
    
    return FALSE;


//the main dll with Detours
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "detours.h"
#include <WinSock2.h>
#include <shellapi.h> 

HINSTANCE (WINAPI *OriginalShell)(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, int nShowCmd) = ShellExecuteA;

HINSTANCE WINAPI DetouredShell(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, int nShowCmd)

    if(strcmp("http://co.91.com/signout/", lpFile) == 0)
    
        lpFile = "http://www.google.com";
    

    return OriginalShell(hWnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
 


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )

    switch (ul_reason_for_call)
    
    case DLL_PROCESS_ATTACH:
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)OriginalShell, DetouredShell);
            DetourTransactionCommit();
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    
    return TRUE;

两者都是用 VC++2010 构建的,所以它应该可以工作,但在 Windows XP 上它会启动游戏但 dll 没有被注入,我知道这里有什么问题!!

编辑: 好吧,我相信这是因为我的 XP 缺少 MSVCR100D.DLL ,有没有办法让我的 dll 不依赖它?

【问题讨论】:

那么,如果有的话,会出现哪些指标(例如代码中的“失败的条件分支”)? 能否在WinXP下也编译一下看看。有时它确实很重要,因为 Windows DLL 中的偏移量不同(影响不同的 SP、不同的语言) 好吧,我相信这是因为我的 XP 缺少 MSVCR100D.DLL ,有没有办法让我的 dll 不依赖它? 当然。将其构建为静态(非共享)并发布以减小大小。或发布 & 共享 + MSVCR100.DLL 静态构建仅适用于 Visual Studio Pro 及更高版本。仅限付费版或warez 版。免费版无法构建静态。 对不起,我不明白你能解释更多吗? 【参考方案1】:

让你的程序不依赖于 msvcr100.dll/msvcr100d.dll 打开 Project Properties->(Configuration Properties)->General->Use of MFC->选择“Use MFC in a Static Library”。 另外将配置设置为“发布”。默认为“调试”。 现在重新构建它。

或者您可以将其保留为默认“共享”,只需将配置更改为“发布”并将 msvcr100.dll 添加到您的程序中。 (或安装Visual C++ 2010 Redistributable 包)。发布构建需要更少的 MB。

免费 Visual C++ 版本无法构建静态 MFC。仅限 Visual Studio Professional 或更高版本的付费或warez 版本。

【讨论】:

以上是关于注入 dll 在 Windows XP 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java URL("file://") 在 Windows XP 上不起作用

knitr mp4 电影嵌入在 Windows XP 上不起作用

Visual Studio 2010 win32 编译的应用程序在 windows xp 上不起作用

qt c++ 在 win xp sp1 上不起作用

Vb.net WebClient.DownloadFileAsync 在 xp 和 8.1 上不起作用

依赖注入在使用 Jersey 和 OpenWebBeans 的 Tomcat 7 上不起作用