• XSS.stack #1 – первый литературный журнал от юзеров форума

Не получается запустить бинарные данные в памяти программы

assembler

HDD-drive
Пользователь
Регистрация
12.05.2023
Сообщения
27
Реакции
1
Не получается запустить бинарные данные в памяти программы

Я не так много в c++, но мне надо считать бинарные данные в файла output.bin, и запустить их в памяти моей программы, как это сделать? Я пытался всяко разно это сделать, но все безуспешно.. Даже chat gpt толком не помог

Я так понял что нужно использовать WriteProcessMemory, VirtualAllocEx, OpenProcess. Но спустя десятки попыток и переделок программы у меня не выходит, можете дать направление или решение для этой задачи? Или хотя бы сказать правильно ли я иду или не туда
 
Как я понял, ты пытаешься запустить шеллкод. Для этого нужно выделить память с правами на исполнение и передать туда управление. Как вариант:
C:
#include <Windows.h>
#include <stdio.h>

typedef DWORD(WINAPI* T_ShellEntry)();

BYTE* ReadFileBytes(LPCWSTR path, DWORD* size) {
    BOOL bSuccess = TRUE;
    HANDLE hFile = INVALID_HANDLE_VALUE;
    DWORD fileSize = 0;
    BYTE* fileData = NULL;
    do {
        hFile = CreateFileW(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (!(bSuccess = hFile != INVALID_HANDLE_VALUE)) break;

        fileSize = GetFileSize(hFile, NULL);
        if (!(bSuccess = fileSize != 0)) break;

        fileData = (BYTE*)malloc(fileSize);
        if (!(bSuccess = fileData != NULL)) break;

        if (!(bSuccess = ReadFile(hFile, fileData, fileSize, size, NULL))) break;
    } while (FALSE);

    if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);
    if (!bSuccess && fileData) free(fileData);
    return fileData;
}

BOOL RunShellcode(BYTE* shell, DWORD size) {
    PVOID shellMem = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (!shellMem) {
        return FALSE;
    }
    memcpy(shellMem, shell, size);
    ((T_ShellEntry)shellMem)();

    VirtualFree(shellMem, 0, MEM_RELEASE);
    return TRUE;
}


int main() {
    int argc = 0;
    LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (!argv || argc < 2) {
        wprintf(L"Usage: %s <file path>\n", argv[0]);
        return -1;
    }
    if (!argv[1]) {
        LocalFree(argv);
        wprintf(L"invalid file path\n");
        return -1;
    }

    DWORD size = 0;
    BYTE* data = ReadFileBytes(argv[1], &size);
    if (!data) {
        wprintf(L"read file \"%s\" failed: %d\n", argv[1], GetLastError());
        return -1;
    }
    if (!RunShellcode(data, size)) {
        free(data);
        wprintf(L"execute shellcode failed: %d\n", GetLastError());
        return -1;
    }

    free(data);
    LocalFree(argv);
    return 0;
}
 
П
Как я понял, ты пытаешься запустить шеллкод. Для этого нужно выделить память с правами на исполнение и передать туда управление. Как вариант:
C:
#include <Windows.h>
#include <stdio.h>

typedef DWORD(WINAPI* T_ShellEntry)();

BYTE* ReadFileBytes(LPCWSTR path, DWORD* size) {
    BOOL bSuccess = TRUE;
    HANDLE hFile = INVALID_HANDLE_VALUE;
    DWORD fileSize = 0;
    BYTE* fileData = NULL;
    do {
        hFile = CreateFileW(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (!(bSuccess = hFile != INVALID_HANDLE_VALUE)) break;

        fileSize = GetFileSize(hFile, NULL);
        if (!(bSuccess = fileSize != 0)) break;

        fileData = (BYTE*)malloc(fileSize);
        if (!(bSuccess = fileData != NULL)) break;

        if (!(bSuccess = ReadFile(hFile, fileData, fileSize, size, NULL))) break;
    } while (FALSE);

    if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);
    if (!bSuccess && fileData) free(fileData);
    return fileData;
}

BOOL RunShellcode(BYTE* shell, DWORD size) {
    PVOID shellMem = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (!shellMem) {
        return FALSE;
    }
    memcpy(shellMem, shell, size);
    ((T_ShellEntry)shellMem)();

    VirtualFree(shellMem, 0, MEM_RELEASE);
    return TRUE;
}


int main() {
    int argc = 0;
    LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (!argv || argc < 2) {
        wprintf(L"Usage: %s <file path>\n", argv[0]);
        return -1;
    }
    if (!argv[1]) {
        LocalFree(argv);
        wprintf(L"invalid file path\n");
        return -1;
    }

    DWORD size = 0;
    BYTE* data = ReadFileBytes(argv[1], &size);
    if (!data) {
        wprintf(L"read file \"%s\" failed: %d\n", argv[1], GetLastError());
        return -1;
    }
    if (!RunShellcode(data, size)) {
        free(data);
        wprintf(L"execute shellcode failed: %d\n", GetLastError());
        return -1;
    }

    free(data);
    LocalFree(argv);
    return 0;
}
Почему то ваш код у меня не срабатывает. Ошибки нет, просто файл не срабатывает

1708243884468.png

dada.exe - Ваш код, printer.exe - Программа в 3 строки которая создает файл .txt и записывает туда что то. При обычном запуске printer.exe все работает

Так же помимо передачи printer.exe пытался передавать эту же программу но в виде шеллкода, в бинарном файле(.bin), точно так же, без результатно.

Так же пытался запустить через права администратора
 
Так же помимо передачи printer.exe пытался передавать эту же программу но в виде шеллкода, в бинарном файле(.bin), точно так же, без результатно.
Если просто изменить расширение файла - он не станет шеллкодом. Для этого используйте donut.
В целом задача не ясна - вам нужно запустить процесс или PE-файл в памяти?
 
Если просто изменить расширение файла - он не станет шеллкодом. Для этого используйте donut.
В целом задача не ясна - вам нужно запустить процесс или PE-файл в памяти?
Мне нужно запустить бинарный код/шеллкод в памяти процесса моей программы, или в оперативной памяти.
У меня есть бинарный файл, я не просто поменял расширение.. .bin файл кооторый состоит из шелкода, я не настолько..
 
Последнее редактирование:
Модерация любит долго принимать сообщения. Я не дурачок, я не просто поменял с exe на bin, Мои файлы printer.exe - Исполняемый файл, а мой .bin наполнен бинарными данными, единичками и нулями
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Если просто изменить расширение файла - он не станет шеллкодом. Для этого используйте donut.
В целом задача не ясна - вам нужно запустить процесс или PE-файл в памяти?
Он хочет это ---> "inject.exe" will inject a raw binary file (loader.bin) into a process by its PID or process name."
То что умеет донат github.com/TheWover/donut который вы ему и скинули
 
Не совсем. Я запускаю свою программу, и нужно что бы внутри ее же процесса(или в оперативной памяти) запустился бинарный код взятый с другого файла (file.bin)
 
Как я понял ты хочешь сделать что то такое или я не прав?:
Здесь так же берется бинарный код программы в HEX редакторе. И в другой программе запускается в памяти.
 
Как я понял ты хочешь сделать что то такое или я не прав?:
Здесь так же берется бинарный код программы в HEX редакторе. И в другой программе запускается в памяти.
Да, типо того
 
Всё правильно написал reqwest, если это шеллкод то просто выделаешь память rx/rwx и туда передаёшь управление
Если внутри себя надо запустить другой бинарь ( PE файл например экзе или длл ) в памяти это называется LoadPE


Там нужно обрабатывать релоки импорты и тд
 
Ссылка на исходники:
UPD:
Учти ещё , что тебе нужно компилить программу под разрядность той программы, которую хочешь запустить из памяти.
Пример: калькулятор 32бит и тебе надо собрать исходники в 32 битной разрядности.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх