вызовите функцию Windows API, используя шеллкод

Цель
Я пытаюсь выполнить простое упражнение с шеллкодом — вызвать «OutputDebugStringA» для удаленного процесса, используя CreateRemoteThread, который активирует шеллкод — это упражнение без внедрения DLL!

проблема
Я не знаю адрес «OutputDebugStringA» в удаленном процессе, только в локальном процессе.

Что я пытался до сих пор

int main() {
char ShellCode[] = "\x48\x8d\x0c\x25\x10\x9c\x8c\x4c\xff\x14\x25\x00\x01\x8d\x4c";
/*
* Get process handle passing in the process ID.
*/
int32_t nProcID = 21440;
const HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nProcID);
if (NULL == hProcess) {
printf("Error: the specified process couldn't be found.\n");
}

const LPVOID arg = (LPVOID)VirtualAllocEx(hProcess, NULL, sizeof(ShellCode), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (NULL == arg) {
int32_t nLastErrorCode = GetLastError();
printf("Error: the memory could not be allocated inside the chosen process. Error code - %d.\n", nLastErrorCode);
}

const int32_t nBytesWritten = WriteProcessMemory(hProcess, arg, ShellCode, sizeof(ShellCode), NULL);
if (0 == nBytesWritten) {
int32_t nLastErrorCode = GetLastError();
printf("Error: there was no bytes written to the process's address space. Error code - %d.\n", nLastErrorCode);
}

const HANDLE hThreadID = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)arg , NULL, NULL, NULL);
if (NULL == hThreadID) {
int32_t nLastErrorCode = GetLastError();
printf("Error: the remote thread could not be created. Error code - %d.\n", nLastErrorCode);
}
else {
printf("Success: the remote thread was successfully created.\n");
}

/*
* Close the handle to the process, because we've already injected the DLL.
*/
CloseHandle(hProcess);
getchar();

return 0;

}

Что я пробовал
Dissemble OutputDebugStringA picture1
затем преобразовать его в шеллкод онлайн и затем вызвать мой код с новым шеллкодом. Но удаленный процесс не знаком с этими адресами.

-3

Решение

Если единственное, что вы хотите знать, это адрес OutputDebugStringA(при условии, что ваш шелл-код работает), он такой же, как текущий процесс. Таким образом, вы можете получить это, делая LPVOID function_addr = reinterpret_cast<LPVOID>(GetProcAddress(GetModuleHandleA("kernel32.dll"), "OutputDebugStringA")); Тогда вы можете использовать function_addr как ты хочешь.

Так как kernel32.dll имеет одинаковый базовый адрес в каждом процессе, относительный виртуальный адрес будет одинаковым, и, таким образом, адрес будет одинаковым.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]