R0 CREW

Компиляция без CRT

Я хочу изучать реверсинг следующим образом - писать самому себе Crackme и самому же их решать, так можно развиваться сразу и в защите и во взломе.
Когда я начал пробовать заметил, что даже программа void main(){} выполняет кучу ненужного кода, чтобы он не путал меня, я решил выпилить CRT и пользоваться только Winapi.
т.к. Я не пользуюсь самой студией, только компилятором, то скомпилировал программу с опциями /nodefaultlib entery:EntryPoint subsystem:console

В итоге размер программы вышел 1 536 байт. НО…

  1. Я не могу подключить ни одну библиотеку, даже чтобы вызвать exitProcess из windows.h
    Происходит ошибка линковки LNK2019
    : error LNK2019: ссылка на неразрешенный внешний символ __imp_ExitProcess в функции main
    из за чего это может быть ? Без Nodefaultlib все работает нормально
  2. В программе все равно много лишнего.
    Я открыл в x64dbg, а там идет точка входа - xor eax, eax
    следующая строка ret в kernel32.dll
    Тоесть такое ощущение что это никакая не точка входа, стек уже не пустой, функция была из kernel вызвана.
    После ret в kernel где идет call qword ptr ds:[<&RtlExitUserThread>]
    подключается целых 3 dll: nt, kernel, kernelbase
    Может кто то объяснить зачем это все нужно и возможно ли от всего этого избавиться ? То есть программа не должна выполнять код который я не писал? Сделать программу максимально небольшой?
1 Like
  1. Так а вы подключаете kernel32.lib в ручную?
  2. Видимо из-за того что ваша точка входа пустая либо соптимизирована, компилятор поставил просто ret, потому что нет инициализации CRT и другая работа не нужна.

Вот пример как я это делал для DLL, для EXE будут схожие настройки, открывайте vcxproj и сравнивайте

Вообще уточните чем пытаетесь скомпилить и приведите пример точки входа

1 Like

Нет я не подключал. Я не знал, что если отключить то она автоматически перестает линковаться со всеми библиотеками. Даже если не просто -nodefaultlib писать, а явно указывать, чтобы не использовалась CRT.
Включил в линковку kernel32.lib - заработало.
Единственное я так не понял почему у меня кроме kernel32.dll,
другие системные библиотеки подключаются хотя явно я их не указываю. ntdll, kernelbase

Странно что ntdll.dll подключается, она вроде со стандартным SDK не должна подключатся. В любом случае вы можете включить генерацию .map файла (/MAP) во время линковки и изучить по нему что вошло в билд и в качестве какой зависимости, там уже будет видно какой .obj принёс зависимости. Так же можно включить при компиляции подробный вывод asm листинга в файл с помощью ключа /FAcs, тогда можно будет более детально разобрать какой код попал в программу.

1 Like

https://github.com/lurumdare/miniexe пробуйте

Ошибка у вас из-за return 0 думаю который не удалили

1 Like