Путешествие без мимикаца с нуля
Путешествие без мимикаца с нуля

Отказ от ответственности

Технические статьи Koi Security предназначены только для справки. Информация, представленная в этой статье, предназначена только для изучения и использования специалистами по сетевой безопасности. Не используйте техническую информацию, содержащуюся в статье, для взлома какой-либо компьютерной системы без разрешения. Пользователь несет ответственность за любые прямые или косвенные последствия и убытки, возникшие в результате использования информации, представленной в настоящей статье. Если есть какое-либо нарушение, пожалуйста, сообщите нам, и мы немедленно удалим его и принесем извинения. Инструменты, представленные в этой статье, предназначены только для обучения и не могут использоваться для других целей. Удалите файлы инструментов в течение 24 часов! Спасибо!

Предисловие

Эта статья является вводной статьей для новичков, чтобы избежать убийств. С моей точки зрения, как написать демонстрацию загрузки локальной разделенной памяти mimikatz, чтобы избежать убийств:

  1. Создать проект из,как Исправлять Конфигурация Отправляться
  2. Как написать нормальный загрузчик и как его улучшить
  3. Тогда как просто избежать убийства загрузчика, чтобы добиться хорошего антиубийственного эффекта?

Здесь не используется какая-либо превосходная антивирусная технология, а используются лишь некоторые простые и понятные методы, позволяющие избежать антивирусных программ Windows Defender, 360 и Tinder.

Если вы новичок в борьбе с убийствами, впервые читаете мою статью и мало что знаете о борьбе с убийствами, вы можете сначала прочитать основную статью о борьбе с убийствами, которую я написал:

Вводное руководство по работе с антивирусом и часто задаваемые вопросы для новичков (1)

1. Создать проект

Создайте консольный проект C++, используя vs2022:

Измените конфигурацию выпуска и выберите компилятор vs 2015 (если он не установлен, повторно откройте установочный пакет vs, чтобы установить его):

Выберите целевую платформу:

Измените оптимизацию на минимизацию размера /O1:

Выберите многопоточность /MT для генерации кода. Использование /MD имеет проблемы совместимости, поэтому обычно не используется:

Создать список — «Нет», если вы не используете список, отчеты о вирусах будут ниже:

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

2. Написание загрузчика

Найдите самый простой загрузчик в проекте github ниже:

Язык кода:javascript
копировать
https://github.com/ReversingID/Shellcode-Loader/tree/master/windows

Этот проект содержит относительно полный набор загрузчиков различных типов. Каталог выделения содержит различные загрузчики API, которые применяются к памяти шелл-кода. Каталог выполнения содержит загрузчики, которые выполняют шелл-код различными способами, такие как загрузчики отражения и загрузчик потоков, загрузчик обратного вызова. , и т. д.:

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

Скопируйте его напрямую:

Упростите его, удалив все ненужные части:

Используйте pe2shc (https://github.com/hasherezade/pe_to_shellcode), чтобы преобразовать mimikatz в шеллкод:

Используйте следующую функцию для чтения шеллкода из mim.txt:

Язык кода:javascript
копировать
unsigned char* inputFile(const char* filename, int &len) {
    FILE* fp = NULL;
    int err = fopen_s(&fp, filename, "rb");
    if (err != 0 || !fp) {
        exit(-1);
    }

    fseek(fp, 0, SEEK_END);
    len = ftell(fp);
    rewind(fp);

    unsigned char* lpAddress = (unsigned char*)malloc(len);
    fread(lpAddress, 1, len, fp);
    fclose(fp);
    return lpAddress;
}

Исправлять Разрешение на выполнение здесь начинается с выполнения чтения.PAGE_EXECUTE_READИсправлять Чтение и запись выполненияPAGE_EXECUTE_READWRITE,в противном случае shellcode Невозможно выполнить:

Исправлятьсвойство->отлаживать->工作目录为 mim.txt Расположение:

Успешное выполнение шеллкода:

3. Загрузчик свободен от убийств

Хоть и был написан локальный отдельный загрузчик на шаге 2, но это всего лишь загрузчик и его нельзя защитить от уничтожения. Его нужно обработать ниже.

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

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

Поэтому здесь используется шифрование и дешифрование случайных значений XOR. Каждый бит шелл-кода будет зашифрован XOR со случайным значением, что может привести к достаточной путанице, но недостатки также очевидны. Значение энтропии после шифрования слишком велико, достигая 7,9. и значение энтропии слишком велико. Легко вызвать обнаружение путем уничтожения программного обеспечения, поэтому этот алгоритм шифрования не подходит для встроенного шелл-кода, но на метод локального разделения это не влияет:

Язык кода:javascript
копировать
void encrypt(unsigned char* input, int len, unsigned int key) {
    srand(key);
    for (int i = 0; i < len; i++) {
        input[i] = input[i] ^ key;
        input[i] = input[i] ^ (rand() % len + 1);
    }
}

void decrypt(unsigned char* input, int len, unsigned int key) {
    srand(key);
    for (int i = 0; i < len; i++) {
        input[i] = input[i] ^ (rand() % len + 1);
        input[i] = input[i] ^ key;
    }
}

Щелкните правой кнопкой мыши решение, выберите создание нового консольного проекта C++ и назовите его crypto:

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

Полное содержание выглядит следующим образом:

Язык кода:javascript
копировать
#include <iostream>

void encrypt(unsigned char* input, int len, unsigned int key) {...}

void decrypt(unsigned char* input, int len, unsigned int key) {...}

unsigned char* inputFile(const char* filename, int& len) {
    FILE* fp = NULL;
    int err = fopen_s(&fp, filename, "rb");
    if (err != 0 || !fp) {
        printf("Error: unable to open file for reading\n");
        exit(-1);
    }

    fseek(fp, 0, SEEK_END);
    len = ftell(fp);
    rewind(fp);

    unsigned char* lpAddress = (unsigned char*)malloc(len);
    fread(lpAddress, 1, len, fp);
    fclose(fp);
    return lpAddress;
}

void outputFile(const char* filename, unsigned char * buf, int len) {
    FILE* fp = NULL;
    fopen_s(&fp, filename, "wb");
    if (!fp) {
        printf("Error: unable to open file for writing\n");
        exit(-1);
    }

    fwrite(buf, 1, len, fp);
    fclose(fp);
}

int main()
{
    int key = 123006;
    int len;
    unsigned char * buf = inputFile("mim.txt", len);

    encrypt(buf, len, key);

    outputFile("mim_e.txt", buf, len);
}

Здесь используется ключ 123006, содержимое mim.txt считывается, шифруется случайным значением XOR и выводится в mim_e.txt.

Щелкните правой кнопкой мыши криптопроект и установите его в качестве запускаемого проекта:

Затем нажмите «Выполнить», чтобы вывести зашифрованный файл mim_e.txt:

Вернитесь назад, измените код загрузчика и добавьте функцию дешифрования:

Здесь важнее сроки расшифровки. Видно, что так оно и есть. shellcode После перемещения в память и изменения разрешений выполнение отражения shellcode До,Короче говоря, запомните одно предложение: не расшифровывайте слишком рано. Время расшифровки должно быть как можно более поздним. Чем раньше вы расшифроваете, тем больше риск разоблачения.

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

Затем измените код и пропишите длину в коде:

Я удалил часть, которая считывает длину файла в функции inutFile, и напрямую присвоил payload_len значение 1373696. Это сделано для того, чтобы избежать чтения длины шеллкода из файла и тем самым снизить характеристики.

Измените режим отладки на нет, а затем скомпилируйте в режиме выпуска:

Компилируем и выполняем, mimikatz выполняется нормально, а загрузчик пишется:

Защитник Windows сканировался и выполнялся нормально, не будучи убитым:

Обратите внимание: в Защитнике Windows есть сканирование памяти. Если вы не выполнили антивирусную обработку исходного кода, не используйте версию, скомпилированную самостоятельно. Вместо этого используйте официально скомпилированную версию. Официально скомпилированная версия имеет лучший антивирусный эффект. Если вы скомпилируете его самостоятельно, версия может легко оставить коды функций в исходном коде, вызывая сканирование и уничтожение памяти.

360. Сканирование Tinder пройдено:

360 не имеет сканирования памяти, поэтому вам нужно выполнить только статическое сканирование перед его выполнением. Стоит отметить, что сканирование Tinder по щелчку правой кнопкой мыши на самом деле включает 7-секундное сканирование в песочнице, но оно ограничено одним файлом. , поэтому это не влияет на локальные методы разделения бесполезны.

наконец

Вот демонстрация с нуля Создать проект из->Написание загрузчика、Улучшить загрузчик->Весь процесс предотвращения убийства,use использует локальное разделение и шифрование и дешифрование случайных значений XOR, чтобы избежать уничтожения.

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

  1. алгоритм шифрования достаточно прост
  2. шифрование достаточно запутанно
  3. Энтропия достаточно низка

Шифрование и дешифрование случайных значений XOR, используемые в этой статье, соответствуют двум вышеуказанным пунктам, но после шифрования шелл-кода значение энтропии достигает 7,9, что является очень высоким диапазоном. Фактически, алгоритм шифрования все еще имеет очень большие возможности для оптимизации. Например, текущий метод шифрования — это XOR случайного значения для каждого бита шеллкода, тогда я хотел бы его улучшить. Можно ли уменьшить значение энтропии без XOR случайного значения для всех битов? Я просто упомянул здесь один момент, и вам решать его.

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose