Кресты / Говнокод #24050 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 DrAli, (Updated )

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

      Кстати, рекомендую кнопку "ответить" и оборачивать код в
      .
      Ответить
      • "Тогда, если в коде на 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)". Надо чтобы именно эта форма вычислялась отдельно от остальных. Я думал проще будет вставить изменения в сам исходник лисы. А атака на клиентскую часть мне не нужна
          Ответить
    • Тебе не проще подменять траффик, чтобы при загрузке hui.min.js заменять нужные части кода регуляркой на свои? Это хотя бы кроссбраузерно
      Ответить
      • Кстати, а можно при загрузке в браузере подменять файл своим? Чтобы, например, рекламу убивать.
        Ответить
        • Систему защиты чего? Ты же можешь сменить браузер - значит, имеешь достаточно доступа для модификации трафика.
          Ответить
          • И правда. Может, тут поможет прокси, который написать быстрее и проще, чем возиться с обезьяной. Может даже и без прокси, если для Firefox есть аддон (должен быть), который как упомянутое расширение для Chrome может подменять страницы. Поднять свой сервер, который будет отдавать - тоже дело нехитрое. Главное - узнать, как в браузере allow mixed content, если сайт HTTPS, а свой сервер HTTP.
            Ответить
              • подмени код, который ловит, что файл модифицирован
                Ответить
                  • Чувак, вот реально. Тебе никто не поможет, если ты конкретно не объяснишь что тебе надо. Кто проверяет целостность чего? Хихуя не понятно.
                    Ответить
                  • Опять оперативка. Причём тут оперативка?
                    На сервер идёт запрос, сервер отдаёт файл, данные приходят, и только потом оказываются в оперативке. Если мы перехватываем запрос и отдаём свой файл, в оперативке будет уже он. Если мы подменим все файлы, в оперативке будут только наши файлы. В крайнем случае, если нельзя зарегистрировать свой сертификат, - сделать, чтобы прокси весь 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, то хз, сработает ли такое.
      Ответить
      • если там загруженный жс код не проверяет имя домена, то прокси (для простоты далее предположим, что это 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 {<br />
                    console.time("SCRIPT RUN TIME[New Userscript]");<br />
                    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]");<br />
                    } 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_"])
                    ПыСы:
                    кстати как здесь код оформить?
                    Ответить
                      • ну и?
                        ты дебажишь свой юзерскрипт и спрашиваешь нас зачем ты это делаешь?

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


                        > и куда все подевались?
                        видимо, никому не интересен детсад
                        Ответить
                          • Мне осталась одна забава - пальцы в рот да весёлый дрист
                            Ответить
                          • Потому, что разработка сверху вниз. Сначала пишем заглушки и, пока не потратили силу на всю программу от начала до конца, проверяем, что наша логика вообще работоспособна, потом либо доводим код в деталях, либо меняем логику.
                            Ответить
                    • > получил вот это

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

                      > кстати как здесь код оформить?
                      [code][/сode]
                      Ответить
    • Ищи функцию, в которой тебе надо заменить выражение, и переопределяй юзерскриптом. Остальное ты слишком невнятно объяснил.
      Ответить
    • Не смей больше трогать плюсы! 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;<br />
                for(int i=0; i<s.size(); ++i)<br />
                if (s[i]==d[0])<br />
                {<br />
                f=1;<br />
                for (int j=0; j<s.size()&&j<d.size(); ++j)<br />
                if (d[j]!=s[i+j]) f=0;<br />
                if (f)<br />
                {<br />
                a.clear();<br />
                for (int j=0; j<i; ++j)<br />
                a=a+s[j];<br />
                a=a+"0.1*";<br />
                for (int j=i; j<s.size(); ++j)<br />
                a=a+s[j];<br />
                }
                }
                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";
                }
                , но он с файла читает, а с буфера нет
                Ответить
                • Нихуя не понял. Откуда ты читаешь и куда пишешь?

                  > 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++.
      Ответить
    • Что за язык?

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

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

Переведи на "PHP", guest!

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


    8