Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Доброго времени
хочу заставить Лису(FF) вычислять math функцию внутри браузера, а не через Windows (ADVAPI32.DLL Function36).
Но при компиляции измененного кода постоянно получаю ошибки.
Я конечно кривые коды пишу, но пытаюсь подстроиться под исходный С++.
...........................
в итоге не видит и не распознает ни рандом, ни фло, ни мат, ни джиэс контекст
Подскажите в каком направлении копать.
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
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)". Надо чтобы именно эта форма вычислялась отдельно от остальных. Я думал проще будет вставить изменения в сам исходник лисы. А атака на клиентскую часть мне не нужна
И правда. Может, тут поможет прокси, который написать быстрее и проще, чем возиться с обезьяной. Может даже и без прокси, если для Firefox есть аддон (должен быть), который как упомянутое расширение для Chrome может подменять страницы. Поднять свой сервер, который будет отдавать - тоже дело нехитрое. Главное - узнать, как в браузере allow mixed content, если сайт HTTPS, а свой сервер HTTP.
Опять оперативка. Причём тут оперативка?
На сервер идёт запрос, сервер отдаёт файл, данные приходят, и только потом оказываются в оперативке. Если мы перехватываем запрос и отдаём свой файл, в оперативке будет уже он. Если мы подменим все файлы, в оперативке будут только наши файлы. В крайнем случае, если нельзя зарегистрировать свой сертификат, - сделать, чтобы прокси весь HTTPS преобразовывал в HTTP.
доброго времени всем
начнем
Сразу скажу почему выбрал 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() с дельта time < 20 миллисек, тогда будешь знать следующее число. Я так не умею.
Показать можно клиенту. Тогда вопрос, клиент удалённый, он должен открыть страницу в инете и увидеть то, что ты хочешь, или ты можешь заранее подготовить машину и посадить за неё юзера?
> По большому счету надо лишь аппаратно уменьшить заданный исходный диапазон генерации числа, чтобы при исходном значении 1-1000, генерировалось 1-500.
Если задача заключена в этом, можно сделать в консоли юзерскриптом
что мешает заменить не библиотечный код, а пользовательский?
это самое Math.floor(Math.random() * (max - min + 1) + min) явно встречается счетное число раз в атакуемом коде
например в функциях foo() и в bar.baz()
вот их и переопределить юзерскриптом на то тело, которое отныне должно исполняться
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
но проще всего атакуемый код заменить на свой через юзерскрипт - я не понимаю, что это мешает сделать
каким сервером оно блокируется, если твой код исполняется на клиенте?
оно может только браузером "блокироваться"
разве миллион этих плагинов для юзерскриптов, тот же тамперманки, не запускаются, если пришёл строгий Access-Control-Allow-Origin?
я не проверял и лень это делать, но сомневаюсь
Ты не улавливаешь суть юзерскриптов. Тебе надо взять весь файл, код в котором ты пытаешься подменить (как мы понимаем, он не обфусцирован, если ты видишь в нём свои выражения с рандомами), сохранить его как юзерскрипт для нужного сайта с замененным кодом, как тебе нужно. И запретить загрузку оригинального файла, например заблокировать его адблоком.
не обязательно
зависит от условий работы
возможно, будет достаточно, если сначала сайт нормально себя загрузит, а потом уже запустится юзерскрипт, который изменит нужные функции, которые начнут с этого момента работать по-новому
> который изменит нужные функции, которые начнут с этого момента работать по-новому
А, ну да. Тем более, что выше он пишет, что подмена всего файла не даёт скрипту обращаться к серверу. Надо подменять в юс только один обработчик интересующего события.
я хз что там у него не даёт
без фактических симптомов это уравнение со слишком многими неизвестными
50% на то, что ему показалось, что сервер "выдает ошибку", но на самом деле там было что-то совсем другое
в общем случае серверу абсолютно поебать какой конкретно "скрипт" или "функция" или что угодно совершила HTTP POST/PUT, хоть утюг или левый носок - есть заголовки, есть тело запроса
и то и другое, естественно, не содержат магии больше, чем следует
Потому, что разработка сверху вниз. Сначала пишем заглушки и, пока не потратили силу на всю программу от начала до конца, проверяем, что наша логика вообще работоспособна, потом либо доводим код в деталях, либо меняем логику.
F12, во вкладке Sources появился скрипт chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/userscript.html?id=7326206b-3271-42df-8f5d-1c4ddb9bc7e2, с данным текстом
Вообще, если быть точным, из представленного кода и так не собирается программа. Соответственно, всё уже разобрано до такой степени, что при попытке разобрать дальше код рассыпется на биты.
Да собирается он, только не со всеми изменениями.
Блок парсинга находится по адресу mozilla-central/parser/..., там 4 папки expat, html, htmlparser и xml. Копал все, но пока не понял какие конкретно файлы мне надо править.
Весь код можно посмотреть https://dxr.mozilla.org/mozilla-central/source/
Кто парсить умеет, подскажите куда копать.
Обычно, когда парсят контекстно-свободные грамматики, сначала идёт лексический разбор (lexer, tokenizer), потом - синтаксический (parser). Будем считать, что в Mozilla придерживаются этой логики.
Надо модифицировать либо аргумент 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" заменено на нужное.
Ты всё ещё насилуешь лису ?
Наверное, недели две её долбишь, всё никак не можешь кончить. Ты хоть С++ то вычучил ?
Писал хоть раньше программы сложнее "угадай писло" ?
менять const nsAString& aSourceBuffer в методе nsHtml5Parser::Parse не получается потому как это const, а если убрать const, то по всему коду куча ошибок лезет.
https://github.com/ricardoquesada/Spidermonkey/blob/master/js/src/jsmath.cpp#L801
Автор курочит интерпретатор JS и, видимо, когда у него получится реализовать задуманное, будет компилировать Firefox. Этим делом он занимается уже минимум три недели, но пока безуспешно.
Возможно, школьник-энтузиаст. Если у него получится, будет большой плюс в карму. Если не получится - ничего постыдного нет.
Автору я бы посоветовал подучить C++, чтобы можно было читать исходный код Spidermonkey и документацию. Без должных знаний C++ скорее всего продвинуться не удастся. Затем, соответственно, попытаться понять Spidermonkey.
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 стать счётчиком:
или ты наебал
https://github.community/t5/Project-Development-Help-and/Open-Source-Projects/m-p/5604
Хотя, моё объяснение выглядит более правдоподобно.
Охуевшее существо.
Я тебя предупреждал.
Где здесь С++, 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, вызовется эта новая функция.
Эта задача уже более адекватная.
Кстати, рекомендую кнопку "ответить" и оборачивать код в .
Мне надо, изменить исходный код так, чтобы при выполнении js кода браузером и при встрече с "Math.random() * (max - min + 1) + min" эта строка вычислялась по отдельно написаной стандартной формуле. Остальные варианты вычисления Random пусть останутся как есть.
Охлол, то есть проще оказалось переписать Spidermonkey, чем код на JS?
Вон внизу defecate-plusplus дело говорит, заодно предлагает метод чуть-чуть попроще.
А defecate-plusplus дело говорит, но я не все понял.
2) раз уж хочется именно п.1, то надо патчить функцию, которая загружает исходники и отдает их на парсинг - например, пройтись регуляркой и заменить одну подстроку на другую, это позволит не ебаться с AST и прочими глубоко зарытыми нюансами и относительно легко апгрейдить версию чужой библиотеки со временем - в частности, "Math.random() * (max - min + 1) + min" подменять на "myRandom(min, max)", а myRandom вообще инжектить через свой дополнительно предварительно загружаемый к документу скрипт
3) искать и заменять конкретно "Math.random() * (max - min + 1) + min" - это какое-то весеннее обострение, не могу предположить практической пользы, этим даже атаку на клиентскую среду не сделать - у нормальных людей устанавливаемое ПО подписано, а иногда даже контролируется целостность загруженных модулей
4) как и собирать лису из исходников
с сайта браузер качает множество js файлов, парсит их и исполняет. В коде js есть множество вычислений типа random(), а также строчка "Math.floo(Math.random() * (max - min + 1) + min)". Надо чтобы именно эта форма вычислялась отдельно от остальных. Я думал проще будет вставить изменения в сам исходник лисы. А атака на клиентскую часть мне не нужна
в чем практическая польза
пиши в личку
не известно к чему это может привести, а люди разные, не хочу быть крайним
как это прописать в моем случае?
В API хроморасширений была возможность ловить запросы и реагировать на них.
Похоже, тут этой возможностью воспользовались: https://chrome.google.com/webstore/detail/requestly-redirect-url-mo/mdnleldcmiljblolnjhpnblkcekpdkpa
oracle2015@yandex.ru
пиши в личку
На сервер идёт запрос, сервер отдаёт файл, данные приходят, и только потом оказываются в оперативке. Если мы перехватываем запрос и отдаём свой файл, в оперативке будет уже он. Если мы подменим все файлы, в оперативке будут только наши файлы. В крайнем случае, если нельзя зарегистрировать свой сертификат, - сделать, чтобы прокси весь HTTPS преобразовывал в HTTP.
Хотя идея хорошая, но у меня не получилось
Попытка 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 и всё такое прочее. Интересно, а криптографии вообще хватит, чтобы два игрока играли в азартную игру, и не могли читерить, при этом не используя никакую третью сторону, которой все доверяют?
Серверу? Как это, показать серверу?
Показать можно клиенту. Тогда вопрос, клиент удалённый, он должен открыть страницу в инете и увидеть то, что ты хочешь, или ты можешь заранее подготовить машину и посадить за неё юзера?
Если задача заключена в этом, можно сделать в консоли юзерскриптом
и maxом, minом тоже нужно управлять
это самое Math.floor(Math.random() * (max - min + 1) + min) явно встречается счетное число раз в атакуемом коде
например в функциях foo() и в bar.baz()
вот их и переопределить юзерскриптом на то тело, которое отныне должно исполняться
это же динамический питух
там можно что угодно
Эту функцию и заменяй в юзерскрипте.
как он может загрузиться раньше?
Зависит от того, какой у тебя плагин для юзерскриптов. Гугли.
Какой плагин лучше использовать?
2) На localhost поднять свой сервак, все запросы на проксировать (отправлять запросы на реальный сайт, а если это нужный тебе .js, то подменять его сорс)
никакое вмешательство в оперативку не требуется
Можно ещё слушать и подменять траффик, исходящий на твой random.org/assets/js/hui.min.js. Антивирусы же это как-то делают.
Правда если сайт https, то хз, сработает ли такое.
если проверяет, то если для домена не сделали всякие TLS certificate pinning, то заводим себе корневой центр сертификатов, добавляем в хостовую ОС этот доверенный корневой центр, выпускаем сертификат на foobar.com, nginx начинает реверс проксить https -> https
но проще всего атакуемый код заменить на свой через юзерскрипт - я не понимаю, что это мешает сделать
1 - как загрузить юзерскрипт, чтобы пройти проверку загрузки. Исполнение кода загруженного с других источников блокируется сервером.
оно может только браузером "блокироваться"
разве миллион этих плагинов для юзерскриптов, тот же тамперманки, не запускаются, если пришёл строгий Access-Control-Allow-Origin?
я не проверял и лень это делать, но сомневаюсь
во-первых, "выдает ошибку" - это непрофессионально
так бухгалтерше можно говорить, но не программисту
во-вторых, в 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_"])
ПыСы:
кстати как здесь код оформить?
ты дебажишь свой юзерскрипт и спрашиваешь нас зачем ты это делаешь?
в чем проблема начать с простого
> и куда все подевались?
видимо, никому не интересен детсад
Вырвало.
( я дуб )
Что это такое? Куда ты это получил?
> кстати как здесь код оформить?
[code][/сode]
Блок парсинга находится по адресу mozilla-central/parser/..., там 4 папки expat, html, htmlparser и xml. Копал все, но пока не понял какие конкретно файлы мне надо править.
Весь код можно посмотреть https://dxr.mozilla.org/mozilla-central/source/
Кто парсить умеет, подскажите куда копать.
Мы видим 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.
Должно прокатить.
не хр....на не получается
но это у меня наверное.
Наверное, недели две её долбишь, всё никак не можешь кончить. Ты хоть С++ то вычучил ?
Писал хоть раньше программы сложнее "угадай писло" ?
есть кто живой? ау...
есть кто живой? ау...
кагдила?
#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();
Где оргументы?
Что за пиздец в цикле?
Или это фаллический символ? Тогда почему столь короткий?
Возьмусь за "一"!