【发布时间】:2020-03-14 21:26:29
【问题描述】:
这是一些代码,它应该注入我的 DLL 并在 notepad.exe 中运行它,但正如标题所述,CreateRemoteThread 调用返回 null
MyGetProcessId 工作得很好我做了它并检查了它的结果,看看 pid 是否正确。
#define DLL_PATH "C:\\Users\\tkina\\Desktop\\3\\Dll1\\Debug\\Dll1.dll"
#include <Windows.h>
#include <iostream>
#include <tlhelp32.h>
DWORD MyGetProcessId(LPCTSTR ProcessName);
int main()
{
TCHAR Buffer[MAX_PATH];
DWORD err;
// Get full path of DLL to inject
DWORD pathLen = GetFullPathName(TEXT("mydll.dll"), MAX_PATH, Buffer, NULL);
PVOID addrLoadLibrary = (PVOID)GetProcAddress(GetModuleHandle(Buffer), "LoadLibraryA");
DWORD pID = MyGetProcessId(TEXT("Notepad.exe"));
// Open remote process
HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
if (!proc)
{
std::cout << "Could not open the process!\n";
system("pause");
}
// Get a pointer to memory location in remote process,
// big enough to store DLL path
PVOID memAddr = (PVOID)VirtualAllocEx(proc, 0, strlen(DLL_PATH)+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (NULL == memAddr) {
err = GetLastError();
return 0;
}
// Write DLL name to remote process memory
BOOL check = WriteProcessMemory(proc, memAddr, (LPVOID)DLL_PATH, strlen(DLL_PATH) + 1, NULL);
if (0 == check) {
err = GetLastError();
return 0;
}
// Open remote thread, while executing LoadLibrary
// with parameter DLL name, will trigger DLLMain
HANDLE hRemote = CreateRemoteThread(proc, 0, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("Kernel32.dll"),
"LoadLibraryA"), (LPVOID)memAddr, 0,0);
if (NULL == hRemote) {
err = GetLastError();
return 0;
}
WaitForSingleObject(hRemote, INFINITE);
check = CloseHandle(hRemote);
VirtualFreeEx(proc, memAddr, strlen(DLL_PATH) + 1, MEM_RELEASE);
system("pause");
return 0;
}
对GetLastError 的调用返回 5。
【问题讨论】:
-
GetLastError返回的错误是什么? -
Error 5 被拒绝访问。您是否拥有所有正确的权限?
-
已编译 DLL 的路径表明您正在构建 32 位版本。如果您使用的是 64 位 Windows,则 notepad.exe 也是 64 位的。你不能混合 32/64 位。
-
@rustyx 我不知道你的意思是我在 VS 上构建了一个基本的 dll 我不知道它在 64 位 Windows 10 上是 64 位还是 32 位