Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Как и всё в этой стране, обнуление написано на PHP, jQuery и (да-да) местами Rust, а управляется supervisord, ибо для редактирования юнитов systemd нужно sudo, который не дали.
В ДИТ обещали избавиться от уязвимости до начала общероссийского голосования, но так этого и не сделали. На заседании рабочей группы 18 июня, Федин обратил на это внимание главы смарт-проектов мэрии Костырко. Чиновник назвал проблему «ошметком» с прошлогоднего исполнения системы и попросил своих коллег из ДИТ проверить, «чтобы эту штуку убирали». Речь идет о фрагменте в исходном коде web-страницы бюллетеня для голосования, с помощью которого можно подключить дополнительный скрипт (программу) и манипулировать любыми элементами страницы.
cообщают «Открытые медиа» https://openmedia.io/news/n3/eksperty-u-organizatorov-elektronnogo-golosovaniya-est-texnicheskaya-vozmozhnost-podtasovyvat-rezultaty/
3. Соглашаемся с условиями и получаем бюллетень. Вот как происходит его выдача, тут происходит несколько переадресаций, видимо, это и есть тот самый "анонимайзер", но спойлер: он ничего не анонимизирует:
POST https://elec.2020og.ru/#complete
Cookie: laravel_session=abcdef123
ответ: HTTP/2 302 Found
location: https://elec.moscow/election/check/ длинная-длинная-цепочка-из-букв-и-цифр=
(на самом деле тут скрыт ваш номер бюллетеня, допустим, 777-ggg-aaa. Как проверить: вставить эту длинную цепочку на сайт https://www.base64decode.org/, раскодировать, потом взять из результата url и еще раз раскодировать. Нас наперстками не проведешь!)
Всего над проектом трудилось больше 10 распределенных команд (около 100 человек) внутри ДИТа без привлечения сторонних специалистов. Из-за сложности задачи мы решили, что каждая из команд будет заниматься разработкой решения в своей части, а на последнем этапе мы сведем все системы воедино с помощью интеграционных, нагрузочных и многофункциональных тестирований.
После общения с технической рабочей группой появилось дополнительное требование к системе — избирателю нужна была возможность проверить, как учитывается его голос в блокчейне.
З.Ы. Ну т.е. если привести реальный пример: ты либо голосуешь на виду у чувака, который проверяет твой паспорт и выдаёт тебе бюллетень, либо голосуешь на виду у чувака, который следит чтобы в урну не насрали. А кабинки где можно от них спрятаться и анонимно поставить галочку нету.
Конкретный алгоритм здесь не имеет никакого значения. Ибо ты будешь гонять свой zero knowledge proof в браузере под присмотром владельца сайта. А это просто иллюзия безопасности.
Т.е. единственное что я пока могу придумать с вебом - это самодостаточная html'ка, которую ты можешь скачать, поревьювить и запустить у себя с локалхоста. Которая через API уже обращается куда надо.
Ну тут суть не в подделке, а в том что сервак и его скрипты видят всё происходящее в браузере. Т.е. сервак в итоге может узнать за кого ты проголосовал. Что уже не анонимно.
И тебе нужны либо автономная хтмлка либо опенсурсная прога чтобы избавиться от влияния сервака и иметь возможность поревьючить код.
Я как всегда нихуя не спал два дня, но мне кажется, что если есть V голосующих, у каждого из которых K атрибутов из N возможных, то при правильном распределении они могут одновременно нечетко идентифицировать себя и предотвратить повторное голосование.
Например, блондинистый распиздяй может прийти и сказать, что он первый распиздяй, который сегодня голосует и получить бюллетень.
Рыжий распиздяй попробует так сказать, но бюллетень уже не получит, как и блондинистый не-распиздяй. Тогда он перейдет к следующему атрибуту, но если кроме "рыжий" и "распиздяй" у него есть третий атрибут, его всё еще невозможно идентифицировать.
Дык нужна реальная проверка личности на фазе "выдачи бюллетеня". Иначе будет явка 1460% ибо любой участник может себе нагенерить сколько угодно виртуальных личностей и проголосовать ими.
Дык атрибуты выдает машина каждому голосующему. Если она выдала первому abc, а второму bcd, то она не сможет идентифицировать предъявившего bc, в то же время знание bc гарантирует, что этот пользователь зарегистрировался как голосующий.
Да, это позволит abc проголосовать сразу за двоих, но не все сразу же, я просто демонстрирую возможность нечеткой идентификации
Но здесь есть другая проблема - этот сервак является точкой доверия и может проголосовать за любого, кто не пришёл на выборы. И ты никак это не проверишь.
Если мы проверяем личность через какой-нибудь ключ на токене, то можно оставить серваку пруф того, что ты действительно получал у него "бюллетень".
А потом сервак публикует лог всех, кто получал "бюллетени". И если ты не голосовал, но внезапно нашёл в этом списке себя, то сервак в жопе - у него нет пруфа с твоей подписью.
Сервак с урной тоже публикует лог. Поэтому ты можешь проверить, что голосов в сумме не больше, чем получавших бюллетени. И можешь найти в этом логе свой голос и проверить его.
Чем больше народу сделает такие проверки - тем больше вероятность, что никто никого не наебал. Как-то так.
А зачем серверу знать, что он подписывает не мусор, а настоящий ключ? Подпись на мусоре — проблема исключительно пользователя, злонамеренно использовать её он нигде не сможет.
А в общем случае слепой подписи ты серваку кидаешь тыщу документов. И он просит дать ключи от 999 из них чтобы убедиться, что в них не хуйня. А потом вслепую подписывает оставшийся. Очень тяжёлый алгоритм, на самом деле.
Ну вот как пример документа, наверное, анонимный чек сойдёт: (рандом, 100 рублей).
Я серваку даю 100 рублей и мешок таких чеков. Он 999 из них вскрывает и убеждается, что там действительно написано "100 рублей". А последний вслепую подписывает.
Теперь я могу этот чек засунуть в какой-нибудь блокчейн для защиты от повторов и анонимно получить товар или услугу.
База паспортов россиян, зарегистрировавшихся для участия в электронном голосовании по поправкам к Конституции РФ, опубликована в открытом доступе. Файл обнаружил телеграм-канал «Утечки информации», внимание на пост которого обратила «Медуза».
«На один из форумов уже выложили базу паспортов (серия/номер) граждан, зарегистрировавшихся для участия в электронном голосовании по поправкам в Конституцию! Конверт в Cronos в свободном доступе», — написали авторы канала. Судя по опубликованному ими скриншоту, в файле также указан регион выдачи паспорта и сведения о том, был ли действителен документ в день голосования.
>> Оказалось, что серия и номер каждого паспорта хешированы по алгоритму SHA-256. Данные для хеширования были представлены в виде одного десятичного числа — между серией и номером паспорта не было пробела.
>> Мы запустили в терминале команду ... и через несколько часов восстановили все серии и номера паспортов
У мну за три минуты hashcat на видюхе перебрал всё (60 MH/s).
> Офтопик. Почему нелегальные базы данных чаще всего распространяются в формате файловой СУБД «Cronos Plus»?
Подтверждаю этот оффтопик. Тоже удивлён, зачем использовать проприетарное тормозящее дерьмо вместо нормального «SQLite» или вообще «CSV».
Для за против софт уже есть давно, и писался не за одну ночь.
Это стихийное говно произошло из-за того, что сначала всем было похуй, а потом друг оказалось, что пресса проводит эксперименты и пытается голосовать на разных участках и комбинировать дистанционное с реальным. Чтобы избежать такой возможности спровоцировать себя в СМИ, сделали базу тех, кто зарегистрировался на Эл. Голосование, чтобы на реальных участках смотреть, не голосовал ли уже человек, и имеет ли право.
Хотели забить да, много кто проголосовал дважды и даже трижды, журналист Дождя например голосовал на участке по прописке, дистанционно и ещё когда к нему на дом приходили с урной, что-то типа такого.
Смешно, что все всерьез обсуждают филькин референдум. Будто кому то не похуй, будто был на свете хоть один человек с мозгом, который реально не мог предсказать результаты этого референдума за пол года
Ни туда, ни сюда: для всех жителей слишком мало (в Москве и в Нижегородской области в сумме в десяток раз больше будет, даже если вычесть детей, не имеющих паспортов), а для зареганных в электронном голосовании многовато (почему-то не верю, что 1,2 млн изъявили желание участвовать в электронном питушении).
во-первых так им и надо, долбоёбам. Если человек настолько глуп, что ходит на фейковый референдум, то он должен страдать.
Во-вторых это многое говорит нам о технической грамотности питухов, делавших госуслуги. Когда вводите туда свой пароль -- помните, что он может случайно оказаться плейнтекстом в файле parol.txt, лежащем в document root
на самом деле пугает действительно такая степень ламерства.
Первокурсник же понимает, что если у тебя в паспорте серия+номер это десять десятиричных цифр, то перебор даже всех вариантов на современном железе это фигня на посном масле
Все равно это нарушение прайваси. Я могу знать твой паспоррт (например, я работаю курьером, и ты мне его показал, чтобы забрать товар), и теперь я знаю -- голосовал ты или нет.
Питушки, можно на пинде ВООБЩЕ не линковаться с CRT? Если да, то будет ли в теории меньше и быстрее?
Я готов работать ТОЛЬКО С Win32API. Что будет с точкой входа?
Какой компилятор интересует? «MSVC»? Тогда у штатного линкера (link.exe) есть ключик /ENTRY:pituh, который назначает точкой входа метку pituh; ключик /NODEFAULTLIB игнорирует список библиотек по умолчанию. У cl.exe ключик /link передаёт аргументы линкеру.
По дефолту у «MSVC» точка входа нацелена на символ _mainCRTStartup, лежащий в crt0.obj или в crtexe.obj, который упакован в стандартную библиотеку. Можешь посмотреть, что эта функция обычно делает.
* Указал /ENTRY:myfun
* Отключил либы /NODEFAULTLIB
* Ругнулось на security_cookie, пришлось отключить Buffer Security Check: /GS-
Отвалились конечно всякие strlen и пр. Без всего этого завелось:)) Думал, будет быстрее (все таки не надо инициализировать CRT), но чото как-то не стало. Видимо совсем это незаметное время занимает на моем компе. Измерял ptime: в винде же нету нормального time, как в unix.
CRT состоит из двух частей. Та часть, что идет студией -- она опенсурсная, да.
Вторая часть идет с виндой.
Вот из за __security_init_cookie я и вынужден был /GS-
А __tmainCRTStartup это то, что я (наивно) пытался избежать, чтобы выиграть время.
Оказалось, что это спички.
А что за вторая часть? msvcr*.dll при динамической линковке? Да вроде у неё общий код со статической библиотекой (там ифдефами всё разруливается).
Кстати, код __security_init_cookie я нашёл. Там снимаются все подряд параметры системы и ксорятся друг с другом, чтобы получилась труднопредсказуемая питушня:
GetSystemTimeAsFileTime(&systime.ft_struct);
#if defined (_WIN64)
cookie = systime.ft_scalar;
#else /* defined (_WIN64) */
cookie = systime.ft_struct.dwLowDateTime;
cookie ^= systime.ft_struct.dwHighDateTime;
#endif /* defined (_WIN64) */
cookie ^= GetCurrentThreadId();
cookie ^= GetCurrentProcessId();
#if _CRT_NTDDI_MIN >= NTDDI_VISTA
#if defined (_WIN64)
cookie ^= (((UINT_PTR)GetTickCount64()) << 56);
#endif /* defined (_WIN64) */
cookie ^= (UINT_PTR)GetTickCount64();
#endif /* _CRT_NTDDI_MIN >= NTDDI_VISTA */
QueryPerformanceCounter(&perfctr);
#if defined (_WIN64)
cookie ^= (((UINT_PTR)perfctr.LowPart << 32) ^ perfctr.QuadPart);
#else /* defined (_WIN64) */
cookie ^= perfctr.LowPart;
cookie ^= perfctr.HighPart;
#endif /* defined (_WIN64) */
/*
* Increase entropy using ASLR relocation
*/
cookie ^= (UINT_PTR)&cookie;
#if defined (_WIN64)
/*
* On Win64, generate a cookie with the most significant word set to zero,
* as a defense against buffer overruns involving null-terminated strings.
* Don't do so on Win32, as it's more important to keep 32 bits of cookie.
*/
cookie &= 0x0000FFFFffffFFFFi64;
#endif /* defined (_WIN64) */
/*
* Make sure the cookie is initialized to a value that will prevent us from
* reinitializing it if this routine is ever called twice.
*/
if (cookie == DEFAULT_SECURITY_COOKIE)
{
cookie = DEFAULT_SECURITY_COOKIE + 1;
}
#if defined (_M_IX86)
else if ((cookie & 0xFFFF0000) == 0)
{
cookie |= ( (cookie|0x4711) << 16);
}
#endif /* defined (_M_IX86) */
The UCRT is now a Windows component, and ships as part of Windows 10. The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK.
Я ходил по сырцам той, что идет с SDK. Видел страшный плюсовый код с лямбдами, и даже наступал в баг: одна функция для запуска внешней программы там расчитывала на наличие переменной с указанием дефолтной папки для диска в блоке переменных окружения. Для программ, запущенных не через cmd в какой-то версии win10 этой переменной не было, и все ебалось. Моя прога падала, если запустить ее через ярлычок на рабочем столе (потому что она запускала питон, а питон дергал ту самую функцию для запуска другой внешней проги) и тогда мне пришлось дебажить CRT:)
Да дебаггеру вообще похуй на язык, на самом деле. Ему маппинга адресов на строки в исходнике хватает.
Ты можешь на основе текстового файла сгенерить сишку, расставить в ней #line со ссылками на исходный текстовик, и прекрасно дебажить его и бряки ставить.
Там ещё есть тонкости, связанные с многопоточной и однопоточной версией, с отладочной и релизной, с гуёвой и соснольной, с уникодной и восьмибитной. Но примерно цепочка вызовов такая.
У меня однопоточная релизная динамическая консольная юникодная.
Кстати, я не пользую wprintf, бо я не хочу превращения wide chars в однобитную хуйню.
Я пишу WriteFile прямо в STD_OUTPUT. Получается двубайтовый LE (бо интел) уникод.
В сосноли это конечно выглдит "в о т т а к", но я читаю выхлоп жабой, а там есть чарсет для 16-LE
Можно, но это скорее для извращений в духе своей операционки или соревнований про демку в 64к.
Для практических задач это не имеет смысла, имхо. Будешь потом жить без деления и т.п.У MS нет четкого разделения между CRT и либой поддержки конпелятора как в том же гцц. Хотя на 64-битке с этим наверное полегче будет чем на 32-битке.
З.ы. И с интринсиками типа memset вдоволь наебешься потом. Будут в рекурсию падать и т.п.
Причём конпелятор их сам юзает иногда чтобы структуры чистить. Или если цикл подходящий по смыслу увидит. Поэтому он может их позвать даже если их в коде явно нигде нет.
Помните, как Линус Торвальдс пердолился, добавляя по одной функции к своей ОС до тех пор, пока у него конпелятор не завёлся? Вот тут будет почти то же самое.
Кстати, а в «MinGW» будет проще отказаться от рантайма? Там же компилятор дёргает только «libgcc», а «libc» не трогает? Или я слишком хорошо о нём думаю?
И в «Шланге» по идее можно провернуть такой же трюк. А вот у прочих компиляторов («Борманд Си», «Ватком Си», «Цифровой Марс») библиотека монолитная, так что для её кастомизации придётся попердолиться.
А действительно, там есть длинное деление, длинное умножение, длинный сдвиг на те случаи, когда одной инструкцией сделать не получается (например, для 64-битных аргументов на 32-битке).
cообщают «Открытые медиа» https://openmedia.io/news/n3/eksperty-u-organizatorov-elektronnogo-golosovaniya-est-texnicheskaya-vozmozhnost-podtasovyvat-rezultaty/
https://github.com/moscow-technologies/blockchain-voting/blob/voting2020/elec2020/ballot/resources/views/election/show.tpl#L14-L16
какой секьюрити )))
POST https://elec.2020og.ru/#complete
Cookie: laravel_session=abcdef123
ответ: HTTP/2 302 Found
location: https://elec.moscow/election/check/ длинная-длинная-цепочка-из-букв-и-цифр=
(на самом деле тут скрыт ваш номер бюллетеня, допустим, 777-ggg-aaa. Как проверить: вставить эту длинную цепочку на сайт https://www.base64decode.org/, раскодировать, потом взять из результата url и еще раз раскодировать. Нас наперстками не проведешь!)
Именно поэтому я за «PHP».
НЕ
ВЫ
НО
СИ
МО
а нахуй был нужен блокчейн без этой функции?
Анонимность уровня /dit.mos.ru/
И это неустранимый недостаток веба.
тогда ванишд
я просто жопой прочитал
И тебе нужны либо автономная хтмлка либо опенсурсная прога чтобы избавиться от влияния сервака и иметь возможность поревьючить код.
Дык не анонимное то вообще тупо. Подписываешь свой голос смарткартой да кидаешь в урну.
Например, блондинистый распиздяй может прийти и сказать, что он первый распиздяй, который сегодня голосует и получить бюллетень.
Рыжий распиздяй попробует так сказать, но бюллетень уже не получит, как и блондинистый не-распиздяй. Тогда он перейдет к следующему атрибуту, но если кроме "рыжий" и "распиздяй" у него есть третий атрибут, его всё еще невозможно идентифицировать.
Да, это позволит abc проголосовать сразу за двоих, но не все сразу же, я просто демонстрирую возможность нечеткой идентификации
Ты генеришь уникальный ключ. Сервак проверяет твою личность и вслепую, не видя этого ключа, подписывает его (по сути там 2 слоя RSA).
Теперь ты просто ждёшь несколько часов, подписываешь свой голос этим ключом и отправляешь его на сервак.
З.Ы. Но это, наверное, уже никак не решить.
А потом сервак публикует лог всех, кто получал "бюллетени". И если ты не голосовал, но внезапно нашёл в этом списке себя, то сервак в жопе - у него нет пруфа с твоей подписью.
Сервак с урной тоже публикует лог. Поэтому ты можешь проверить, что голосов в сумме не больше, чем получавших бюллетени. И можешь найти в этом логе свой голос и проверить его.
Чем больше народу сделает такие проверки - тем больше вероятность, что никто никого не наебал. Как-то так.
То-есть если 86% людей срало-ебало голосование, то проверить что либо невозможно?
Поскольку голосование анонимное, ты кроме своего голоса или отказа ничего проверить не можешь.
А если я не проверил, то можно наврать, да?
Если ты голосовал, то ты можешь проверить, что твой голос учтён правильно.
Если тебе похуй - то за тебя могут приписать что угодно. И без твоей помощи никто это не проверит т.к. голосование анонимное.
А как он проверяет мою личность?
Если он проверяет ее посредством публичного ключа, то что мешает ему запомнить кому он какой билютень выдал?
Смарт-картой наверное. Других способов я не вижу. Смски и пароли - хуйня без неотрекаемости.
> запомнить
Дык алгоритм слепой подписи. Он не знает, какой именно ключ он подписал формируя твой бюллетень.
1. знать, что это не мусор, а настоящий ключ
2. не знать, что это за ключ
А в общем случае слепой подписи ты серваку кидаешь тыщу документов. И он просит дать ключи от 999 из них чтобы убедиться, что в них не хуйня. А потом вслепую подписывает оставшийся. Очень тяжёлый алгоритм, на самом деле.
Или он не сможет потом по биллютеню узнать этот документ?
Ну само собой "документ" - это не вордовский файл. Осмысленный документ вслепую не подписать.
Это скорее про какие-нибудь ключи, сертификаты и прочую криптографическую хуйню.
Я серваку даю 100 рублей и мешок таких чеков. Он 999 из них вскрывает и убеждается, что там действительно написано "100 рублей". А последний вслепую подписывает.
Теперь я могу этот чек засунуть в какой-нибудь блокчейн для защиты от повторов и анонимно получить товар или услугу.
Он не может его расшифровать.
Но он может запомнить этот набор байт.
Или он потом не сможет по нему расшифровать мой бюллитень?
мокака поняла
нужно зашифровать сообщение, и послать его на подпись, а затем убрать шифр.
Не самый простой для понимания прот
- в сову играл штоле?
--Мне знакомый сервер сломал
--Хакер?
--Да нет, мудак..
«На один из форумов уже выложили базу паспортов (серия/номер) граждан, зарегистрировавшихся для участия в электронном голосовании по поправкам в Конституцию! Конверт в Cronos в свободном доступе», — написали авторы канала. Судя по опубликованному ими скриншоту, в файле также указан регион выдачи паспорта и сведения о том, был ли действителен документ в день голосования.
https://meduza.io/feature/2020/07/09/vlasti-fakticheski-vylozhili-v-otkrytyy-dostup-personalnye-dannye-vseh-internet-izbirateley
https://web.archive.org/web/20200701074010/checkvoter.gosuslugi.ru/degvoter.zip
Обратите внимание на домен.
У мну за три минуты hashcat на видюхе перебрал всё (60 MH/s).
Офтопик. Почему нелегальные базы данных чаще всего распространяются в формате файловой СУБД «Cronos Plus»?
Подтверждаю этот оффтопик. Тоже удивлён, зачем использовать проприетарное тормозящее дерьмо вместо нормального «SQLite» или вообще «CSV».
У меня в нулевых была база телефонов на кроносе, на рынке купленная.
Там надо было еще FILES=200, иначе дос не мог столько файлов открыть
https://xss.is/threads/39453/
obnulenie.rar, ха-ха-ха.
https://github.com/occrp/cronosparser
https://xss.is/threads/39445/#post-241723
5 метров в архиве, 20 после распаковки.
1 190 720 записей.
Для скачивания нужна регистрация на форуме. Регистрация у меня заняла меньше минуты.
Стоит единица - воспользовался возможностью проголосовать
Если за/против - был бы пиздец.
Это стихийное говно произошло из-за того, что сначала всем было похуй, а потом друг оказалось, что пресса проводит эксперименты и пытается голосовать на разных участках и комбинировать дистанционное с реальным. Чтобы избежать такой возможности спровоцировать себя в СМИ, сделали базу тех, кто зарегистрировался на Эл. Голосование, чтобы на реальных участках смотреть, не голосовал ли уже человек, и имеет ли право.
Эм, а это точно база зареганных, а не вообще всех жителей?)
Во-вторых это многое говорит нам о технической грамотности питухов, делавших госуслуги. Когда вводите туда свой пароль -- помните, что он может случайно оказаться плейнтекстом в файле parol.txt, лежащем в document root
Первокурсник же понимает, что если у тебя в паспорте серия+номер это десять десятиричных цифр, то перебор даже всех вариантов на современном железе это фигня на посном масле
Голый номер паспорта никому не интересен так то. Без привязки к какой-то ещё инфе.
Я готов работать ТОЛЬКО С Win32API. Что будет с точкой входа?
Разбери устройство CRT, тогда поймёшь.
Какой компилятор интересует? «MSVC»? Тогда у штатного линкера (link.exe) есть ключик /ENTRY:pituh, который назначает точкой входа метку pituh; ключик /NODEFAULTLIB игнорирует список библиотек по умолчанию. У cl.exe ключик /link передаёт аргументы линкеру.
По дефолту у «MSVC» точка входа нацелена на символ _mainCRTStartup, лежащий в crt0.obj или в crtexe.obj, который упакован в стандартную библиотеку. Можешь посмотреть, что эта функция обычно делает.
https://docs.microsoft.com/ru-ru/cpp/build/reference/entry-entry-point-symbol?view=vs-2019
https://stackoverflow.com/questions/22934206/what-is-the-difference-between-main-and-maincrtstartup
С божественной сишечкой в принципе можно работать, но без argc, argv — их придётся доставать через API (GetCommandLine), без SEH.
С крестами будет жопа. Тебе придётся писать свою CRT.
* Указал /ENTRY:myfun
* Отключил либы /NODEFAULTLIB
* Ругнулось на security_cookie, пришлось отключить Buffer Security Check: /GS-
Отвалились конечно всякие strlen и пр. Без всего этого завелось:)) Думал, будет быстрее (все таки не надо инициализировать CRT), но чото как-то не стало. Видимо совсем это незаметное время занимает на моем компе. Измерял ptime: в винде же нету нормального time, как в unix.
Реальный пример точки входа из CRT (после препроцессирования, чтобы влезло в 2 к символов):
Да, именно отсюда зовётся main: А что происходит перед его вызовом, ты видишь.
Вторая часть идет с виндой.
Вот из за __security_init_cookie я и вынужден был /GS-
А __tmainCRTStartup это то, что я (наивно) пытался избежать, чтобы выиграть время.
Оказалось, что это спички.
Кстати, код __security_init_cookie я нашёл. Там снимаются все подряд параметры системы и ксорятся друг с другом, чтобы получилась труднопредсказуемая питушня:
The UCRT is now a Windows component, and ships as part of Windows 10. The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK.
Я ходил по сырцам той, что идет с SDK. Видел страшный плюсовый код с лямбдами, и даже наступал в баг: одна функция для запуска внешней программы там расчитывала на наличие переменной с указанием дефолтной папки для диска в блоке переменных окружения. Для программ, запущенных не через cmd в какой-то версии win10 этой переменной не было, и все ебалось. Моя прога падала, если запустить ее через ярлычок на рабочем столе (потому что она запускала питон, а питон дергал ту самую функцию для запуска другой внешней проги) и тогда мне пришлось дебажить CRT:)
_wspawnv, =C:
Я показал фрагменты из какой-то древней студии, последнюю не копал.
Где ещё такое чудо, где ещё такой прогресс?
При том, что есть ``PATHEXT``, то-есь знание о расшырении зашито в разных местах.
>traits::tcscpy_s
А вот если я такой сишник-няшник, дебажу свой код, и вдруг прихожу дебагом к крестовне, и у меня случается багор
Ты можешь на основе текстового файла сгенерить сишку, расставить в ней #line со ссылками на исходный текстовик, и прекрасно дебажить его и бряки ставить.
Я сижу на брекпоинте в визуальном дебагере, углуюляюсь в код, прихожу в стандратную библиотеку, и вижу там C++
Если я пишу на чистом си, то я как-то ожидаю в стандартной библиотеке тоже видеть только си, не?
ABI соблюдается, сишные хедера тебе выдали. Остальное - деталь реализации, на которую всем пофиг.
Теперь будет работать быстрее.
scanf подождёт непустого ввода
лучше буквы ввести
UPD: на ванишед ответил
Там ещё есть тонкости, связанные с многопоточной и однопоточной версией, с отладочной и релизной, с гуёвой и соснольной, с уникодной и восьмибитной. Но примерно цепочка вызовов такая.
Думай, много или мало времени это может отнять.
Кстати, я не пользую wprintf, бо я не хочу превращения wide chars в однобитную хуйню.
Я пишу WriteFile прямо в STD_OUTPUT. Получается двубайтовый LE (бо интел) уникод.
В сосноли это конечно выглдит "в о т т а к", но я читаю выхлоп жабой, а там есть чарсет для 16-LE
pitux time?
Для практических задач это не имеет смысла, имхо. Будешь потом жить без деления и т.п.У MS нет четкого разделения между CRT и либой поддержки конпелятора как в том же гцц. Хотя на 64-битке с этим наверное полегче будет чем на 32-битке.
Причём конпелятор их сам юзает иногда чтобы структуры чистить. Или если цикл подходящий по смыслу увидит. Поэтому он может их позвать даже если их в коде явно нигде нет.
А список особо и не нужен. Популярные довольно быстро понадобятся, а остальные скорее всего никогда.
Это мы предупреждаем компилятор, что будем реализовывать memset, чтобы он в рекурсию не свалился?
https://docs.microsoft.com/en-us/cpp/preprocessor/function-c-cpp?view=vs-2019
А заодно вот это:
https://docs.microsoft.com/en-us/cpp/preprocessor/intrinsic?view=vs-2019
И в «Шланге» по идее можно провернуть такой же трюк. А вот у прочих компиляторов («Борманд Си», «Ватком Си», «Цифровой Марс») библиотека монолитная, так что для её кастомизации придётся попердолиться.
В гцц кстати у меня получалось даже поддержку исключений прикрутить. Она там неплохо отвязана от рантайма и прочей сишности.