Я пытаюсь научиться делать процесс выдавливания / замены (ради обучения).Я создал 32-битный процесс в приостановленном состоянии, после чего мне нужен базовый адрес этого процесса, чтобы позже отобразить из памяти и заменить чем-то другим.
Из моего исследования яможно получить из PEB процесса, который включает в себя этот адрес.также из того, что я понял, PEB всегда находится в регистре ebx, а точка входа находится в регистре eax.
HOWEVER , когда я получаю контекст для основного потока (которыйсодержит содержимое регистров) это все ноль, что не имеет смысла для меня, но это не ошибка.
ВТОРАЯ ПРОБЛЕМА .когда я читаю память процесса, я получаю ошибка 299 (12B) , что, как я понимаю, происходит при попытке чтения памяти 64-битной из 32-битной (но помните, что я запускаю 32-битный процесс).
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
void end_program(LPPROCESS_INFORMATION pinfo, LPSTARTUPINFO stinfo)
{
TerminateProcess(pinfo->hProcess, 1);
CloseHandle(pinfo->hProcess);
CloseHandle(pinfo->hThread);
CloseHandle(stinfo->hStdError);
CloseHandle(stinfo->hStdInput);
CloseHandle(stinfo->hStdOutput);
system("pause");
}
void main()
{
// Create process suspended
PROCESS_INFORMATION process_info;
STARTUPINFO start_info;
ZeroMemory(&process_info, sizeof(process_info));
ZeroMemory(&start_info, sizeof(start_info));
TCHAR path[100] = TEXT("C:\\Windows\\SysWOW64\\svchost.exe");
if (!CreateProcess(NULL, path, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &start_info, &process_info))
{
printf("Failed creating process: error 0x%p", GetLastError());
return;
}
printf("PID: %i Handle: 0x%p\r\n", process_info.dwProcessId, process_info.hProcess);
// Get context of thread
CONTEXT context;
ZeroMemory(&context, sizeof(context));
if (!GetThreadContext(process_info.hThread, &context))
{
printf("Failed getting context: error 0x%p\r\n", GetLastError());
end_program(&process_info, &start_info);
return;
}
printf("Context recieved!\r\n");
// Get base address
PVOID base_address;
ZeroMemory(&base_address, sizeof(base_address));
if (!ReadProcessMemory(process_info.hProcess, (BYTE)(context.Ebx + 8), &base_address, sizeof(PVOID), NULL))
{
printf("Error reading file: error 0x%p\r\n", GetLastError());
end_program(&process_info, &start_info);
return;
}
// Bugs that haven't been uncovered yet goes here
// End of program
end_program(&process_info, &start_info);
}
примечание 1: исследование показало, что PEB со смещением в 8 байтов является базовым адресом.
примечание 2: попытался сделать снимок всего процесса, но с той же ошибкой, также попробовал enumprocessmodules, такая же ошибка возникает.
примечание 3: все, что я нашел в сети, предназначено для нахождения базового адреса запущенного процесса, который я попробовал и успешно выполнил, но поскольку ни один модуль не загружен, пока он приостановлен (как это появляется в диспетчере задач, поскольку нет именихотя этот процесс может быть неправильным), он не работает для меня.
примечание 4: я также новичок в кодировании на C, так что извините, если что-то выглядит странно.
любая помощь будет с удовольствием оценена.если у вас есть другие способы получить базовый адрес, я хотел бы услышать.извините, если код немного грязный, или если я не был понятен.Я сделаю все возможное, чтобы объяснить ...
забыл добавить: моя система Windows 10 64-битная
Редактировать: Исправлена проблема.необходимо сделать context.ContextFlags = CONTEXT_INTEGER.это позволило мне читать.также не удалось прочитать память readprocess, потому что я дал неправильный адрес для чтения (в основном 0 + 8 = 8), который, как я предполагаю, был для 64-битного процесса