如何将dll注入另一个进程?
How to inject a dll to a another process?
最近几天我一直在尝试创建一个 DLL 注入器。
我找到的最简单的 DLL 注入方法是使用 CreateRemoteThread
这是我到目前为止写的,这段代码不起作用,也找不到原因。
我很确定我的问题出在我用来调用 WinAPI 函数的变量类型上,但我找不到位置。
bool Injector::Inject( HANDLE hProcess )
{
//hProcess is a process with writing and reading access
HANDLE hThread;
void* pLibRemote = 0;
string dllPath = "Some dll path";
HMODULE hKernel32 = GetModuleHandle(__TEXT("Kernel32"));
pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pLibRemote, dllPath.c_str(), sizeof(dllPath.c_str()), NULL);
hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,"LoadLibraryA"),
pLibRemote, 0, NULL );
.
.
.
CloseHandle(hThread);
}
.
.
.
至少有 2 个问题:
pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);
1) sizeof(dllPath.c_str())
:您正在对指针执行 sizeof (c_str() returns a pointer),因此您可能会得到 4 或 8 作为结果。使用 dllPath.size() + sizeof(char)
(如果使用 std::wstring
,则使用 wchar_t
而不是 char
)。
2) 使用 MEM_RESERVE | MEM_COMMIT
而不是 MEM_COMMIT
:你想保留 和 同时提交保留的内存。
还要确保两个程序使用相同的 ISA(x86/x86;x64/x64,但不是不匹配的 ISA)。
最近几天我一直在尝试创建一个 DLL 注入器。
我找到的最简单的 DLL 注入方法是使用 CreateRemoteThread
这是我到目前为止写的,这段代码不起作用,也找不到原因。
我很确定我的问题出在我用来调用 WinAPI 函数的变量类型上,但我找不到位置。
bool Injector::Inject( HANDLE hProcess )
{
//hProcess is a process with writing and reading access
HANDLE hThread;
void* pLibRemote = 0;
string dllPath = "Some dll path";
HMODULE hKernel32 = GetModuleHandle(__TEXT("Kernel32"));
pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pLibRemote, dllPath.c_str(), sizeof(dllPath.c_str()), NULL);
hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,"LoadLibraryA"),
pLibRemote, 0, NULL );
.
.
.
CloseHandle(hThread);
}
.
.
.
至少有 2 个问题:
pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);
1) sizeof(dllPath.c_str())
:您正在对指针执行 sizeof (c_str() returns a pointer),因此您可能会得到 4 或 8 作为结果。使用 dllPath.size() + sizeof(char)
(如果使用 std::wstring
,则使用 wchar_t
而不是 char
)。
2) 使用 MEM_RESERVE | MEM_COMMIT
而不是 MEM_COMMIT
:你想保留 和 同时提交保留的内存。
还要确保两个程序使用相同的 ISA(x86/x86;x64/x64,但不是不匹配的 ISA)。