Имеем на точке входа при использовании CRT следующий код Код (Text): .text:0040121E E8 23 15 00 00 call ___security_init_cookie .text:00401223 E9 40 FE FF FF jmp ___tmainCRTStartup можно ли избавится от этой фичи? /GS- заюзал - толку 0
поскольку это код из CRT, избавиться от него можно, либо совсем отказавшись от CRT, либо написав свои функции wWinMainCRTStartup(), wmainCRTStartup(), WinMainCRTStartup(), mainCRTStartup(), _DllMainCRTStartup(). их можно слинковать в библиотеку и подключить перед msvcrt.lib и libcmt.lib. примерное содержимое функций: Код (Text): //__security_init_cookie(); // [do not] init cookie _initterm_e(__xi_a, __xi_z); // process C initializers _initterm(__xc_a, __xc_z); // process C++ initializers result = WinMain(); _initterm_rev(atexit_cur, atexit_funcs); // process static destructors list _initterm(__xp_a, __xp_z); // process C pre-terminators _initterm(__xt_a, __xt_z); // process C terminators ExitProcess(result); подробности можете увидеть в <crt0.c>, <crt0init.c>. кстати, __security_cookie используется не только для установки и проверки GSCookie, но и для EHCookie, а также для "кодирования" указателя на EH4_SCOPETABLE в функциях, использующих SEH. хотя, конечно, ничто не мешает изначально установить __security_cookie в нуль.
CRT нужна, ни о каком переименовании точки входа и отказа от CRT речь не может идти, просто я думал может какой ключ или дефайн отключает сию "фичу" типа #define _CRT_SECURE_NO_DEPRECATE (не пробовал еще)
Ну не знаю, у меня снятие флажка buffer security check убирает это. уж не помню опция ли это /GS- или нет
J0E ага, если /GS выключен, то seh3 используется (хотя такое ощущение, что не всегда). но код CRT скомпилирован с использованием /GS, так что seh4 тоже будет использован (пусть seh4 и состоит на 30% из seh3 и на 70% – из паранойи). а, __security_cookie проверяется даже в seh3 – в том случае, если исключение произойдёт во время раскрутки (unwinding). Asterix убрать это – равносильно тому, что убрать несколько начальных инструкций из любой уже скомпилированной функции. ведь это не какая-нибудь заглушка, генерируемая компилятором, это обыкновенная функция из msvcrt.lib\libcmt.lib. точнее, несколько функций: #2. тут, конечно, можно было бы попробовать сказать линкеру: "/ENTRY:__tmainCRTStartup", но __tmainCRTStartup() объявлена и скомпилирована как static (не extern). так что линкер её в этом случае просто не найдёт. Great мне кажется, вы что-то путаете =) наверное, установка /GS- просто совпала с переопределением точки входа. Asterix в общем, чтобы изменить внутренности скомпилированной функции, придётся переписать функцию =)
Asterix Ну вообще-то это не маразмы, а достаточно полезные проверки на переполнение стека. И если автору они не нужны, то это не значит, что они плохие) Просто ему не надо
Great любые полезные нововведения должны отключаться, например выбором другой CRT скомпиленной без этой "фичи"
Однако, нет. Но ты прав. что это было не единственное действие. Кроме снятия GS я еще и заменил родную CRT 9й студии на CRT 6й студии, чтобы импорт был из соответствующей msvcrt.dll, входящей в комплект винды. А в ней нет и никогда не было поддержки buffer security check, поэтому её _mainCRTStartup не содержит такого кода
Asterix Как вариант, можно реализовать всё связанное с куками (__security_init_cookie, gs_report_failure, ...), у себя как заглушки. Куки реализованы в отдельных модулях, так что должно прокатить. Для профилактики можно эти obj совсем из libcmt выкинуть.