• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Гайд: Отключаем CRT и Оптимизируем программу

c0d3r_0f_shr0d13ng3r

ಥ_ಥ
Пользователь
Регистрация
01.04.2020
Сообщения
466
Реакции
555
Гарант сделки
1
Депозит
0.0086
Использование CRT(C Runtime Library) раздувает выходной EXE файл и добавляет в таблицу импорта(далее IAT) "левые" функции.Сегодня мы "вырежем" CRT и сделаем EXE-шник весом в 1.5 кб у которого полностью будет отсутствовать IAT.

Для начала рассмотрим основные минусы отказа от CRT:

-Невозможность использования стандартных обработчиков ошибок(try / catch)
-Невозможность использования функций C.

Окей, все действия я буду проводить на VS 2019, однако их можно повторить практически на всех VS.

Шаг 1.Отключаем CRT:

Создадим пустой C++ проект и добавим в него файл исходного кода C/C++, пока что не будем его трогать.

Теперь идем в свойства проекта и выставляем следующее:

Компоновщик -> Ввод -> Игнорировать все стандартные библиотеки -> Да (/NODEFAULTLIB)
C/C++ -> Общие -> Проверки SDL -> Нет(/sdl-)
C/C++ -> Создание кода -> Отключить проверку безопасности -> Да(/GS-)
C/C++ -> Создание кода ->Включить C++ Исключения -> Нет
C/C++ -> Создание кода -> Основные проверки времени выполнения -> По умолчанию

Теперь нам необходимо задать кастомную точку входа.Для этого перейдем в Компоновщик -> Дополнительно -> Точка входа .Название точки входа может быть любым.Главное ее обозначить.У меня это будет Entry.
#include <Windows.h> VOID WINAPI Entry(VOID) { //... }

Также можно отключить создание манифеста.Это необязательный шаг, но он позволит сбросить целых 1.5 кб ?

Компоновщик -> Файл манифеста -> Создавать манифест -> Нет(/MANIFEST:NO)

Шаг 2.Включаем оптимизацию(желательно делать на сборке Release):


C/C++ -> Оптимизация -> Максимальная оптимизация (приоритет размера) (/O1)
C/C++ -> Оптимизация -> Предпочитать размер или скорость -> Предпочитать краткость кода (/Os)

Теперь скомпилируем наш проект(x86, Release).Результат:

Размер файла 1.5 кб:

1585730961898.png


DiE определяет нашу программу как написанную на MASM-е:

1585730996968.png


Таблицы импорта нету вообще:

1585731036985.png


Но и это еще не все!

Шаг 3.Кастомный DOS Stub:

В PE файле есть такой заголовок как Dos Stub.Он представляет из себя небольшую DOS программу, которая будет запущена, если кто-то попытается запустить нашу программу на MS-DOS.Мы заменим эту DOS программу на другую, более легкую.

1585731295819.png


Перейдем в Компоновщик -> Командная строка.И введем туда: /stub:custom_dos_stub.bin (предварительно положив custom_dos_stub.bin в папку с проектом)

Собственна все.Теперь DiE не определяет компилятор

1585732215335.png
 

Вложения

  • Project.zip
    3.5 КБ · Просмотры: 189
И как virustotal на такой exe реагирует?
Нормально.В этом нет ничего удивительного.У FASM-а похожий пустой EXE.Возможно 3 детекта(антивирусы не популярные) были из-за кастомного DOS заголовка.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Норм статья.
Но не стоит DOS-заглушку менять на свою, лучше оставить дефолтную.
Некоторые ав некорректно реагируют на подобное (поправьте, если не прав)
 
Норм статья.
Но не стоит DOS-заглушку менять на свою, лучше оставить дефолтную.
Некоторые ав некорректно реагируют на подобное (поправьте, если не прав)
Я уже давал в этом топике ссылку на вт.Результат - 3/71(антивирусы не популярные), однако я соглашусь, можно не менять DOS-заглушку, ничего не теряем.
 
Небольшой эксперимент.Сравнение EXE с кастомной DOS-заглушкой и без:

Без кастомной заглушки: https://www.virustotal.com/gui/file...eb3ce54f9248fc6bb4a53276081e020d08d/detection
С кастомной заглушкой: https://www.virustotal.com/gui/file...58fc7020e2eb5d6f3334752e721ede5ce14/detection

Вывод:

DOS-Заглушка не влияет на детекты, тк результаты одинаковые(3/71).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Небольшой эксперимент.Сравнение EXE с кастомной DOS-заглушкой и без:

Без кастомной заглушки: https://www.virustotal.com/gui/file...eb3ce54f9248fc6bb4a53276081e020d08d/detection
С кастомной заглушкой: https://www.virustotal.com/gui/file...58fc7020e2eb5d6f3334752e721ede5ce14/detection

Вывод:

DOS-Заглушка не влияет на детекты, тк результаты одинаковые(3/71).
Но и толку ее менять нет. Сэкономить пару байт, которые вернутся после морфинга/крипта
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну так и ехе ни чего не делает, добавь MessageBox и будет таблица
Он про то, что нет crt-шного мусора, который подставляется подефолту.
 
Ну так и ехе ни чего не делает, добавь MessageBox и будет таблица
Моя задача была убрать из импорта функции которые добавляются туда из-за использования CRT(например: функции из VCRUNTIME140.DLL).

А что же касается последующих вызовов апи: подразумевается, что читатель(вирмейкер) будет использовать методы скрытия вызовов(Дефолтным LoadLibrary/GetProcAddress или по хэшу)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Извиняюсь за ап темы, но никто не сталкивался с тем, что код с отключенным CRT работает не так, как код со включенным CRT?
У меня есть код, который просто жмет на определенные кнопки через SendInput
Этот код у меня в двух проектах, в одном включен CRT, в другом нет.
С CRT этот код работает как надо, а без нет.

Код написан на чистом WinAPI (без stl и прочего). Буквально две функции.

Компилятор от VS2019. Программу нигде не крашит, ничего аномального не происходит.
Но вот без CRT оно работает некорректно.
 
Извиняюсь за ап темы, но никто не сталкивался с тем, что код с отключенным CRT работает не так, как код со включенным CRT?
У меня есть код, который просто жмет на определенные кнопки через SendInput
Этот код у меня в двух проектах, в одном включен CRT, в другом нет.
С CRT этот код работает как надо, а без нет.

Код написан на чистом WinAPI (без stl и прочего). Буквально две функции.

Компилятор от VS2019. Программу нигде не крашит, ничего аномального не происходит.
Но вот без CRT оно работает некорректно.
У non-crt оч много аномалий, порой крайне не приятных.Тут тебе придется самому все дебажить(смотреть LastError-ы и тд).Увы вот такая обратная сторона у non-crt.Однако вопрос, твой софт юзает COM? Лично у меня не удалось подружить COM и non-crt.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Однако вопрос, твой софт юзает COM? Лично у меня не удалось подружить COM и non-crt.
CoInitializeEx, не помогает?

У non-crt оч много аномалий, порой крайне не приятных.
На самом деле в Цэшной стандратной библиотеке (именно Цэшной, а не Плюсовой) до старта и после выполнения твоего кода не так много то и происходит (ну плюс еще инициализация до старта каждого потока). Надо смотреть конкретные примеры, которые не работают, фиксы должны быть сравнительно простые.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
У non-crt оч много аномалий, порой крайне не приятных.Тут тебе придется самому все дебажить(смотреть LastError-ы и тд).Увы вот такая обратная сторона у non-crt.Однако вопрос, твой софт юзает COM? Лично у меня не удалось подружить COM и non-crt.
Нет. Весь список импортов:
KERNEL32.dll: WriteFile, Sleep, GetStdHandle
USER32.dll: SendInput, FindWindowA, MapVirtualKeyA, GetAsyncKeyState

Больше ничего такого не использую.
 
Нет. Весь список импортов:
KERNEL32.dll: WriteFile, Sleep, GetStdHandle
USER32.dll: SendInput, FindWindowA, MapVirtualKeyA, GetAsyncKeyState

Больше ничего такого не использую.
Странно очень... А в GetStdHandle что передаешь?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Не помогает, скорее всего я что-то не так делаю :\
Ну так выложи код, в котором происходит ошибка, может разберемся, чего гадать то? Если не хочешь выкладывать в паблик какие-то куски, то залей под хайдом, тут многие люди, кто может тебе помочь уже имеют сотни сообщений и сотни лайков, а господа "аверы и менты" (с) не имеют. Ну или в личку мне напиши, у нас вроде раньше была переписка с тобой, до того, как я личку закрыл.
 
Ну так выложи код, в котором происходит ошибка, может разберемся, чего гадать то?
Уже нет необходимости, тк я другой путь нашел(без кома).А если действительно понадобиться, то сам разбираться буду.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх