Использование 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.
Также можно отключить создание манифеста.Это необязательный шаг, но он позволит сбросить целых 1.5 кб ?
Компоновщик -> Файл манифеста -> Создавать манифест -> Нет(/MANIFEST:NO)
Шаг 2.Включаем оптимизацию(желательно делать на сборке Release):
C/C++ -> Оптимизация -> Максимальная оптимизация (приоритет размера) (/O1)
C/C++ -> Оптимизация -> Предпочитать размер или скорость -> Предпочитать краткость кода (/Os)
Теперь скомпилируем наш проект(x86, Release).Результат:
Размер файла 1.5 кб:
DiE определяет нашу программу как написанную на MASM-е:
Таблицы импорта нету вообще:
Но и это еще не все!
Шаг 3.Кастомный DOS Stub:
В PE файле есть такой заголовок как Dos Stub.Он представляет из себя небольшую DOS программу, которая будет запущена, если кто-то попытается запустить нашу программу на MS-DOS.Мы заменим эту DOS программу на другую, более легкую.
Перейдем в Компоновщик -> Командная строка.И введем туда: /stub:custom_dos_stub.bin (предварительно положив custom_dos_stub.bin в папку с проектом)
Собственна все.Теперь DiE не определяет компилятор
Для начала рассмотрим основные минусы отказа от 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 кб:
DiE определяет нашу программу как написанную на MASM-е:
Таблицы импорта нету вообще:
Но и это еще не все!
Шаг 3.Кастомный DOS Stub:
В PE файле есть такой заголовок как Dos Stub.Он представляет из себя небольшую DOS программу, которая будет запущена, если кто-то попытается запустить нашу программу на MS-DOS.Мы заменим эту DOS программу на другую, более легкую.
Перейдем в Компоновщик -> Командная строка.И введем туда: /stub:custom_dos_stub.bin (предварительно положив custom_dos_stub.bin в папку с проектом)
Собственна все.Теперь DiE не определяет компилятор