Для вывода на консоль hello world
можно создать исполняемый файл с текстовым разделом (т. Е. Разделом, в котором находится исполняемый код) менее 100 байт, но размер .EXE-файла будет больше, посколькуимеют правильную структуру формата PE, и этот формат требует небольшого дополнения. /NODEFAULT
, конечно, даст вам ошибки. Затем вам придется переопределить то, чего не хватает, обычно делая вещи неактивными, и вам нужно будет использовать генерацию кода во время соединения, чтобы убрать все вызовы пустых функций (а также сами функции). Вам также нужно найти флаги компилятора, которые отключают все «классные» функции. Например, чтобы компилятор прекратил отправлять проверки безопасности буфера (__security_check_cookie
и др.), Укажите опцию /GS-
.
Возможно, вам понадобится специальный инструмент, чтобы полностьюудалите файл .EXE из ненужного PE Cruft, который испускает компоновщик VS. И ваш исполняемый файл по-прежнему будет связан по крайней мере с KERNEL32.DLL, поскольку без этого вы не сможете ничего полезного. Если вы храбры, вы можете напрямую использовать NTDLL.DLL (то есть собственный API), но для этого, вероятно, потребуется более 100 байт кода.
Ваш исполняемый файл также должен быть нацелен на 32-разрядную версию. архитектура;64-битная будет примерно на 25% больше (для таких небольших размеров сечений).
Это хороший вызов.