1. C++ / Говнокод #24050

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    #include <stdlib.h>
    #include <time.h>
    #include <random> 
    #include <algorithm>
    .........
    .........
    double
    js::math_random_no_outparam(JSContext* cx)
    {
    	if JSContext* == "Math.floor(Math.random() * (max - min + 1) + min)"
    	{
                  return Math.floor(Math.random() * (max - min + 1) + min);
    	}
           return random_nextDouble(&cx->compartment()->rngState);
    }
    ........

    Доброго времени
    хочу заставить Лису(FF) вычислять math функцию внутри браузера, а не через Windows (ADVAPI32.DLL Function36).
    Но при компиляции измененного кода постоянно получаю ошибки.
    Я конечно кривые коды пишу, но пытаюсь подстроиться под исходный С++.
    ...........................
    в итоге не видит и не распознает ни рандом, ни фло, ни мат, ни джиэс контекст
    Подскажите в каком направлении копать.

    Запостил: DrAli, 01 Апреля 2018

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

    • показать все, что скрытоТы патчишь лису, компилируешь из исходников или правишь память? Как ты внедрил сишный код в DOM?
      Ответить
      • math_random_no_outparam - один из методов из недр Spidermonkey
        https://github.com/ricardoquesada/Spidermonkey/blob/master/js/src/jsmath.cpp#L801
        Автор курочит интерпретатор JS и, видимо, когда у него получится реализовать задуманное, будет компилировать Firefox. Этим делом он занимается уже минимум три недели, но пока безуспешно.
        Возможно, школьник-энтузиаст. Если у него получится, будет большой плюс в карму. Если не получится - ничего постыдного нет.

        Автору я бы посоветовал подучить C++, чтобы можно было читать исходный код Spidermonkey и документацию. Без должных знаний C++ скорее всего продвинуться не удастся. Затем, соответственно, попытаться понять Spidermonkey.
        Ответить
        • Рассмотрим это добавленный кусок:
          if JSContext* == "Math.floor(Math.random() * (max - min + 1) + min)"
          {
              return Math.floor(Math.random() * (max - min + 1) + min);
          }

          1. Условия в C++, как и в JS, пишутся в круглых скобках: if ( условие ) { ... }
          2. JSContext - это тип, использовать его в выражении так просто не получится (в данном случае надо было использовать переменную cx типа JSContext)
          3. Оператор * при разыменовании указателя стоит слева от указателя (*cx, а не cx*)
          4. Сравнение строк через == - это сравнение указателей. Если одинаковые строки лежат в разных местах памяти, они не будут равны через ==.
          5. JSContext - штука более сложная, чем просто строка, там состояние интерпретатора в каком-то виде, тут надо читать документацию.
          6. return ... содержит код на JS, он не скомпилируется как код на C++, нужен код на C++.

          В общем, надо изучать C++ и Spidermonkey, без понимания этих двух штук вряд ли что получится. Впрочем, удачи. Буду рад узнать, что из этой затеи вышло что-то полезное.

          P.S. Рискну предположить, что так можно заставить Math.random стать счётчиком:
          double myrand()
          {
              static double n = 0;
              return n += 0.1;
          }
          
          double
          js::math_random_no_outparam(JSContext* cx)
          {
                 return myrand();
                 // return random_nextDouble(&cx->compartment()->rngState);
          }
          Ответить
          • Боюсь, что тебя с 1 апреля наебали
            или ты наебал
            Ответить
            • Если так, то человек три недели готовился, в столь продуманном аттракционе и лохануться не стыдно.
              https://github.community/t5/Project-Development-Help-and/Open-Source-Projects/m-p/5604
              Ответить
          • А я думал, что это какой-то хитрый диалект С++ для написания расширений интерпретатора JS или что-то типа того...
            Ответить
      • >"Ты патчишь лису, компилируешь из исходников или правишь память?" правлю исходники и потом компилирую
        Ответить
    • О_о
      Где здесь С++, DrAli?
      Ответить
    • точно - круглые скобки не показал
      Ответить
    • ага намудрил
      это часть исходника:
      это исходный код:
      double
      js::math_random_no_outparam(JSConte xt* cx)
      {
      return random_nextDouble(&cx->compartment()->rngState);
      }
      Ответить
    • вероятно такой код тоже не будет работать:
      double
      js::math_random_no_outparam(JSConte xt* cx)
      {
      if (JSContext* == "Math.floor(Math.random() * (max - min + 1) + min)")
      {
      void main()
      {
      Random^ rnd = new Random();
      {
      int max, min;
      rnd->Next(max, min);
      }
      }
      }
      return random_nextDouble(&cx->compartment()->rngState);
      }

      ....тогда как быть?
      если надо, чтобы при событии и исполнения строки Math.floor(Math.random() * (max - min + 1) + min) в JS срабатывал именно прописанный рандом браузера...
      Ответить
      • > тогда как быть?
        нанять программиста на фриланс.ру
        Ответить
      • > ....тогда как быть?
        Я же говорил, нужно изучать C++ и Spidermonkey. Может даже почитать про парсеры и грамматики.

        > надо, чтобы при событии и исполнения строки Math.floor(Math.random() * (max - min + 1) + min) в JS срабатывал именно прописанный рандом браузера...
        Тут надо искать место, где интерпретатор парсит исходный код на JS, добавлять в грамматику правило, которое соответствует этой строке. Далее нужно посмотреть, как выглядит AST и т.п. структура, расширить её описание, проследить за тем, что с этими объектами делают по мере прохождения от этапа парсинга до этапа исполнения, протащить свою кастомную питушню по всему этому пути, затем написать для неё обработчик навроде double js::math_random_no_outparam(JSConte xt* cx).
        Маловероятно, что тут кто-то поможет даже за деньги.

        Предлагаю вместо этого посмотреть, где в исходниках встречается строка "random", и во всех местах добавить random2, который будет в итоге что-то вычислять. Тогда, если в коде на JS вызовут Math.random2, вызовется эта новая функция.
        Эта задача уже более адекватная.

        Кстати, рекомендую кнопку "ответить" и оборачивать код в [code][/code].
        Ответить
        • "Тогда, если в коде на JS вызовут Math.random2" - такой вызов не возможен, потому что везде в js кодах прописан Math.random. Это только если переопределять, что Math.random = Math.random2.
          Мне надо, изменить исходный код так, чтобы при выполнении js кода браузером и при встрече с "Math.random() * (max - min + 1) + min" эта строка вычислялась по отдельно написаной стандартной формуле. Остальные варианты вычисления Random пусть останутся как есть.
          Ответить
          • > такой вызов не возможен, потому что везде в js кодах прописан Math.random
            Охлол, то есть проще оказалось переписать Spidermonkey, чем код на JS?
            Вон внизу defecate-plusplus дело говорит, заодно предлагает метод чуть-чуть попроще.
            Ответить
            • код на js править невозможно, он висит в оперативке , соответственно винда блокирует любое вмешательство.
              А defecate-plusplus дело говорит, но я не все понял.
              Ответить
        • 1) нихуя не понятно нахер патчить пидорманки и собирать лису, вот правда
          2) раз уж хочется именно п.1, то надо патчить функцию, которая загружает исходники и отдает их на парсинг - например, пройтись регуляркой и заменить одну подстроку на другую, это позволит не ебаться с AST и прочими глубоко зарытыми нюансами и относительно легко апгрейдить версию чужой библиотеки со временем - в частности, "Math.random() * (max - min + 1) + min" подменять на "myRandom(min, max)", а myRandom вообще инжектить через свой дополнительно предварительно загружаемый к документу скрипт
          3) искать и заменять конкретно "Math.random() * (max - min + 1) + min" - это какое-то весеннее обострение, не могу предположить практической пользы, этим даже атаку на клиентскую среду не сделать - у нормальных людей устанавливаемое ПО подписано, а иногда даже контролируется целостность загруженных модулей
          4) как и собирать лису из исходников
          Ответить
          • "1) нихуя не понятно " - абсолютно согласен
            с сайта браузер качает множество js файлов, парсит их и исполняет. В коде js есть множество вычислений типа random(), а также строчка "Math.floo(Math.random() * (max - min + 1) + min)". Надо чтобы именно эта форма вычислялась отдельно от остальных. Я думал проще будет вставить изменения в сам исходник лисы. А атака на клиентскую часть мне не нужна
            Ответить
            • нахуя это надо, чтобы именно эта форма исполнялась отдельно от остальных?
              в чем практическая польза
              Ответить
          • есть страничка - https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Glue_classes/nsAString/Replace
            как это прописать в моем случае?
            Ответить
      • Тебе не проще подменять траффик, чтобы при загрузке hui.min.js заменять нужные части кода регуляркой на свои? Это хотя бы кроссбраузерно
        Ответить
        • Кстати, а можно при загрузке в браузере подменять файл своим? Чтобы, например, рекламу убивать.
          Ответить
          • Несложный прокси напитоне мог бы делать такое ещё до браузера.

            В API хроморасширений была возможность ловить запросы и реагировать на них.
            Похоже, тут этой возможностью воспользовались: https://chrome.google.com/webstore/detail/requestly-redirect-url-mo/mdnleldcmiljblolnjhpnblkcekpdkpa
            Ответить
          • рекламу можно убить
            Ответить
        • не реально обойти систему защиты
          Ответить
          • Систему защиты чего? Ты же можешь сменить браузер - значит, имеешь достаточно доступа для модификации трафика.
            Ответить
            • И правда. Может, тут поможет прокси, который написать быстрее и проще, чем возиться с обезьяной. Может даже и без прокси, если для Firefox есть аддон (должен быть), который как упомянутое расширение для Chrome может подменять страницы. Поднять свой сервер, который будет отдавать - тоже дело нехитрое. Главное - узнать, как в браузере allow mixed content, если сайт HTTPS, а свой сервер HTTP.
              Ответить
              • пробовал прокси - результат плачевный: ловят что файл модифицирован
                [email protected]
                пиши в личку
                Ответить
                • добавь сертификат в браузер
                  Ответить
                • подмени код, который ловит, что файл модифицирован
                  Ответить
                  • он тоже в оперативке висит
                    Ответить
                    • Чувак, вот реально. Тебе никто не поможет, если ты конкретно не объяснишь что тебе надо. Кто проверяет целостность чего? Хихуя не понятно.
                      Ответить
                    • Опять оперативка. Причём тут оперативка?
                      На сервер идёт запрос, сервер отдаёт файл, данные приходят, и только потом оказываются в оперативке. Если мы перехватываем запрос и отдаём свой файл, в оперативке будет уже он. Если мы подменим все файлы, в оперативке будут только наши файлы. В крайнем случае, если нельзя зарегистрировать свой сертификат, - сделать, чтобы прокси весь HTTPS преобразовывал в HTTP.
                      Ответить
                      • там хорошо настроена проверка безопасности - не пропускает файлы загруженные из других источников
                        Хотя идея хорошая, но у меня не получилось
                        Ответить
          • Попытка 2: нажать F12 и порыться в инструментах разработчика.
            Попытка 3: поставить Tampermonkey и зафигарить юзерскрипт.
            Ответить
    • хотелось бы самому разобраться. Но нужна помощь
      Ответить
    • доброго времени всем
      начнем
      Сразу скажу почему выбрал Mozilla FireFox - открытый исходный код с блочной конструкцией.
      к примеру, есть сайт типа random.org,
      при подключении он грузит несколько js скриптов в оперативку(все изменения блокируются виндой). По событию EventMouseClick (кнопка "start") генерируется случайное число в диапазоне 1-1000.
      В FF есть блок отвечающий за обработку js. В исходниках - это mozilla-central/js/src. Там конкретно за math функции файлы на С++ jsmath.h и jsmath.cpp.
      Сайт при подключении грузит свой Server Seed + использует дополнительное число Nonce + использует Client Seed.
      Используя прокси я понял, что для большей случайности random вычисляется 3! раза и в качестве результата принимается последнее число. А также то, что random() вычисляется на клиентской машине. Думаю иначе сервак бы лег.
      Попытка внести элементарные изменения в исходный код (изменение time, arg, seed, random), чтобы результат random(max,min) был уменьшен в 2 или более раз, либо выдает несколько ошибок при компиляции, либо не дает нужного результата.
      По большому счету надо лишь аппаратно уменьшить заданный исходный диапазон генерации числа, чтобы при исходном значении 1-1000, генерировалось 1-500.
      Ответить
      • > Думаю иначе сервак бы лег
        От рандома-то? Эдак ты бы его и по F5 задудосил. Ничего бы ему не было, просто зачем делать на сервере, если у клиента есть свой рандом. Это же не ответственная операция в случае с random.org, не криптография, а просто клиентский сервис.

        Ты опять описываешь детали реализации, а не озвучиваешь задачу. Ты скажи, что тебе конкретно нужно сделать. Например, показать кому-то подготовленную страницу, так, чтобы человек нажал на кнопку Random, а ему выпало нужное тебе число. Или читануть в игре, использующей рандом на клиенте. Это описание задач. То, что ты говоришь — описание попыток решить неизвестную нам задачу.

        Поставишь задачу, тебе скорее всего подскажут, как сделать её без перекомпиляции браузера и отдельных правил вычисления для каких-то js-выражений. Скорее всего, всё решается юзерскриптом.

        P.S.
        > код с блочной конструкцией
        > аппаратно уменьшить заданный исходный диапазон генерации числа

        Говори проще, не будь стертором.
        Ответить
        • > не озвучиваешь задачу

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

            P.S. Нужно децентрализованное казино на блокчейне, p2p и всё такое прочее. Интересно, а криптографии вообще хватит, чтобы два игрока играли в азартную игру, и не могли читерить, при этом не используя никакую третью сторону, которой все доверяют?
            Ответить
          • Есть же долбоёбы, которые разыгрывают призы, на камеру открывают random.org и показывают что выпало. Я думаю он в таком духе хочет наёбывать.
            Ответить
          • казино так обыграть не получится, там надо проводить атаку на серверный random() с дельта time < 20 миллисек, тогда будешь знать следующее число. Я так не умею.
            Ответить
        • во точно,надо показать серверу подготовленную страницу, так, чтобы я нажал на кнопку Random, а ему выпало нужное мне число.
          Ответить
          • > серверу

            Серверу? Как это, показать серверу?

            Показать можно клиенту. Тогда вопрос, клиент удалённый, он должен открыть страницу в инете и увидеть то, что ты хочешь, или ты можешь заранее подготовить машину и посадить за неё юзера?
            Ответить
      • > По большому счету надо лишь аппаратно уменьшить заданный исходный диапазон генерации числа, чтобы при исходном значении 1-1000, генерировалось 1-500.

        Если задача заключена в этом, можно сделать в консоли юзерскриптом
        Math.rand_raw = Math.random;
        Math.random = function () { return Math.rand_raw() * 0.5; };
        Ответить
        • Он выше писал, что там не просто Math.random(), а Math.floor(Math.random() * (max - min + 1) + min)
          и maxом, minом тоже нужно управлять
          Ответить
          • Если заменить нандом от 0 до 1 на рандом от 0 до 0.5, то выражение
            Math.floor(Math.random() * (max - min + 1) + min)
            Аккуратно будет считать целочисленный рандом от min до (max / 2). Про «управлять» ничего не видел.
            Ответить
          • что мешает заменить не библиотечный код, а пользовательский?

            это самое Math.floor(Math.random() * (max - min + 1) + min) явно встречается счетное число раз в атакуемом коде
            например в функциях foo() и в bar.baz()

            вот их и переопределить юзерскриптом на то тело, которое отныне должно исполняться
            Ответить
            • кааааааааааак? это сделать?
              Ответить
              • присвоить чужим функциям и прототипам свои функции
                это же динамический питух
                там можно что угодно
                Ответить
              • Ну, у тебя по нажатию на кнопку "супермегарандом" вызывается какая-нибудь функция obrabotatVsёBezSMS();
                Эту функцию и заменяй в юзерскрипте.
                Ответить
        • не срабатывает
          Ответить
          • не срабатывает
            Ответить
          • Убедись, что этот код загружается до того, как грузятся остальные скрипты. Проверь в консоли результат.
            Ответить
          • получил ƒ () { return Math.rand_raw() * 0.5; }, но не сработало
            как он может загрузиться раньше?
            Ответить
            • > как он может загрузиться раньше?

              Зависит от того, какой у тебя плагин для юзерскриптов. Гугли.
              Ответить
              • от инфы не голова а мяч футбольный. Пойдем другим путем.
                Какой плагин лучше использовать?
                Ответить
      • 1) Подсунуть сайт random.org в hosts, перенаправить на localhost
        2) На localhost поднять свой сервак, все запросы на проксировать (отправлять запросы на реальный сайт, а если это нужный тебе .js, то подменять его сорс)
        никакое вмешательство в оперативку не требуется


        Можно ещё слушать и подменять траффик, исходящий на твой random.org/assets/js/hui.min.js. Антивирусы же это как-то делают.
        Правда если сайт https, то хз, сработает ли такое.
        Ответить
        • да,да хз сайт https
          Ответить
        • если там загруженный жс код не проверяет имя домена, то прокси (для простоты далее предположим, что это nginx) на локалхосте http -> upstream https уже решает задачу

          если проверяет, то если для домена не сделали всякие TLS certificate pinning, то заводим себе корневой центр сертификатов, добавляем в хостовую ОС этот доверенный корневой центр, выпускаем сертификат на foobar.com, nginx начинает реверс проксить https -> https

          но проще всего атакуемый код заменить на свой через юзерскрипт - я не понимаю, что это мешает сделать
          Ответить
          • согласен, но,
            1 - как загрузить юзерскрипт, чтобы пройти проверку загрузки. Исполнение кода загруженного с других источников блокируется сервером.
            Ответить
            • каким сервером оно блокируется, если твой код исполняется на клиенте?
              оно может только браузером "блокироваться"
              разве миллион этих плагинов для юзерскриптов, тот же тамперманки, не запускаются, если пришёл строгий Access-Control-Allow-Origin?
              я не проверял и лень это делать, но сомневаюсь
              Ответить
              • для Хрома какой взять?
                Ответить
              • я пробовал целиком файл с js кодом подменить.Браузеру пофиг - все работает, а вот запрос-ответ от сервера выдает ошибку
                Ответить
                • А это не какой-нибудь твой аддон для безопасности блочит запросы? Отруби всякие адблоки, если есть.
                  Ответить
                • ты ж понимаешь, что магии не бывает?
                  во-первых, "выдает ошибку" - это непрофессионально
                  так бухгалтерше можно говорить, но не программисту

                  во-вторых, в js и сетевом обмене всё на виду - отлаживай не хочу из консоли браузера
                  Ответить
              • поставил тамперманки
                Ответить
            • > блокируется сервером

              Ты не улавливаешь суть юзерскриптов. Тебе надо взять весь файл, код в котором ты пытаешься подменить (как мы понимаем, он не обфусцирован, если ты видишь в нём свои выражения с рандомами), сохранить его как юзерскрипт для нужного сайта с замененным кодом, как тебе нужно. И запретить загрузку оригинального файла, например заблокировать его адблоком.
              Ответить
              • не обязательно
                зависит от условий работы
                возможно, будет достаточно, если сначала сайт нормально себя загрузит, а потом уже запустится юзерскрипт, который изменит нужные функции, которые начнут с этого момента работать по-новому
                Ответить
                • > который изменит нужные функции, которые начнут с этого момента работать по-новому

                  А, ну да. Тем более, что выше он пишет, что подмена всего файла не даёт скрипту обращаться к серверу. Надо подменять в юс только один обработчик интересующего события.
                  Ответить
                  • я хз что там у него не даёт
                    без фактических симптомов это уравнение со слишком многими неизвестными
                    50% на то, что ему показалось, что сервер "выдает ошибку", но на самом деле там было что-то совсем другое

                    в общем случае серверу абсолютно поебать какой конкретно "скрипт" или "функция" или что угодно совершила HTTP POST/PUT, хоть утюг или левый носок - есть заголовки, есть тело запроса

                    и то и другое, естественно, не содержат магии больше, чем следует
                    Ответить
                    • поставил через манки этот
                      Math.rand_raw = Math.random;
                      Math.random = function () { return Math.rand_raw() * 0.5; };
                      при перезагрузке страницы получил вот это
                      (function() {(function(context, fapply, console) {with (context) {(function(module) {"use strict";try {
                      console.time("SCRIPT RUN TIME[New Userscript]");
                      fapply(module, context, [,,context.CDATA,context.uneval,context.d efine,context.module,context.exports,con text.GM,context.GM_info]);console.timeEnd("SCRIPT RUN TIME[New Userscript]");
                      } catch (e) {if (e.message && e.stack) {console.error("ERROR: Execution of script 'New Userscript' failed! " + e.message);console.log(e.stack.replace(/(\\(eval at )?<anonymous>[: ]?)|([\s.]*at Object.tms_[\s\S.]*)/g, ""));} else {console.error(e);}}
                      })(function (context,fapply,CDATA,uneval,define,modu le,exports,GM,GM_info) {

                      // ==UserScript==
                      // @name New Userscript
                      // @namespace http://tampermonkey.net/
                      // @version 0.1
                      // @description try to take over the world!
                      // @author You
                      // @match https://random.az/?op=home
                      // @grant none
                      // ==/UserScript==

                      debugger;(function() {
                      'use strict';
                      Math.rand_raw = Math.random;
                      Math.random = function () { return Math.rand_raw() * 0.5; };
                      // Your code here...
                      })();
                      })}})(this.context, this.fapply, this.console);
                      }).apply(window["__u__8040123.7185240695_"])
                      ПыСы:
                      кстати как здесь код оформить?
                      Ответить
                      • встает в паузу на debugger
                        Ответить
                        • ну и?
                          ты дебажишь свой юзерскрипт и спрашиваешь нас зачем ты это делаешь?

                          в чем проблема начать с простого
                          // ==UserScript==
                          // @name         Test random
                          // @namespace    http://tampermonkey.net/
                          // @version      0.1
                          // @match        https://random.org
                          // ==/UserScript==
                          
                          (function() {
                              'use strict';
                              Math.random = function () { return 42; };
                          })();


                          > и куда все подевались?
                          видимо, никому не интересен детсад
                          Ответить
                          • >>>"дебажишь"

                            Вырвало.
                            Ответить
                          • почему { return 42; }?
                            Ответить
                            • где ?
                              ( я дуб )
                              Ответить
                            • Потому, что разработка сверху вниз. Сначала пишем заглушки и, пока не потратили силу на всю программу от начала до конца, проверяем, что наша логика вообще работоспособна, потом либо доводим код в деталях, либо меняем логику.
                              Ответить
                      • > получил вот это

                        Что это такое? Куда ты это получил?

                        > кстати как здесь код оформить?
                        [code][/сode]
                        Ответить
                        • F12, во вкладке Sources появился скрипт chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/userscript.html?id=7326206b-3271-42df-8f5d-1c4ddb9bc7e2, с данным текстом
                          Ответить
                        • как можно скрин вставить?
                          Ответить
              • Ну кстати у юзерскрипта же больше прав?
                Ответить
                • Больше прав, чем у твоей лишённой паспорта мамки, у всего, чего угодно.
                  Ответить
    • и куда все подевались?
      Ответить
      • Ищи функцию, в которой тебе надо заменить выражение, и переопределяй юзерскриптом. Остальное ты слишком невнятно объяснил.
        Ответить
      • Пасху отмечать, яйцами тереться
        Ответить
    • предлагаю разобрать код , кто сможет ?
      Ответить
      • Не смей больше трогать плюсы! over9000 ошибок в 16 строках - это пиздес.
        Ответить
      • Вообще, если быть точным, из представленного кода и так не собирается программа. Соответственно, всё уже разобрано до такой степени, что при попытке разобрать дальше код рассыпется на биты.
        Ответить
        • Да собирается он, только не со всеми изменениями.
          Блок парсинга находится по адресу mozilla-central/parser/..., там 4 папки expat, html, htmlparser и xml. Копал все, но пока не понял какие конкретно файлы мне надо править.
          Весь код можно посмотреть https://dxr.mozilla.org/mozilla-central/source/
          Кто парсить умеет, подскажите куда копать.
          Ответить
          • Обычно, когда парсят контекстно-свободные грамматики, сначала идёт лексический разбор (lexer, tokenizer), потом - синтаксический (parser). Будем считать, что в Mozilla придерживаются этой логики.

            Мы видим nsHtml5Tokenizer::tokenizeBuffer (https://dxr.mozilla.org/mozilla-central/source/parser/html/nsHtml5Tokenizer.cpp#477) и nsHtml5Parser::Parse (https://dxr.mozilla.org/mozilla-central/source/parser/html/nsHtml5Parser.cpp#202, не путать с другими перегрузками), вторая функция вызывает первую.

            Надо модифицировать либо аргумент const nsAString& aSourceBuffer в методе nsHtml5Parser::Parse, либо nsHtml5DependentUTF16Buffer stackBuffer там же (https://dxr.mozilla.org/mozilla-central/source/parser/html/nsHtml5Parser.cpp#369), либо аргумент nsHtml5UTF16Buffer* buffer внутри метода nsHtml5Tokenizer::tokenizeBuffer.

            Будем менять const nsAString& aSourceBuffer в методе nsHtml5Parser::Parse. Во-первых, в списке аргументов переименовываем его, затем внутри функции создаём свой nsAString aSourceBuffer, в который как можно раньше пишем значение, где "Math.random....min...max" заменено на нужное.

            nsAString по определению nsTSubstring<char16_t>, а nsTSubstring<T> наследуется от mozilla::detail::nsTStringRepr<T>. Чтобы обеспечить поиск и замену, есть nsTSubstring::Replace https://dxr.mozilla.org/mozilla-central/source/xpcom/string/nsTSubstring.h#315, а также FindChar и operator[] у nsTStringRepr https://dxr.mozilla.org/mozilla-central/source/xpcom/string/nsTStringRepr.h#212.

            Должно прокатить.
            Ответить
            • Что-то мне намекает, что через HTML парсер пройдёт только вшитый в страницу JS.
              Ответить
            • Блин, вот я туплю....
              не хр....на не получается
              но это у меня наверное.
              Ответить
              • Ты всё ещё насилуешь лису ?
                Наверное, недели две её долбишь, всё никак не можешь кончить. Ты хоть С++ то вычучил ?
                Писал хоть раньше программы сложнее "угадай писло" ?
                Ответить
            • всем привет
              есть кто живой? ау...
              Ответить
            • всем привет
              есть кто живой? ау...
              Ответить
              • превет :) :) :)
                кагдила?
                Ответить
                • с кодом воюю
                  Ответить
                • менять const nsAString& aSourceBuffer в методе nsHtml5Parser::Parse не получается потому как это const, а если убрать const, то по всему коду куча ошибок лезет.
                  Ответить
                • попробовал вот такой код добавить:
                  #include<iostream>
                  #include<fstream>
                  #include<vector>
                  using namespace std;
                  string rec(const string str, char c){return str;}
                  void cer(){}
                  main(){
                  string s,d="Math.random",a;
                  ifstream fin;
                  vector<string> mas;
                  fin.open();
                  //if (fin.is_open()) cout<<"1";else cout<<"0";
                  while(fin>>s)
                  {bool f=0;
                  for(int i=0; i<s.size(); ++i)
                  if (s[i]==d[0])
                  {
                  f=1;
                  for (int j=0; j<s.size()&&j<d.size(); ++j)
                  if (d[j]!=s[i+j]) f=0;
                  if (f)
                  {
                  a.clear();
                  for (int j=0; j<i; ++j)
                  a=a+s[j];
                  a=a+"0.1*";
                  for (int j=i; j<s.size(); ++j)
                  a=a+s[j];
                  }
                  }
                  if (f) {mas.push_back("\n");mas.push_back(a);ma s.push_back("\n");}
                  else mas.push_back(s);
                  s=rec(s,'0');
                  }
                  ofstream fout;
                  fout.open();
                  for (int i=0; i<mas.size(); ++i) fout<<mas[i]<<"\t";
                  }
                  , но он с файла читает, а с буфера нет
                  Ответить
                  • А не использовать ли нам bbcode?
                    Ответить
                  • Нихуя не понял. Откуда ты читаешь и куда пишешь?

                    > ifstream fin;
                    fin.open();
                    Где оргументы?

                    Что за пиздец в цикле?
                    Ответить
                    • есть код:
                      #include<iostream>
                      #include<fstream>
                      #include<vector>
                      using namespace std;
                      
                      string rec(const string str, char c){return str;}
                      
                      void cer(){}
                      
                      main(){
                      	string s,d="любой текст",a;
                      	ifstream fin;
                      	vector<string> mas;
                      fin.open();
                      //if (fin.is_open()) cout<<"1";else	cout<<"0";
                      while(fin>>s)
                      	{bool f=0;
                      		for(int i=0; i<s.size(); ++i)
                      			if (s[i]==d[0])
                      				{
                      					f=1;
                      					for (int j=0; j<s.size()&&j<d.size(); ++j)
                      						if (d[j]!=s[i+j]) f=0;
                      					if (f)
                      						{
                      							a.clear();
                      							for (int j=0; j<i; ++j)
                      								a=a+s[j];
                      							a=a+"0.1*";
                      							for (int j=i; j<s.size(); ++j)
                      								a=a+s[j];
                      						}
                      				}
                      			
                      			if (f)	{mas.push_back("\n");mas.push_back(a);mas.push_back("\n");}
                      			else mas.push_back(s);
                      			s=rec(s,'0');
                      	}
                      	ofstream fout;
                      fout.open();
                      for (int i=0; i<mas.size(); ++i) fout<<mas[i]<<"\t";
                      }
                      Ответить
                    • если fin.open() в скобках указать путь и файл, то он находит текст в файле и изменяет его на заданный и создает новый файл с результатом fout.open();
                      Ответить
                    • дописываю этот код в парсер Лисы, компиляция проходит, но при считывании файлов сайта замены не происходит, код не срабатывает
                      Ответить
    • ок, возьмусь за "-"
      Ответить
      • Есть C-- и есть Sphinx C--, выбирай шо хошь, только писать на них не просчще чем на C++.
        Ответить
      • Что за язык?

        Или это фаллический символ? Тогда почему столь короткий?
        Возьмусь за "一"!
        Ответить
        • Си минус минус 一 нечто ср мду асм и Си
          Ответить

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