"PHP" / Говнокод #26781 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
https://github.com/moscow-technologies/blockchain-voting/tree/voting2020/elec2020/ballot
https://github.com/moscow-technologies/blockchain-voting/blob/voting2020/elec2020/ballot/public/js/forms/mgik/LeavingPageCheckerInit.js
https://github.com/moscow-technologies/blockchain-voting/blob/voting2020/elec2020/frontend-library-source/crypto-lib/src/util/numberFromLeBytes.js

Как и всё в этой стране, обнуление написано на PHP, jQuery и (да-да) местами Rust, а управляется supervisord, ибо для редактирования юнитов systemd нужно sudo, который не дали.

Какой блокчейн )))

Запостил: Fike Fike, (Updated )

Комментарии (137) RSS

  • В ДИТ обещали избавиться от уязвимости до начала общероссийского голосования, но так этого и не сделали. На заседании рабочей группы 18 июня, Федин обратил на это внимание главы смарт-проектов мэрии Костырко. Чиновник назвал проблему «ошметком» с прошлогоднего исполнения системы и попросил своих коллег из ДИТ проверить, «чтобы эту штуку убирали». Речь идет о фрагменте в исходном коде web-страницы бюллетеня для голосования, с помощью которого можно подключить дополнительный скрипт (программу) и манипулировать любыми элементами страницы.
    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

    какой секьюрити )))
    Ответить
    • 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 и еще раз раскодировать. Нас наперстками не проведешь!)
      Ответить
  • >> обнуление написано на PHP

    Именно поэтому я за «PHP».
    Ответить
  • Всего над проектом трудилось больше 10 распределенных команд (около 100 человек) внутри ДИТа без привлечения сторонних специалистов. Из-за сложности задачи мы решили, что каждая из команд будет заниматься разработкой решения в своей части, а на последнем этапе мы сведем все системы воедино с помощью интеграционных, нагрузочных и многофункциональных тестирований.

    НЕ
    ВЫ
    НО
    СИ
    МО
    Ответить
      • После общения с технической рабочей группой появилось дополнительное требование к системе — избирателю нужна была возможность проверить, как учитывается его голос в блокчейне.

        а нахуй был нужен блокчейн без этой функции?
        Ответить
        • У них точно есть блокчейн или это просто модное слово типа датамайнинга бигдаты?
          Ответить
          • возможно, им просто не рассказали про технологию «система управления базой данных»
            Ответить
            • Олимпиадники такой технологией не пользуются. Можно открыть исходник сайта функцией fopen и в нём поправить данные.
              Ответить
  • Анонимайзер генерирует ссылку и доступ к анонимному бюллетеню через личный кабинет mos.ru: такая ссылка создается всего один раз.

    Анонимность уровня /dit.mos.ru/
    Ответить
    • Настоящее анонимное голосование через веб невозможно сделать. По определению. Ибо в вебе нет доверенной зоны, в которую не может подсмотреть сайт.
      Ответить
      • З.Ы. Ну т.е. если привести реальный пример: ты либо голосуешь на виду у чувака, который проверяет твой паспорт и выдаёт тебе бюллетень, либо голосуешь на виду у чувака, который следит чтобы в урну не насрали. А кабинки где можно от них спрятаться и анонимно поставить галочку нету.

        И это неустранимый недостаток веба.
        Ответить
      • Вообще есть zero knowledge proof и всё такое. Но не то чтобы я в этом понимал чего.
        Ответить
        • Конкретный алгоритм здесь не имеет никакого значения. Ибо ты будешь гонять свой zero knowledge proof в браузере под присмотром владельца сайта. А это просто иллюзия безопасности.
          Ответить
        • Т.е. единственное что я пока могу придумать с вебом - это самодостаточная html'ка, которую ты можешь скачать, поревьювить и запустить у себя с локалхоста. Которая через API уже обращается куда надо.
          Ответить
          • [-------]а, вы хотите анонимное

            тогда ванишд
            я просто жопой прочитал
            Ответить
            • Ну тут суть не в подделке, а в том что сервак и его скрипты видят всё происходящее в браузере. Т.е. сервак в итоге может узнать за кого ты проголосовал. Что уже не анонимно.

              И тебе нужны либо автономная хтмлка либо опенсурсная прога чтобы избавиться от влияния сервака и иметь возможность поревьючить код.
              Ответить
            • > вы хотите анонимное

              Дык не анонимное то вообще тупо. Подписываешь свой голос смарткартой да кидаешь в урну.
              Ответить
        • Я как всегда нихуя не спал два дня, но мне кажется, что если есть V голосующих, у каждого из которых K атрибутов из N возможных, то при правильном распределении они могут одновременно нечетко идентифицировать себя и предотвратить повторное голосование.

          Например, блондинистый распиздяй может прийти и сказать, что он первый распиздяй, который сегодня голосует и получить бюллетень.
          Рыжий распиздяй попробует так сказать, но бюллетень уже не получит, как и блондинистый не-распиздяй. Тогда он перейдет к следующему атрибуту, но если кроме "рыжий" и "распиздяй" у него есть третий атрибут, его всё еще невозможно идентифицировать.
          Ответить
          • Дык нужна реальная проверка личности на фазе "выдачи бюллетеня". Иначе будет явка 1460% ибо любой участник может себе нагенерить сколько угодно виртуальных личностей и проголосовать ими.
            Ответить
            • Дык атрибуты выдает машина каждому голосующему. Если она выдала первому abc, а второму bcd, то она не сможет идентифицировать предъявившего bc, в то же время знание bc гарантирует, что этот пользователь зарегистрировался как голосующий.
              Да, это позволит abc проголосовать сразу за двоих, но не все сразу же, я просто демонстрирую возможность нечеткой идентификации
              Ответить
              • Да есть на самом деле очень простой вариант со слепой подписью.

                Ты генеришь уникальный ключ. Сервак проверяет твою личность и вслепую, не видя этого ключа, подписывает его (по сути там 2 слоя RSA).

                Теперь ты просто ждёшь несколько часов, подписываешь свой голос этим ключом и отправляешь его на сервак.
                Ответить
                • А кто будет проверять, что я не нагенерил 146 уникальных ключей?
                  Ответить
                  • Дык тебе второй не подпишут. Сервак проверяющий личность же помнит кому он уже подписывал.
                    Ответить
                  • Но здесь есть другая проблема - этот сервак является точкой доверия и может проголосовать за любого, кто не пришёл на выборы. И ты никак это не проверишь.

                    З.Ы. Но это, наверное, уже никак не решить.
                    Ответить
                    • Если мы проверяем личность через какой-нибудь ключ на токене, то можно оставить серваку пруф того, что ты действительно получал у него "бюллетень".

                      А потом сервак публикует лог всех, кто получал "бюллетени". И если ты не голосовал, но внезапно нашёл в этом списке себя, то сервак в жопе - у него нет пруфа с твоей подписью.

                      Сервак с урной тоже публикует лог. Поэтому ты можешь проверить, что голосов в сумме не больше, чем получавших бюллетени. И можешь найти в этом логе свой голос и проверить его.

                      Чем больше народу сделает такие проверки - тем больше вероятность, что никто никого не наебал. Как-то так.
                      Ответить
                      • >Чем больше народу сделает такие проверки
                        То-есть если 86% людей срало-ебало голосование, то проверить что либо невозможно?
                        Ответить
                        • Эм, ну да. Можно с чистой совестью 146% написать раз всем всё равно похуй.

                          Поскольку голосование анонимное, ты кроме своего голоса или отказа ничего проверить не можешь.
                          Ответить
                          • то-есть смысл схемы в том, что я могу проверить, что за меня не проголосовали.

                            А если я не проверил, то можно наврать, да?
                            Ответить
                            • Если ты не голосовал, то ты можешь проверить, что за тебя не проголосовали.
                              Если ты голосовал, то ты можешь проверить, что твой голос учтён правильно.

                              Если тебе похуй - то за тебя могут приписать что угодно. И без твоей помощи никто это не проверит т.к. голосование анонимное.
                              Ответить
                • >. Сервак проверяет твою личность и вслепую, не видя этого ключа
                  А как он проверяет мою личность?

                  Если он проверяет ее посредством публичного ключа, то что мешает ему запомнить кому он какой билютень выдал?
                  Ответить
                  • > как он проверяет мою личность

                    Смарт-картой наверное. Других способов я не вижу. Смски и пароли - хуйня без неотрекаемости.

                    > запомнить

                    Дык алгоритм слепой подписи. Он не знает, какой именно ключ он подписал формируя твой бюллетень.
                    Ответить
                    • Видимо, мне надо почитать про слепую подпись, потому что я пока не очень понимаю как можно что-то подписать так, чтобы

                      1. знать, что это не мусор, а настоящий ключ
                      2. не знать, что это за ключ
                      Ответить
                      • А зачем серверу знать, что он подписывает не мусор, а настоящий ключ? Подпись на мусоре — проблема исключительно пользователя, злонамеренно использовать её он нигде не сможет.
                        Ответить
                        • Ну в данном случае да.

                          А в общем случае слепой подписи ты серваку кидаешь тыщу документов. И он просит дать ключи от 999 из них чтобы убедиться, что в них не хуйня. А потом вслепую подписывает оставшийся. Очень тяжёлый алгоритм, на самом деле.
                          Ответить
                          • А что мешает ему прочитать этот документ и сохранить его у себя?

                            Или он не сможет потом по биллютеню узнать этот документ?
                            Ответить
                            • Ну он видел другие 999. А тот, который ты будешь публиковать - не видел.

                              Ну само собой "документ" - это не вордовский файл. Осмысленный документ вслепую не подписать.

                              Это скорее про какие-нибудь ключи, сертификаты и прочую криптографическую хуйню.
                              Ответить
                            • Ну вот как пример документа, наверное, анонимный чек сойдёт: (рандом, 100 рублей).

                              Я серваку даю 100 рублей и мешок таких чеков. Он 999 из них вскрывает и убеждается, что там действительно написано "100 рублей". А последний вслепую подписывает.

                              Теперь я могу этот чек засунуть в какой-нибудь блокчейн для защиты от повторов и анонимно получить товар или услугу.
                              Ответить
                              • а почему вслепую? почему он не может его прочитать? что ему мешает?
                                Ответить
                                • Он не знает ключ для этого документа. Для остальных 999 он у тебя ключ попросил, а для этого - нет.
                                  Ответить
                                  • хорошо. Документ для него просто набор байт, верно?
                                    Он не может его расшифровать.

                                    Но он может запомнить этот набор байт.
                                    Или он потом не сможет по нему расшифровать мой бюллитень?
                                    Ответить
                                  • а , все
                                    мокака поняла

                                    нужно зашифровать сообщение, и послать его на подпись, а затем убрать шифр.

                                    Не самый простой для понимания прот
                                    Ответить
                                    • Сестрёнка, я тебе банан принесла. Мы же в зоопарке сидим, да? Я же знаю, что в зоопарке звери не едят целый день. Вот банан тебе принесла.
                                      Ответить
                                        • И даже сосны –— ели. На каком-то сайте был даже совет сажать лиственницы: их точно не спиздят под Новый год.
                                          Ответить
          • > Я как всегда нихуя не спал два дня
            - в сову играл штоле?
            Ответить
  • База паспортов россиян, зарегистрировавшихся для участия в электронном голосовании по поправкам к Конституции РФ, опубликована в открытом доступе. Файл обнаружил телеграм-канал «Утечки информации», внимание на пост которого обратила «Медуза».

    «На один из форумов уже выложили базу паспортов (серия/номер) граждан, зарегистрировавшихся для участия в электронном голосовании по поправкам в Конституцию! Конверт в Cronos в свободном доступе», — написали авторы канала. Судя по опубликованному ими скриншоту, в файле также указан регион выдачи паспорта и сведения о том, был ли действителен документ в день голосования.
    Ответить
        • Уже поняли как "зашифрованы" номера паспортов в базе? Пример 49ea4a862462fe36b2a3dc69af30997cece13f5b c5934766f03f846163944b79
          Ответить
          • >> Оказалось, что серия и номер каждого паспорта хешированы по алгоритму SHA-256. Данные для хеширования были представлены в виде одного десятичного числа — между серией и номером паспорта не было пробела.
            Ответить
            • >> Мы запустили в терминале команду ... и через несколько часов восстановили все серии и номера паспортов
              У мну за три минуты hashcat на видюхе перебрал всё (60 MH/s).
              Ответить
                • Если они попытались запустить перебор на ноутбуке, то у них и выбора не было...

                  Офтопик. Почему нелегальные базы данных чаще всего распространяются в формате файловой СУБД «Cronos Plus»?
                  Ответить
                  • > Офтопик. Почему нелегальные базы данных чаще всего распространяются в формате файловой СУБД «Cronos Plus»?
                    Подтверждаю этот оффтопик. Тоже удивлён, зачем использовать проприетарное тормозящее дерьмо вместо нормального «SQLite» или вообще «CSV».
                    Ответить
                    • Потому что госконторы ее используют

                      У меня в нулевых была база телефонов на кроносе, на рынке купленная.
                      Ответить
                      • У меня валяется база паспортного стола по городу от 2006 года в формате MSM вместе с прогой под ДОС.
                        Ответить
                        • Кстати а для этих легаси форматов бывает экспорт во что-то более понятное и современное? Или надо прям с древней СУБД пердолиться чтобы что-то найти?
                          Ответить
                            • ну у меня была база 99го года на фоксе
                              Там надо было еще FILES=200, иначе дос не мог столько файлов открыть
                              Ответить
                          • MSM это какая-то шняга. Там все в одном файле, таблиц нет, есть глобали. Структура базы по сути в коде описана.
                            Ответить
                        • Что там слили хочу посмотреть в расшифрованном виде.
                          Ответить
                          • Вот тут есть в CSV расшифрованные номера паспортов и поле для галочки:
                            https://xss.is/threads/39445/#post-241723

                            5 метров в архиве, 20 после распаковки.

                            1 190 720 записей.

                            Для скачивания нужна регистрация на форуме. Регистрация у меня заняла меньше минуты.
                            Ответить
                            • Реальный пример:
                              num,used
                              "2406321776","1"
                              "4518656907","1"
                              "4507978949","1"
                              "4605008196","1"
                              "4505482149","1"
                              "4507821287","1"
                              "4512847600","1"
                              "4606369584","1"
                              "4505650031","1"
                              "4518406112","1"
                              "4515084150","1"
                              "4510167899","1"
                              "4519081545","1"
                              "4516791243","1"
                              "4510588790","1"
                              "4507754371","1"
                              "8905908460","0"
                              "4514797724","1"
                              "4504429315","1"
                              "9110582879","1"
                              "4518542373","1"
                              "4505619637","1"
                              "2217684661","1"
                              "2217816564","1"
                              "4614564849","1"
                              "2208268704","1"
                              "4514868646","1"
                              "4511472810","1"
                              "4510892761","1"
                              "4504634131","1"
                              "4519610699","1"
                              "6303550367","1"
                              "4511387163","1"
                              "4519069958","0"
                              "2211864262","1"
                              "2206799474","0"
                              "4516927373","1"
                              "4510488231","1"
                              "4611571820","0"
                              "2215431264","0"
                              "4607793762","1"
                              "4510993694","1"
                              "4510294355","1"
                              "8210981957","1"
                              "4512703103","1"
                              "4515272771","1"
                              "2214335259","1"
                              "4516704231","1"
                              "8218065963","0"
                              "4516694668","1"
                              "4510624104","1"
                              "4518284074","1"
                              "4507689742","1"
                              "0407127533","1"
                              "4509381962","1"
                              "4504013017","1"
                              "4508327408","1"
                              "4518573159","1"
                              "4519023062","1"
                              "4507081201","1"
                              "4506256910","1"
                              "4510419072","1"
                              "4508621636","1"
                              "4504869321","1"
                              "4515070867","1"
                              "4511499848","1"
                              "3614960862","1"
                              "4507269822","1"
                              "4510380341","1"
                              "2214299117","1"
                              "4514551375","1"
                              "5206394115","1"
                              "7018803876","1"
                              "4516678298","1"
                              "4513385492","0"
                              "4509615541","1"
                              "4516631265","1"
                              "4510559796","1"
                              "4518912958","1"
                              "4515074318","1"
                              "4508327169","1"
                              "4518187029","1"
                              "2218871523","1"
                              "4503133292","1"
                              "4509253883","1"
                              "4500674988","1"
                              "4506941709","1"
                              "4507215124","1"
                              "1206039154","1"
                              "4514763172","1"
                              "4511558471","1"
                              "4518902022","1"
                              "4519151923","1"
                              "4501864451","1"
                              "4518001935","1"
                              "4507625478","1"
                              "4511519401","1"
                              "4500402159","1"
                              "4518778406","1"
                              "4510116327","1"
                              "4505605721","1"
                              "4509293825","1"
                              "4503658836","1"
                              "4516688600","1"
                              "4509353862","1"
                              Ответить
                                • Запись присутствует - была заявка на Эл. голосование

                                  Стоит единица - воспользовался возможностью проголосовать
                                  Ответить
                                  • Но хоть так )
                                    Если за/против - был бы пиздец.
                                    Ответить
                                    • Для за против софт уже есть давно, и писался не за одну ночь.

                                      Это стихийное говно произошло из-за того, что сначала всем было похуй, а потом друг оказалось, что пресса проводит эксперименты и пытается голосовать на разных участках и комбинировать дистанционное с реальным. Чтобы избежать такой возможности спровоцировать себя в СМИ, сделали базу тех, кто зарегистрировался на Эл. Голосование, чтобы на реальных участках смотреть, не голосовал ли уже человек, и имеет ли право.
                                      Ответить
                                      • Ахаха, то есть хотели забить на двойное голосование, но не получилось?
                                        Ответить
                                        • Хотели забить да, много кто проголосовал дважды и даже трижды, журналист Дождя например голосовал на участке по прописке, дистанционно и ещё когда к нему на дом приходили с урной, что-то типа такого.
                                          Ответить
                                          • Смешно, что все всерьез обсуждают филькин референдум. Будто кому то не похуй, будто был на свете хоть один человек с мозгом, который реально не мог предсказать результаты этого референдума за пол года
                                            Ответить
        • > check

          Эм, а это точно база зареганных, а не вообще всех жителей?)
          Ответить
            • Ни туда, ни сюда: для всех жителей слишком мало (в Москве и в Нижегородской области в сумме в десяток раз больше будет, даже если вычесть детей, не имеющих паспортов), а для зареганных в электронном голосовании многовато (почему-то не верю, что 1,2 млн изъявили желание участвовать в электронном питушении).
              Ответить
      • во-первых так им и надо, долбоёбам. Если человек настолько глуп, что ходит на фейковый референдум, то он должен страдать.

        Во-вторых это многое говорит нам о технической грамотности питухов, делавших госуслуги. Когда вводите туда свой пароль -- помните, что он может случайно оказаться плейнтекстом в файле parol.txt, лежащем в document root
        Ответить
          • на самом деле пугает действительно такая степень ламерства.
            Первокурсник же понимает, что если у тебя в паспорте серия+номер это десять десятиричных цифр, то перебор даже всех вариантов на современном железе это фигня на посном масле
            Ответить
            • Ну... может это они специально опубликовали чтобы каждый не голосовавший мог проверить, что его в этом списке нет?

              Голый номер паспорта никому не интересен так то. Без привязки к какой-то ещё инфе.
              Ответить
              • Все равно это нарушение прайваси. Я могу знать твой паспоррт (например, я работаю курьером, и ты мне его показал, чтобы забрать товар), и теперь я знаю -- голосовал ты или нет.
                Ответить
  • Питушки, можно на пинде ВООБЩЕ не линковаться с CRT? Если да, то будет ли в теории меньше и быстрее?
    Я готов работать ТОЛЬКО С Win32API. Что будет с точкой входа?
    Ответить
    • Что назначишь, то и будет.

      Разбери устройство CRT, тогда поймёшь.

      Какой компилятор интересует? «MSVC»? Тогда у штатного линкера (link.exe) есть ключик /ENTRY:pituh, который назначает точкой входа метку pituh; ключик /NODEFAULTLIB игнорирует список библиотек по умолчанию. У cl.exe ключик /link передаёт аргументы линкеру.

      По дефолту у «MSVC» точка входа нацелена на символ _mainCRTStartup, лежащий в crt0.obj или в crtexe.obj, который упакован в стандартную библиотеку. Можешь посмотреть, что эта функция обычно делает.
      Ответить
      • Кстати, я собираю студией и msbuild, но все эти опции можно задать через GUI)
        Ответить
    • Если интересует именно «MSVC», вот для старта поиска:
      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.
        Ответить
        • Все таки ГК волшебное место. Где еще можно в 5 утра задать вопрос про сишку под винду, и получить сразу ответ?
          Ответить
          • CRT же опенсорсная. Смотри VC\crt\src.

            Реальный пример точки входа из CRT (после препроцессирования, чтобы влезло в 2 к символов):
            int mainCRTStartup(void)
            {
                    __security_init_cookie();
                    return __tmainCRTStartup();
            }
            
            int __tmainCRTStartup(void){
                    int initret;
                    int mainret=0;
                    int managedapp;
                    __set_app_type(1);
                    managedapp = check_managed_app();
                    if ( !_heap_init() )
                        fast_error_exit(28);
                    if( !_mtinit() )
                        fast_error_exit(16);
                    __try {
                        if (_ioinit() < 0)
                            fast_error_exit(27);
                        _acmdln = (_TSCHAR *)GetCommandLineA();
                        _aenvptr = (_TSCHAR *)__crtGetEnvironmentStringsA();
                        if ( _setargv() < 0 )
                            _amsg_exit(8);
                        if ( _setenvp() < 0 )
                            _amsg_exit(9);
                        initret = _cinit(
                        if (initret != 0)
                            _amsg_exit(initret);
                        __initenv = _environ;
                        mainret = main(__argc, __argv, _environ);
                        if ( !managedapp )
                            exit(mainret);
                        _cexit();
                    } __except ( _XcptFilter(_exception_code(), (struct _EXCEPTION_POINTERS *)_exception_info()) ) {
                        mainret = _exception_code ();
                        if ( !managedapp )
                            _exit(mainret);
                        _c_exit();
                    }
                    return mainret;
            }


            Да, именно отсюда зовётся main:
            mainret = main(__argc, __argv, _environ);
            А что происходит перед его вызовом, ты видишь.
            Ответить
            • 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) */
                Ответить
                • https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=vs-2019

                  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:
                  Ответить
                  • Какой багор )))

                    Я показал фрагменты из какой-то древней студии, последнюю не копал.
                    Ответить
                  • Да, UCRT — красивая библиотека:
                    typedef Character const extension_type[5];
                            static extension_type const extensions[4] =
                            {
                                { '.', 'c', 'o', 'm', '\0' },
                                { '.', 'e', 'x', 'e', '\0' },
                                { '.', 'b', 'a', 't', '\0' },
                                { '.', 'c', 'm', 'd', '\0' }
                            };
                    
                            errno_t const saved_errno = errno;
                    
                            extension_type const* const first_extension = extensions;
                            extension_type const* const last_extension  = first_extension + _countof(extensions);
                            for (auto it = first_extension; it != last_extension; ++it)
                            {
                                _ERRCHECK(traits::tcscpy_s(extension_buffer, 5, *it));
                    
                                if (traits::taccess_s(buffer.get(), 0) == 0)
                                {
                                    errno = saved_errno;
                                    return execute_command(mode, buffer.get(), arguments, environment);
                                }
                            }


                    Где ещё такое чудо, где ещё такой прогресс?
                    Ответить
                    • да, уже ржал с этово
                      При том, что есть ``PATHEXT``, то-есь знание о расшырении зашито в разных местах.

                      >traits::tcscpy_s

                      А вот если я такой сишник-няшник, дебажу свой код, и вдруг прихожу дебагом к крестовне, и у меня случается багор
                      Ответить
                      • Да дебаггеру вообще похуй на язык, на самом деле. Ему маппинга адресов на строки в исходнике хватает.

                        Ты можешь на основе текстового файла сгенерить сишку, расставить в ней #line со ссылками на исходный текстовик, и прекрасно дебажить его и бряки ставить.
                        Ответить
                        • Не понял про сишку.

                          Я сижу на брекпоинте в визуальном дебагере, углуюляюсь в код, прихожу в стандратную библиотеку, и вижу там C++
                          Ответить
                          • А, ты про то что сишник кресты в стандартной либе не осилит? Ну да, там где-то даже лямбды и шаблоны встречались.
                            Ответить
                            • Ну может и осилит, но ему будет некомфортно.

                              Если я пишу на чистом си, то я как-то ожидаю в стандартной библиотеке тоже видеть только си, не?
                              Ответить
                              • Да мож она вообще на асме или на расте? Вай нот?

                                ABI соблюдается, сишные хедера тебе выдали. Остальное - деталь реализации, на которую всем пофиг.
                                Ответить
                                • Под некоторые процессоры интринсинки написаны как раз на чистом асме.
                                  Ответить
                • Оптимизировал:
                  void __cdecl __security_init_cookie(void)
                  {
                      UINT_PTR cookie;
                      printf("Бросьте игральную кость и введите результат:");
                      scanf("%d", cookie);
                      __security_cookie = cookie;
                      __security_cookie_complement = ~cookie;
                  }

                  Теперь будет работать быстрее.
                  Ответить
                  • Можно нажать энтер и получить неплохой рандом со стека.
                    Ответить
            • Итого: мы видим, что перед запуском мейна обычно бывает:
              __set_app_type(_CONSOLE_APP); или __set_app_type(_GUI_APP);
              managedapp = check_managed_app();
              _heap_init();
              _mtinit();
              _ioinit();
              _acmdln = (_TSCHAR *)GetCommandLineA();
              _aenvptr = (_TSCHAR *)GetEnvironmentStringsA();
              initret = _cinit(TRUE);


              Там ещё есть тонкости, связанные с многопоточной и однопоточной версией, с отладочной и релизной, с гуёвой и соснольной, с уникодной и восьмибитной. Но примерно цепочка вызовов такая.

              Думай, много или мало времени это может отнять.
              Ответить
              • У меня однопоточная релизная динамическая консольная юникодная.
                Кстати, я не пользую wprintf, бо я не хочу превращения wide chars в однобитную хуйню.
                Я пишу WriteFile прямо в STD_OUTPUT. Получается двубайтовый LE (бо интел) уникод.
                В сосноли это конечно выглдит "в о т т а к", но я читаю выхлоп жабой, а там есть чарсет для 16-LE
                Ответить
    • Можно, но это скорее для извращений в духе своей операционки или соревнований про демку в 64к.

      Для практических задач это не имеет смысла, имхо. Будешь потом жить без деления и т.п.У MS нет четкого разделения между CRT и либой поддержки конпелятора как в том же гцц. Хотя на 64-битке с этим наверное полегче будет чем на 32-битке.
      Ответить
      • З.ы. И с интринсиками типа memset вдоволь наебешься потом. Будут в рекурсию падать и т.п.

        Причём конпелятор их сам юзает иногда чтобы структуры чистить. Или если цикл подходящий по смыслу увидит. Поэтому он может их позвать даже если их в коде явно нигде нет.
        Ответить
        • Помните, как Линус Торвальдс пердолился, добавляя по одной функции к своей ОС до тех пор, пока у него конпелятор не завёлся? Вот тут будет почти то же самое.
          Ответить
        • Кстати, интринсинки перечислены в VC\bin\c2.dll. Нужно всего лишь дизассемблировать эту dll, чтобы понять, какие именно понадобятся компилятору.
          Ответить
          • В случае с memset проблема в том, что конпелятор увидит в твоей реализации memset цикл похожий на memset и оптимизнёт его в вызов memset.

            А список особо и не нужен. Популярные довольно быстро понадобятся, а остальные скорее всего никогда.
            Ответить
            • В исходниках memset есть строчка:
              #pragma function(memset)

              Это мы предупреждаем компилятор, что будем реализовывать memset, чтобы он в рекурсию не свалился?
              Ответить
            • Кстати, а в «MinGW» будет проще отказаться от рантайма? Там же компилятор дёргает только «libgcc», а «libc» не трогает? Или я слишком хорошо о нём думаю?

              И в «Шланге» по идее можно провернуть такой же трюк. А вот у прочих компиляторов («Борманд Си», «Ватком Си», «Цифровой Марс») библиотека монолитная, так что для её кастомизации придётся попердолиться.
              Ответить
              • А фиг знает, я мингв почти не юзал.

                В гцц кстати у меня получалось даже поддержку исключений прикрутить. Она там неплохо отвязана от рантайма и прочей сишности.
                Ответить
      • А действительно, там есть длинное деление, длинное умножение, длинный сдвиг на те случаи, когда одной инструкцией сделать не получается (например, для 64-битных аргументов на 32-битке).
        Ответить
      • Ну вот я попробовал, и понял, что бенефитов как-то не много:)
        Ответить

Добавить комментарий для Fike Отменить ответ

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8