Избавится от call ___security_init_cookie

Тема в разделе "WASM.WIN32", создана пользователем Asterix, 26 июн 2009.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Имеем на точке входа при использовании CRT следующий код
    Код (Text):
    1. .text:0040121E E8 23 15 00 00                                call    ___security_init_cookie
    2. .text:00401223 E9 40 FE FF FF                                jmp     ___tmainCRTStartup
    можно ли избавится от этой фичи?
    /GS- заюзал - толку 0
     
  2. catwalk_mission

    catwalk_mission New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    19
    поскольку это код из CRT, избавиться от него можно, либо совсем отказавшись от CRT, либо написав свои функции wWinMainCRTStartup(), wmainCRTStartup(), WinMainCRTStartup(), mainCRTStartup(), _DllMainCRTStartup(). их можно слинковать в библиотеку и подключить перед msvcrt.lib и libcmt.lib.
    примерное содержимое функций:
    Код (Text):
    1. //__security_init_cookie();      // [do not] init cookie
    2.  
    3. _initterm_e(__xi_a, __xi_z);     // process C initializers
    4. _initterm(__xc_a, __xc_z);       // process C++ initializers
    5.  
    6. result = WinMain();
    7.  
    8. _initterm_rev(atexit_cur, atexit_funcs); // process static destructors list
    9. _initterm(__xp_a, __xp_z);       // process C pre-terminators
    10. _initterm(__xt_a, __xt_z);       // process C terminators
    11.  
    12. ExitProcess(result);
    подробности можете увидеть в <crt0.c>, <crt0init.c>.
    кстати, __security_cookie используется не только для установки и проверки GSCookie, но и для EHCookie, а также для "кодирования" указателя на EH4_SCOPETABLE в функциях, использующих SEH. хотя, конечно, ничто не мешает изначально установить __security_cookie в нуль.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    /ENTRY:WinMain
     
  4. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    С /GS- опцией кампиль вроде должен использовать SEH старой версии?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    CRT нужна, ни о каком переименовании точки входа и отказа от CRT речь не может идти,
    просто я думал может какой ключ или дефайн отключает сию "фичу"
    типа #define _CRT_SECURE_NO_DEPRECATE (не пробовал еще)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну не знаю, у меня снятие флажка buffer security check убирает это.
    уж не помню опция ли это /GS- или нет
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    да, но не убирает если юзать CRT
     
  8. catwalk_mission

    catwalk_mission New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    19
    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
    в общем, чтобы изменить внутренности скомпилированной функции, придётся переписать функцию =)
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    catwalk_mission
    есть радикальное средство, поставить VS NET 2003, кажется там не было этих маразмов.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Asterix
    Ну вообще-то это не маразмы, а достаточно полезные проверки на переполнение стека. И если автору они не нужны, то это не значит, что они плохие) Просто ему не надо
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Great
    любые полезные нововведения должны отключаться, например выбором другой
    CRT скомпиленной без этой "фичи"
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Однако, нет. Но ты прав. что это было не единственное действие.
    Кроме снятия GS я еще и заменил родную CRT 9й студии на CRT 6й студии, чтобы импорт был из соответствующей msvcrt.dll, входящей в комплект винды.
    А в ней нет и никогда не было поддержки buffer security check, поэтому её _mainCRTStartup не содержит такого кода
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    забыл сказать, у меня юзается статическая либа, ключ /MT
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Asterix
    Если используешь статическую CRT, то пересобери crt0.obj из исходников.
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    green
    тупо пересобрать или нужно сорцы править, если править то некошерно
     
  16. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Asterix
    Ну можно в ком. строке компилятора добавить /D__security_init_cookie=__noop.
    :derisive:
     
  17. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Asterix
    Как вариант, можно реализовать всё связанное с куками (__security_init_cookie, gs_report_failure, ...), у себя как заглушки. Куки реализованы в отдельных модулях, так что должно прокатить.
    Для профилактики можно эти obj совсем из libcmt выкинуть.
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А можно заюзать старую CRT )