C# 为什么我不';dll注入后是否无法获取消息框?

C# 为什么我不';dll注入后是否无法获取消息框?,c#,python,windows,winapi,dll-injection,C#,Python,Windows,Winapi,Dll Injection,我有简单的dll代码: BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if(ul_reason_for_call == DLL_PROCESS_ATTACH) { MessageBox

我有简单的dll代码:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
      if(ul_reason_for_call == DLL_PROCESS_ATTACH) 
      {
            MessageBox(0, L"Hello!", L"Hello!", 0);          

      }

return TRUE;
}
以及用于将dll注入另一进程的python代码:

import ctypes

PAGE_READWRITE = 0x04
PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)
VIRTUAL_MEM = (0x1000 | 0x2000)

def InjectDLL(DLLPath, PID):

    kernel = ctypes.windll.kernel32
    dllLen = len(DLLPath)

    hProcs  = ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, PID)
    if not hProcs:
        print 'OpenProcess failed.'
        return None


    argAddy = ctypes.windll.kernel32.VirtualAllocEx(hProcs, 0, dllLen, VIRTUAL_MEM, PAGE_READWRITE)
    if not argAddy:
        print 'VirtualAllocEx failed.'
        return None

    wrote = ctypes.c_int(0)
    kernel.WriteProcessMemory(hProcs, argAddy, DLLPath, dllLen, ctypes.byref(wrote))

    hKernel = kernel.GetModuleHandleA("kernel32.dll")
    hLib = kernel.GetProcAddress(hKernel, "LoadLibraryA")
    t_Id = ctypes.c_ulong(0)
    kernel.CreateRemoteThread(hProcs, None, 0, hLib, argAddy, 0, ctypes.byref(t_Id))
    return t_Id

result = InjectDLL("injdll.dll", 564)
print result
注射对某些过程有效。例如,它适用于gvim。我可以看到messagebox。但我用C#创建了一个简单的应用程序。在尝试将我的dll注入这个应用程序之后,什么也没有发生

Python injector不会使用
OpenProcess
CirtualAllocEx
报告任何错误,并返回
c_ulong(3968L)
。为什么我看不到messagebox

编辑:

我的操作系统:Windows XP professional SP3 32位

编辑2:

我用C代码做了同样的事情,得到了同样的结果。注入工作,例如gvim。但不是我在c#的过程。我用调试器检查了一下,似乎没有执行DllMain函数

DWORD pid;
cout << "PID: ";
cin >> pid;


HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS,0,pid);

LPVOID adr = 
VirtualAllocEx (
                hproc,
               (LPVOID)0,
               (SIZE_T)0x1000,
               MEM_COMMIT | MEM_RESERVE,
               PAGE_EXECUTE_READWRITE
               );

WriteProcessMemory (hproc, adr, "injdll.dll", 256, NULL);

HANDLE hthread = CreateRemoteThread 
(hproc,
 NULL,
 0,
 (LPTHREAD_START_ROUTINE)
 GetProcAddress(GetModuleHandle(L"kernel32"),"LoadLibraryA"),
 adr,
 0,
 NULL);

CloseHandle(hthread);
CloseHandle(hproc);

return 0;
dwordpid;
cout>pid;
HANDLE hproc=OpenProcess(PROCESS\u ALL\u ACCESS,0,pid);
LPVOID adr=
VirtualAllocEx(
hproc,
(LPVOID)0,
(尺寸)0x1000,
记住承诺,记住保留,
页面\执行\读写
);
WriteProcessMemory(hproc,adr,“injdll.dll”,256,空);
HANDLE hthread=CreateRemoteThread
(hproc,
无效的
0,
(LPU线程\启动\例程)
GetProcAddress(GetModuleHandle(L“kernel32”),“LoadLibraryA”),
adr,
0,
无效);
CloseHandle(hthread);
闭合手柄(hproc);
返回0;

还不能留下评论,那么,您使用的操作系统版本是什么

在大多数情况下,对于64位操作系统中的.net应用程序,Dll必须为64位

在pyton中我不确定,但LoadLibrary需要AsciiZ字符串。因此,出于安全考虑,您可以使用“dllLen=len(DLLPath)+1”

另外,尝试更改默认堆栈大小

kernel.CreateRemoteThread(hProcs, None, 4096*16, hLib, argAddy, 0, ctypes.byref(t_Id))

或者,可能是因为某些原因,你的大脑出现了异常。在执行CreateRemoteThread之前将调试器附加到目标进程

检查了您的建议,但没有帮助。我也尝试过使用c代码,只是为了确保这不是python代码相关的问题。将调试器附加到进程后,我知道dll代码未执行。请使用dll的完整路径。不仅仅是文件名。就是这样!:)它正在使用gvim,因为gvim是从injdll所在的目录执行的。