вторник, 26 января 2016 г.

Программа на Си в 1 КБ

Я покажу как скомпилировать программу на Microsoft Visual Studio 2013, размером в 1Кб.

автор: ice (coru.ws)

====== example 1 ======

Программа будет “сверхсложной”

#include <Windows.h>

void entry(){

}

Для компиляции я буду использовать makefile

SRC=main.cpp
OUT=example1.exe
LIB=ntdll.lib
build:
@cl $(SRC) /Fo./ /c /GS- /Gz /TP /Od /W0 /nologo
@link *.obj /OUT:$(OUT) /NOLOGO /NODEFAULTLIB /SUBSYSTEM:WINDOWS,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIB)
@del *.obj

Немного расскажу о структуре makefile

SRC, OUT, LIB – это переменные и могут называться как захотите

Для инициализации переменной используется такая запись SRC=main.cpp, а если ей захочется воспользоваться то нужно записывать вот в такой форме $(SRC)

Кроме переменных в файле есть метки “build” их может быть тоже сколько душе угодно.

За меткой идут команды, и перед каждой командой в строке должна стоять табуляция.

Параметры компилятора

  • /Fo – опция которая указывает директорию где будут создаваться объектные файлы
  •  /c – компиляция без связывания
  •  /GS- – проверка безопасности буфера отключена
  •  /Gz – stdcall конвенция вызова функций (по желанию)
  •  /TP – С++ язык программирования
  •  /Od – оптимизация отключена
  •  /W0 – уровень предупреждений
  •  /nologo – не выводить логотип

Параметры линкера

  •  /NOLOGO – не выводить логотип
  •  /OUT: – путь до выходного файла
  •  /NODEFAULTLIB – не использовать стандартные библиотеки
  •  /SUBSYSTEM:WINDOWS,5.01 – тип gui программа, с минимальной поддержкой xp
  •  /ENTRY:”entry” – точка входа (иначе студия генерирует свой стаб)
  • /DYNAMICBASE – aslr активировать
  •  /FIXED:No – генерировать релоки

Для компиляции используем nmake, для этого у студии есть батник “VS2013 x86 Native Tools Command Prompt”, запускам его переходим в папку с проектом, и компилируем: nmake build

Вот так выглядит точка входа программы после компиляции, почти как писать на ассемблере)

.00401000: 55 push ebp
.00401001: 8BEC mov ebp,esp
.00401003: 5D pop ebp
.00401004: C3 retn

====== example 2 ======
Немного посложнее программа

#include <Windows.h>

void entry(){
char buf[100];
strcpy(buf,"Hello");
MessageBoxA(0,buf,"Title",0);
}

makefile

SRC=main.cpp
OUT=example2.exe
LIB=user32.lib ntdll.lib
build:
@cl $(SRC) /Fo./ /c /GS- /Gz /TP /Od /W0 /nologo
@link *.obj /OUT:$(OUT) /NOLOGO /NODEFAULTLIB /SUBSYSTEM:WINDOWS,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIB)
@del *.obj

так выглядит после компиляции

.00401000: 55 push ebp
.00401001: 8BEC mov ebp,esp
.00401003: 83EC64 sub esp,064 ;'d'
.00401006: 6810204000 push 000402010 ;'Hello' --↓1
.0040100B: 8D459C lea eax,[ebp][-064]
.0040100E: 50 push eax
.0040100F: E81A000000 call strcpy --↓2
.00401014: 83C408 add esp,8
.00401017: 6A00 push 0
.00401019: 6818204000 push 000402018 ;'Title' --↓3
.0040101E: 8D4D9C lea ecx,[ebp][-064]
.00401021: 51 push ecx
.00401022: 6A00 push 0
.00401024: FF1500204000 call MessageBoxA
.0040102A: 8BE5 mov esp,ebp
.0040102C: 5D pop ebp
.0040102D: C3 retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-

====== example 3 ======
В предыдущих вариантах компилировались программы без отладочных символов, но для отладки в студии они нужны, поэтому был создан более универсальный makefile

SRC=main.cpp
NAME=example3
OUT=$(NAME).exe
DEBUG=debug
RELEASE=release
LIBS=ntdll.lib kernel32.lib user32.lib

bdebug:$(DEBUG)
@cl $(SRC) /Fo$(DEBUG)/ /Fd$(DEBUG)/vc.pdb /c /GS- /Gz /TP /ZI /nologo /W0 /D _DEBUG
@link $(DEBUG)/*.obj /OUT:$(DEBUG)/$(OUT) /PDB:$(DEBUG)/$(NAME).pdb /NOLOGO /NODEFAULTLIB /DEBUG /SUBSYSTEM:CONSOLE,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIBS)
@del $(DEBUG)\*.obj
@del $(DEBUG)\*.idb
$(DEBUG):
@mkdir $(DEBUG) 
brelease:$(RELEASE)
@cl $(SRC) /Fo$(RELEASE)/ /c /GS- /Gz /TP /Od /W0 /nologo
@link $(RELEASE)/*.obj /OUT:$(RELEASE)/$(OUT) /NOLOGO /NODEFAULTLIB /SUBSYSTEM:WINDOWS,5.01 /ENTRY:"entry" /DYNAMICBASE /FIXED:No $(LIBS)
@del $(RELEASE)\*.obj
$(RELEASE):
@mkdir $(RELEASE)

Теперь релизный проект можно компилировать nmake brelease, дебажный nmake bdebug

====== Примеры к статье ======

http://ift.tt/1ZQUw6I

Запись Программа на Си в 1 КБ впервые появилась VxLab.



from VxLab http://ift.tt/202qKRT
via IFTTT

Комментариев нет:

Отправить комментарий