Как исправить ошибку «LPVOID: неизвестный размер» при использовании API CreateRemoteThread? - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь создать инструмент для выполнения DLL-Injection, записав DLL в память запущенного процесса с использованием API VirtualAclloc(), а затем найдя смещение точки входа и передав его в API CreateRemoteThread(), добавив смещение точки входа к базовому адресу функции VirtualAlloc.

Поскольку у меня нет аргументов, которые нужно передать lpStartAddress при вызове CreateRemoteThread(), я инициализировал lpParameter как NULL.


LPVOID lpParameter = NULL;

...
...
thread_handle = CreateRemoteThread(process_handle, NULL, 0, (LPTHREAD_START_ROUTINE)(base_address + offset), lpParameter, 0, NULL);

При компиляции кода я получаю сообщение об ошибке:

LPVOID: неизвестный размер "и сообщение" Выражение должно быть указателем на полный тип объекта.

Можно ли передать значение lpParameter как NULL?

Ответы [ 2 ]

4 голосов
/ 05 июля 2019

base_address + offset добавляет offset*sizeof *base_address байтов к указателю base_address. Но если тип base_address равен LPVOID, то *base_address не имеет размера, так что это ошибка. Взгляните на раздел арифметика указателей в вашей книге C ++.

Из контекста, я думаю, вы должны изменить base_address на char* вместо LPVOID. Или вы можете добавить актерский состав, подобный этому (LPTHREAD_START_ROUTINE)((char*)base_address + offset).

0 голосов
/ 05 июля 2019

В этом случае вам необходимо выполнить следующий процесс:

  1. Получить дескриптор функции LoadLibraryA в kernel32.dll
  2. Выделить и инициализировать память в адресном пространстве целевого процесса с помощью VirtualAllocEx
  3. Запишите путь к DLL, которую вы хотите внедрить в адресное пространство целевых процессов, используя WriteProcessMemory
  4. Внедрите dll с помощью CreateRemoteThread и передайте адрес 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...!");
}

надеюсь, это поможет

...