1. 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, 30 Июня 2020

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

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

          а нахуй был нужен блокчейн без этой функции?
          Ответить
          • У них точно есть блокчейн или это просто модное слово типа датамайнинга бигдаты?
            Ответить
            • возможно, им просто не рассказали про технологию «система управления базой данных»
              Ответить
              • Олимпиадники такой технологией не пользуются. Можно открыть исходник сайта функцией 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 уникальных ключей?
                    Ответить
                    • Дык тебе второй не подпишут. Сервак проверяющий личность же помнит кому он уже подписывал.
                      Ответить
                    • Но здесь есть другая проблема - этот сервак является точкой доверия и может проголосовать за любого, кто не пришёл на выборы. И ты никак это не проверишь.

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

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

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

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

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

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

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

                      > запомнить

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

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

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

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

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

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

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

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

                                      Не самый простой для понимания прот
                                      Ответить
                                      • Сестрёнка, я тебе банан принесла. Мы же в зоопарке сидим, да? Я же знаю, что в зоопарке звери не едят целый день. Вот банан тебе принесла.
                                        Ответить
                                        • В деревнях всё ели.
                                          Ответить
                                          • И даже сосны –— ели. На каком-то сайте был даже совет сажать лиственницы: их точно не спиздят под Новый год.
                                            Ответить
            • > Я как всегда нихуя не спал два дня
              - в сову играл штоле?
              Ответить
    • Участник электронного голосования в Москве испортил бюллетень https://bit.ly/38meSS4
      Ответить
      • Неужели насрал в электронную урну и подтёрся электронным бюллетенем?!
        Ответить
      • Один сломал другой потерял?
        Ответить
        • Сисдамины разговаривают

          --Мне знакомый сервер сломал
          --Хакер?
          --Да нет, мудак..
          Ответить
    • База паспортов россиян, зарегистрировавшихся для участия в электронном голосовании по поправкам к Конституции РФ, опубликована в открытом доступе. Файл обнаружил телеграм-канал «Утечки информации», внимание на пост которого обратила «Медуза».

      «На один из форумов уже выложили базу паспортов (серия/номер) граждан, зарегистрировавшихся для участия в электронном голосовании по поправкам в Конституцию! Конверт в 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

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

                    Офтопик. Почему нелегальные базы данных чаще всего распространяются в формате файловой СУБД «Cronos Plus»?
                    Ответить
                    • > Офтопик. Почему нелегальные базы данных чаще всего распространяются в формате файловой СУБД «Cronos Plus»?
                      Подтверждаю этот оффтопик. Тоже удивлён, зачем использовать проприетарное тормозящее дерьмо вместо нормального «SQLite» или вообще «CSV».
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                      • Кто-то может выложить CSV?
                        Ответить
                        • С чем?
                          Ответить
                          • Что там слили хочу посмотреть в расшифрованном виде.
                            Ответить
                            • Вот тут была расшифрованная, уже удалили:
                              https://xss.is/threads/39453/

                              obnulenie.rar, ха-ха-ха.
                              Ответить
                            • А вот кто-то начал пилить конвертор из «Кроноса» в другие форматы:
                              https://github.com/occrp/cronosparser
                              Ответить
                            • Вот тут есть в 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"
                                Ответить
                                • 0/1 - это против/за?
                                  Ответить
                                  • Голосовал / не голосовал
                                    Ответить
                                  • Запись присутствует - была заявка на Эл. голосование

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

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

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

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

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

        По дефолту у «MSVC» точка входа нацелена на символ _mainCRTStartup, лежащий в crt0.obj или в crtexe.obj, который упакован в стандартную библиотеку. Можешь посмотреть, что эта функция обычно делает.
        Ответить
      • Если интересует именно «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.
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • 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);
              А что происходит перед его вызовом, ты видишь.
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • А что за вторая часть? 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) */
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Какой багор )))

                      Я показал фрагменты из какой-то древней студии, последнюю не копал.
                      Ответить
                    • Да, 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);
                                  }
                              }


                      Где ещё такое чудо, где ещё такой прогресс?
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • Да дебаггеру вообще похуй на язык, на самом деле. Ему маппинга адресов на строки в исходнике хватает.

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

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

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

                    Теперь будет работать быстрее.
                    Ответить
                    • Можно нажать энтер и получить неплохой рандом со стека.
                      Ответить
                      • нет
                        scanf подождёт непустого ввода
                        лучше буквы ввести

                        UPD: на ванишед ответил
                        Ответить
              • Итого: мы видим, что перед запуском мейна обычно бывает:
                __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);


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

                Думай, много или мало времени это может отнять.
                Ответить
            • Именно поэтому я за «инкануса».
              Ответить
          • > ptime
            pitux time?
            Ответить
      • Можно, но это скорее для извращений в духе своей операционки или соревнований про демку в 64к.

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

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

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

                Это мы предупреждаем компилятор, что будем реализовывать memset, чтобы он в рекурсию не свалился?
                Ответить
                • P.S. Нашёл описание этой прагмы:
                  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
                  Ответить
              • Кстати, а в «MinGW» будет проще отказаться от рантайма? Там же компилятор дёргает только «libgcc», а «libc» не трогает? Или я слишком хорошо о нём думаю?

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

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

    Добавить комментарий