使用 CreateRemoteThread API 时如何修复 "LPVOID: unknown size" 错误?
How to fix "LPVOID: unknown size" error while using the CreateRemoteThread API?
我正在尝试创建一个用于执行 DLL-Injection
的工具,方法是使用 VirtualAclloc()
API 在 运行 进程的内存中写入 DLL,然后找到偏移量入口点,并通过将入口点偏移量添加到 VirtualAlloc
函数的基地址,将其传递给 CreateRemoteThread()
API。
因为我在调用 CreateRemoteThread()
时没有任何参数需要传递给 lpStartAddress
,所以我将 lpParameter
初始化为 NULL。
LPVOID lpParameter = NULL;
...
...
thread_handle = CreateRemoteThread(process_handle, NULL, 0, (LPTHREAD_START_ROUTINE)(base_address + offset), lpParameter, 0, NULL);
编译代码时出现错误:
LPVOID: Unknown Size" and the message "Expression must be a pointer to a complete object type.
有什么方法可以将 lpParameter
的值作为 NULL 传递吗?
base_address + offset
向指针 base_address
添加 offset*sizeof *base_address
个字节。但是如果 base_address
的类型是 LPVOID
那么 *base_address
没有大小,所以这是一个错误。看看你的 C++ 书中关于 指针算法 的部分。
根据上下文,我猜你应该将 base_address
更改为 char*
而不是 LPVOID
。或者你可以像这样添加演员表 (LPTHREAD_START_ROUTINE)((char*)base_address + offset)
.
在这种情况下,您需要遵循以下流程:
- 获取 kernel32.dll
中 LoadLibraryA 函数的句柄
- 使用 VirtualAllocEx
在目标进程的地址 space 分配和初始化内存
- 使用WriteProcessMemory
在目标进程地址space写入要注入的dll的路径
- 使用 CreateRemoteThread 注入 dll,并将 LoadLibraryA 的地址作为 lpStartAddress 传递
下面是示例代码:
char* dllPath = "C:\testdll.dll";
int procID = 16092;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
if (!hProcess) {
printf("Error: Process not found.\n");
}
LPVOID lpvLoadLib = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA"); /*address of LoadLibraryA*/
if (!lpvLoadLib) {
printf("Error: LoadLibraryA not found.\n");
}
LPVOID lpBaseAddress = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(dllPath)+1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); /*Initialize and Allocate memory to zero in target process address space*/
if (!lpBaseAddress) {
printf("Error: Memory was not allocated.\n");
}
SIZE_T byteswritten;
int result = WriteProcessMemory(hProcess, lpBaseAddress, (LPCVOID)dllPath, strlen(dllPath)+1, &byteswritten); /*Write the path of dll to an area of memory in a specified process*/
if (result == 0) {
printf("Error: Could not write to process address space.\n");
}
HANDLE threadID = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpvLoadLib, lpBaseAddress, NULL, NULL); /*lpStartAddress = lpvLoadLib address of LoadLibraryA function*/
if (!threadID) {
printf("Error: Not able to create remote thread.\n");
}
else {
printf("Remote process created...!");
}
希望这对您有所帮助
我正在尝试创建一个用于执行 DLL-Injection
的工具,方法是使用 VirtualAclloc()
API 在 运行 进程的内存中写入 DLL,然后找到偏移量入口点,并通过将入口点偏移量添加到 VirtualAlloc
函数的基地址,将其传递给 CreateRemoteThread()
API。
因为我在调用 CreateRemoteThread()
时没有任何参数需要传递给 lpStartAddress
,所以我将 lpParameter
初始化为 NULL。
LPVOID lpParameter = NULL;
...
...
thread_handle = CreateRemoteThread(process_handle, NULL, 0, (LPTHREAD_START_ROUTINE)(base_address + offset), lpParameter, 0, NULL);
编译代码时出现错误:
LPVOID: Unknown Size" and the message "Expression must be a pointer to a complete object type.
有什么方法可以将 lpParameter
的值作为 NULL 传递吗?
base_address + offset
向指针 base_address
添加 offset*sizeof *base_address
个字节。但是如果 base_address
的类型是 LPVOID
那么 *base_address
没有大小,所以这是一个错误。看看你的 C++ 书中关于 指针算法 的部分。
根据上下文,我猜你应该将 base_address
更改为 char*
而不是 LPVOID
。或者你可以像这样添加演员表 (LPTHREAD_START_ROUTINE)((char*)base_address + offset)
.
在这种情况下,您需要遵循以下流程:
- 获取 kernel32.dll 中 LoadLibraryA 函数的句柄
- 使用 VirtualAllocEx 在目标进程的地址 space 分配和初始化内存
- 使用WriteProcessMemory 在目标进程地址space写入要注入的dll的路径
- 使用 CreateRemoteThread 注入 dll,并将 LoadLibraryA 的地址作为 lpStartAddress 传递
下面是示例代码:
char* dllPath = "C:\testdll.dll";
int procID = 16092;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
if (!hProcess) {
printf("Error: Process not found.\n");
}
LPVOID lpvLoadLib = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA"); /*address of LoadLibraryA*/
if (!lpvLoadLib) {
printf("Error: LoadLibraryA not found.\n");
}
LPVOID lpBaseAddress = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(dllPath)+1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); /*Initialize and Allocate memory to zero in target process address space*/
if (!lpBaseAddress) {
printf("Error: Memory was not allocated.\n");
}
SIZE_T byteswritten;
int result = WriteProcessMemory(hProcess, lpBaseAddress, (LPCVOID)dllPath, strlen(dllPath)+1, &byteswritten); /*Write the path of dll to an area of memory in a specified process*/
if (result == 0) {
printf("Error: Could not write to process address space.\n");
}
HANDLE threadID = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpvLoadLib, lpBaseAddress, NULL, NULL); /*lpStartAddress = lpvLoadLib address of LoadLibraryA function*/
if (!threadID) {
printf("Error: Not able to create remote thread.\n");
}
else {
printf("Remote process created...!");
}
希望这对您有所帮助