Нахождение базового адреса после создания приостановленного процесса

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


person E. K919    schedule 26.12.2018    source источник


Ответы (1)


Вы никогда не устанавливаете context.ContextFlags, вы должны установить его в CONTEXT_INTEGER перед вызовом GetThreadContext ().

Вот пример кода:

#if defined(_WIN64)
    WOW64_CONTEXT context;
    memset(&context, 0, sizeof(WOW64_CONTEXT));
    context.ContextFlags = CONTEXT_INTEGER;
    Wow64GetThreadContext(pi.hThread, &context);
#else   
    CONTEXT context;
    memset(&context, 0, sizeof(CONTEXT));
    context.ContextFlags = CONTEXT_INTEGER;
    GetThreadContext(pi.hThread, &context);
#endif

Взято из отличной реализации runpe в hasherezade

person GuidedHacking    schedule 23.04.2020