【问题标题】:How to fix "LPVOID: unknown size" error while using the CreateRemoteThread API?使用 CreateRemoteThread API 时如何修复“LPVOID:未知大小”错误?
【发布时间】:2019-07-05 06:48:04
【问题描述】:

我正在尝试创建一个执行DLL-Injection 的工具,方法是使用VirtualAclloc() API 在正在运行的进程的内存中写入DLL,然后找到入口点的偏移量并将其传递给CreateRemoteThread() API,方法是添加VirtualAlloc 函数基地址的入口点偏移量。

由于在调用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”和消息“表达式必须是指向完整对象类型的指针。

有没有办法可以将lpParameter 的值作为NULL 传递?

【问题讨论】:

  • 你找错地方了。问题是base_address + offset

标签: c++ winapi dll dll-injection createremotethread


【解决方案1】:

base_address + offsetoffset*sizeof *base_address 字节添加到指针base_address。但是如果base_address 的类型是LPVOID 那么*base_address 没有大小,所以这是一个错误。看看你的 C++ 书中关于指针算法的部分。

根据上下文,我猜您应该将 base_address 更改为 char* 而不是 LPVOID。或者你可以添加这样的演员(LPTHREAD_START_ROUTINE)((char*)base_address + offset)

【讨论】:

    【解决方案2】:

    在这种情况下,您需要遵循以下流程:

    1. 获取 kernel32.dll 中 LoadLibraryA 函数的句柄
    2. 使用VirtualAllocEx在目标进程的地址空间分配和初始化内存
    3. 使用WriteProcessMemory将要注入的dll路径写入目标进程地址空间
    4. 使用 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 的一种方法,另一种方法是找到 DLL 的入口点并将其传递给 CreateRemoteThread 函数。我正在尝试实现第二种方法。我正在通过 PE Header 解析来计算入口点的偏移量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2014-10-02
    • 1970-01-01
    • 2016-09-24
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多