Нахождение базового адреса после создания приостановленного процесса - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь научиться делать процесс выдавливания / замены (ради обучения).Я создал 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-битного процесса

...