过去几天我一直在尝试创建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);
}
.
.
.
答案 0 :(得分:2)
至少有两个问题:
pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);
1)sizeof(dllPath.c_str())
:你在指针(c_str() returns a pointer)上做了sizeof,因此你可能得到4或8。如果使用dllPath.size() + sizeof(char)
,请使用wchar_t
(或char
代替std::wstring
。
2)使用MEM_RESERVE | MEM_COMMIT
代替MEM_COMMIT
:您希望同时保留和提交保留的内存。
同时确保两个程序使用相同的ISA(x86 / x86; x64 / x64,但不是不匹配的ISA)。