Я пытаюсь научиться делать углубление / замену процесса (ради обучения). Я создал 32-битный процесс в приостановленном состоянии, после этого мне нужен базовый адрес этого процесса, чтобы впоследствии удалить его из памяти и заменить чем-то другим.
Из своего исследования я могу получить это из УИБ процесса, который включает этот адрес. Кроме того, насколько я понял, PEB всегда находится в регистре ebx, а точка входа находится в регистре eax.
ОДНАКО, когда я получаю контекст для основного потока (который содержит содержимое регистров), это все равно нулю, что для меня не имеет смысла, но не дает сбоя.
ВТОРАЯ ПРОБЛЕМА. когда я читаю память процесса, я получаю ошибку 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 64bit
Изменить: исправлена проблема. необходимо сделать context.ContextFlags = CONTEXT_INTEGER. что позволило мне читать. также произошла ошибка памяти процесса чтения, потому что я дал ей неправильный адрес для чтения (в основном 0 + 8 = 8), который, как я полагаю, был для 64-битного процесса