【发布时间】:2012-06-07 10:52:55
【问题描述】:
我知道有很多关于这方面的问题和书籍,但我似乎无法将我的 C++ DLL 注入任何进程。
注入DLL的代码:
#include <iostream>
#include "windows.h"
bool Inject(DWORD pId, char *dllName);
using namespace std;
int main()
{
Inject(600, "C:\\d.dll");
return 0;
}
bool Inject(DWORD pId, char *dllName)
{
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, pId);
if(h)
{
LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL);
HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);
WaitForSingleObject(asdc, INFINITE);
VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE);
CloseHandle(asdc);
CloseHandle(h);
return true;
}
return false;
}
以及我尝试注入的 DLL:
#include <windows.h>
#include <stdio.h>
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
MessageBox (0, "From DLL\n", "Process Attach", MB_ICONINFORMATION);
break;
case DLL_PROCESS_DETACH:
MessageBox (0, "From DLL\n", "Process Detach", MB_ICONINFORMATION);
break;
case DLL_THREAD_ATTACH:
MessageBox (0, "From DLL\n", "Thread Attach", MB_ICONINFORMATION);
break;
case DLL_THREAD_DETACH:
MessageBox (0, "From DLL\n", "Thread Detach", MB_ICONINFORMATION);
break;
}
return TRUE;
}
我对 C++ 了解的不够多,无法知道哪里出了问题。我已经在我试图注入的进程上运行了 Process Explorer(进程也以管理员身份运行),但它没有被注入。当我运行它时,什么也没有发生,有什么想法吗?
【问题讨论】:
-
您是否检查过您打开进程的权限(调试权限)?
-
@Jimmy 我该如何检查这个?
-
您可以查看msdn.microsoft.com/en-us/library/aa291232(v=VS.71).aspx 或以管理员身份运行进程
-
您的代码没有任何错误检查,除了 OpenProcess。所以肯定你不知道为什么它不起作用。
-
使用
OutputDebugString代替MessageBox,并使用 DebugView 进行检查。您可能正在访问您的MessageBox,但您只是看不到它是从DllMain正确调用的。