0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 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
CTEPTOP 01.04.2018 19:29 # −102
1024-- 01.04.2018 19:52 # +3
https://github.com/ricardoquesada/Spidermonkey/blob/master/js/src/jsmath.cpp#L801
Автор курочит интерпретатор JS и, видимо, когда у него получится реализовать задуманное, будет компилировать Firefox. Этим делом он занимается уже минимум три недели, но пока безуспешно.
Возможно, школьник-энтузиаст. Если у него получится, будет большой плюс в карму. Если не получится - ничего постыдного нет.
Автору я бы посоветовал подучить C++, чтобы можно было читать исходный код Spidermonkey и документацию. Без должных знаний C++ скорее всего продвинуться не удастся. Затем, соответственно, попытаться понять Spidermonkey.
1024-- 01.04.2018 20:07 # +2
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 стать счётчиком:
inho 01.04.2018 23:00 # −1
или ты наебал
1024-- 02.04.2018 06:46 # +2
https://github.community/t5/Project-Development-Help-and/Open-Source-Projects/m-p/5604
Steve_Brown 02.04.2018 14:12 # 0
1024-- 02.04.2018 20:42 # 0
Хотя, моё объяснение выглядит более правдоподобно.
PaulDenisevich 02.04.2018 21:15 # −3
CTEPTOP 02.04.2018 21:27 # −104
Охуевшее существо.
PaulDenisevich 02.04.2018 23:25 # −2
CTEPTOP 03.04.2018 01:42 # −102
Я тебя предупреждал.
DrAli 06.04.2018 08:08 # 0
inho 01.04.2018 22:57 # 0
Где здесь С++, DrAli?
bormand 01.04.2018 22:59 # +5
DrAli 02.04.2018 05:06 # +1
DrAli 03.04.2018 06:40 # 0
это часть исходника:
это исходный код:
double
js::math_random_no_outparam(JSConte xt* cx)
{
return random_nextDouble(&cx->compartment()->rngState);
}
DrAli 03.04.2018 06:41 # 0
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 срабатывал именно прописанный рандом браузера...
subaru 03.04.2018 07:22 # 0
нанять программиста на фриланс.ру
1024-- 03.04.2018 19:53 # +1
Я же говорил, нужно изучать 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].
DrAli 04.04.2018 05:26 # 0
Мне надо, изменить исходный код так, чтобы при выполнении js кода браузером и при встрече с "Math.random() * (max - min + 1) + min" эта строка вычислялась по отдельно написаной стандартной формуле. Остальные варианты вычисления Random пусть останутся как есть.
1024-- 04.04.2018 09:23 # 0
Охлол, то есть проще оказалось переписать Spidermonkey, чем код на JS?
Вон внизу defecate-plusplus дело говорит, заодно предлагает метод чуть-чуть попроще.
DrAli 05.04.2018 09:56 # 0
А defecate-plusplus дело говорит, но я не все понял.
defecate-plusplus 04.04.2018 08:57 # +2
2) раз уж хочется именно п.1, то надо патчить функцию, которая загружает исходники и отдает их на парсинг - например, пройтись регуляркой и заменить одну подстроку на другую, это позволит не ебаться с AST и прочими глубоко зарытыми нюансами и относительно легко апгрейдить версию чужой библиотеки со временем - в частности, "Math.random() * (max - min + 1) + min" подменять на "myRandom(min, max)", а myRandom вообще инжектить через свой дополнительно предварительно загружаемый к документу скрипт
3) искать и заменять конкретно "Math.random() * (max - min + 1) + min" - это какое-то весеннее обострение, не могу предположить практической пользы, этим даже атаку на клиентскую среду не сделать - у нормальных людей устанавливаемое ПО подписано, а иногда даже контролируется целостность загруженных модулей
4) как и собирать лису из исходников
DrAli 05.04.2018 09:21 # 0
с сайта браузер качает множество js файлов, парсит их и исполняет. В коде js есть множество вычислений типа random(), а также строчка "Math.floo(Math.random() * (max - min + 1) + min)". Надо чтобы именно эта форма вычислялась отдельно от остальных. Я думал проще будет вставить изменения в сам исходник лисы. А атака на клиентскую часть мне не нужна
defecate-plusplus 05.04.2018 11:40 # +1
в чем практическая польза
DrAli 05.04.2018 12:13 # −1
пиши в личку
defecate-plusplus 05.04.2018 12:43 # +1
DrAli 05.04.2018 13:41 # −1
не известно к чему это может привести, а люди разные, не хочу быть крайним
DrAli 05.04.2018 13:40 # 0
DrAli 17.10.2018 09:12 # 0
как это прописать в моем случае?
inho 04.04.2018 09:38 # +1
syoma 04.04.2018 09:44 # 0
1024-- 04.04.2018 19:11 # +1
В API хроморасширений была возможность ловить запросы и реагировать на них.
Похоже, тут этой возможностью воспользовались: https://chrome.google.com/webstore/detail/requestly-redirect-url-mo/mdnleldcmiljblolnjhpnblkcekpdkpa
DrAli 05.04.2018 09:54 # 0
DrAli 05.04.2018 09:53 # 0
gost 05.04.2018 10:14 # +1
1024-- 05.04.2018 10:39 # 0
DrAli 05.04.2018 12:16 # −1
[email protected]
пиши в личку
subaru 05.04.2018 12:39 # 0
inho 05.04.2018 12:41 # +1
DrAli 05.04.2018 13:42 # 0
inho 05.04.2018 14:13 # +3
1024-- 05.04.2018 16:20 # +1
На сервер идёт запрос, сервер отдаёт файл, данные приходят, и только потом оказываются в оперативке. Если мы перехватываем запрос и отдаём свой файл, в оперативке будет уже он. Если мы подменим все файлы, в оперативке будут только наши файлы. В крайнем случае, если нельзя зарегистрировать свой сертификат, - сделать, чтобы прокси весь HTTPS преобразовывал в HTTP.
DrAli 06.04.2018 07:05 # 0
Хотя идея хорошая, но у меня не получилось
gost 05.04.2018 18:08 # +1
Попытка 3: поставить Tampermonkey и зафигарить юзерскрипт.
DrAli 03.04.2018 08:17 # −1
DrAli 05.04.2018 15:13 # −1
с утра все буду описывать
DrAli 06.04.2018 07:04 # 0
начнем
Сразу скажу почему выбрал 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.
vistefan 06.04.2018 09:49 # −1
От рандома-то? Эдак ты бы его и по F5 задудосил. Ничего бы ему не было, просто зачем делать на сервере, если у клиента есть свой рандом. Это же не ответственная операция в случае с random.org, не криптография, а просто клиентский сервис.
Ты опять описываешь детали реализации, а не озвучиваешь задачу. Ты скажи, что тебе конкретно нужно сделать. Например, показать кому-то подготовленную страницу, так, чтобы человек нажал на кнопку Random, а ему выпало нужное тебе число. Или читануть в игре, использующей рандом на клиенте. Это описание задач. То, что ты говоришь — описание попыток решить неизвестную нам задачу.
Поставишь задачу, тебе скорее всего подскажут, как сделать её без перекомпиляции браузера и отдельных правил вычисления для каких-то js-выражений. Скорее всего, всё решается юзерскриптом.
P.S.
> код с блочной конструкцией
> аппаратно уменьшить заданный исходный диапазон генерации числа
Говори проще, не будь стертором.
roman-kashitsyn 06.04.2018 09:59 # +1
судя по рвению, он хочет онлайн-казино обыграть.
vistefan 06.04.2018 10:03 # 0
Тогда подменять надо не рандом, а данные, которые шлёшь серверу в ответ, о результатах рандома.
Интересно, как такое казино синхронизирует игроков…
P.S. Нужно децентрализованное казино на блокчейне, p2p и всё такое прочее. Интересно, а криптографии вообще хватит, чтобы два игрока играли в азартную игру, и не могли читерить, при этом не используя никакую третью сторону, которой все доверяют?
inho 06.04.2018 10:12 # −1
DrAli 06.04.2018 10:46 # 0
DrAli 06.04.2018 10:44 # 0
vistefan 06.04.2018 10:49 # 0
Серверу? Как это, показать серверу?
Показать можно клиенту. Тогда вопрос, клиент удалённый, он должен открыть страницу в инете и увидеть то, что ты хочешь, или ты можешь заранее подготовить машину и посадить за неё юзера?
vistefan 06.04.2018 09:57 # 0
Если задача заключена в этом, можно сделать в консоли юзерскриптом
inho 06.04.2018 10:09 # 0
и maxом, minом тоже нужно управлять
vistefan 06.04.2018 10:15 # 0
DrAli 06.04.2018 10:24 # 0
defecate-plusplus 06.04.2018 11:26 # 0
это самое Math.floor(Math.random() * (max - min + 1) + min) явно встречается счетное число раз в атакуемом коде
например в функциях foo() и в bar.baz()
вот их и переопределить юзерскриптом на то тело, которое отныне должно исполняться
DrAli 06.04.2018 11:57 # 0
defecate-plusplus 06.04.2018 12:00 # 0
это же динамический питух
там можно что угодно
vistefan 06.04.2018 12:02 # +1
Эту функцию и заменяй в юзерскрипте.
DrAli 06.04.2018 10:39 # 0
DrAli 06.04.2018 10:47 # 0
vistefan 06.04.2018 10:48 # 0
DrAli 06.04.2018 11:07 # 0
как он может загрузиться раньше?
vistefan 06.04.2018 11:12 # 0
Зависит от того, какой у тебя плагин для юзерскриптов. Гугли.
DrAli 06.04.2018 11:19 # −1
Какой плагин лучше использовать?
inho 06.04.2018 10:08 # 0
2) На localhost поднять свой сервак, все запросы на проксировать (отправлять запросы на реальный сайт, а если это нужный тебе .js, то подменять его сорс)
никакое вмешательство в оперативку не требуется
Можно ещё слушать и подменять траффик, исходящий на твой random.org/assets/js/hui.min.js. Антивирусы же это как-то делают.
Правда если сайт https, то хз, сработает ли такое.
DrAli 06.04.2018 10:21 # 0
defecate-plusplus 06.04.2018 11:22 # +1
если проверяет, то если для домена не сделали всякие TLS certificate pinning, то заводим себе корневой центр сертификатов, добавляем в хостовую ОС этот доверенный корневой центр, выпускаем сертификат на foobar.com, nginx начинает реверс проксить https -> https
но проще всего атакуемый код заменить на свой через юзерскрипт - я не понимаю, что это мешает сделать
DrAli 06.04.2018 11:30 # 0
1 - как загрузить юзерскрипт, чтобы пройти проверку загрузки. Исполнение кода загруженного с других источников блокируется сервером.
defecate-plusplus 06.04.2018 11:34 # +1
оно может только браузером "блокироваться"
разве миллион этих плагинов для юзерскриптов, тот же тамперманки, не запускаются, если пришёл строгий Access-Control-Allow-Origin?
я не проверял и лень это делать, но сомневаюсь
DrAli 06.04.2018 11:47 # 0
DrAli 06.04.2018 11:50 # 0
vistefan 06.04.2018 11:52 # 0
defecate-plusplus 06.04.2018 11:58 # 0
во-первых, "выдает ошибку" - это непрофессионально
так бухгалтерше можно говорить, но не программисту
во-вторых, в js и сетевом обмене всё на виду - отлаживай не хочу из консоли браузера
DrAli 06.04.2018 11:53 # 0
vistefan 06.04.2018 11:51 # 0
Ты не улавливаешь суть юзерскриптов. Тебе надо взять весь файл, код в котором ты пытаешься подменить (как мы понимаем, он не обфусцирован, если ты видишь в нём свои выражения с рандомами), сохранить его как юзерскрипт для нужного сайта с замененным кодом, как тебе нужно. И запретить загрузку оригинального файла, например заблокировать его адблоком.
defecate-plusplus 06.04.2018 11:55 # +1
зависит от условий работы
возможно, будет достаточно, если сначала сайт нормально себя загрузит, а потом уже запустится юзерскрипт, который изменит нужные функции, которые начнут с этого момента работать по-новому
vistefan 06.04.2018 11:59 # 0
А, ну да. Тем более, что выше он пишет, что подмена всего файла не даёт скрипту обращаться к серверу. Надо подменять в юс только один обработчик интересующего события.
defecate-plusplus 06.04.2018 12:04 # +1
без фактических симптомов это уравнение со слишком многими неизвестными
50% на то, что ему показалось, что сервер "выдает ошибку", но на самом деле там было что-то совсем другое
в общем случае серверу абсолютно поебать какой конкретно "скрипт" или "функция" или что угодно совершила HTTP POST/PUT, хоть утюг или левый носок - есть заголовки, есть тело запроса
и то и другое, естественно, не содержат магии больше, чем следует
DrAli 06.04.2018 12:10 # 0
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_"])
ПыСы:
кстати как здесь код оформить?
DrAli 06.04.2018 12:12 # 0
defecate-plusplus 06.04.2018 18:03 # +2
ты дебажишь свой юзерскрипт и спрашиваешь нас зачем ты это делаешь?
в чем проблема начать с простого
> и куда все подевались?
видимо, никому не интересен детсад
20_caHTuMeTpoB_ywaca 06.04.2018 18:06 # 0
Вырвало.
CTEPTOP 07.04.2018 01:32 # −103
DrAli 13.04.2018 08:03 # 0
shit 13.04.2018 10:22 # 0
( я дуб )
1024-- 13.04.2018 11:44 # 0
vistefan 06.04.2018 12:24 # 0
Что это такое? Куда ты это получил?
> кстати как здесь код оформить?
[code][/сode]
DrAli 06.04.2018 12:41 # 0
DrAli 06.04.2018 12:41 # 0
vistefan 06.04.2018 12:56 # 0
DrAli 06.04.2018 13:03 # 0
syoma 06.04.2018 16:35 # 0
20_caHTuMeTpoB_ywaca 06.04.2018 17:08 # 0
DrAli 06.04.2018 13:22 # 0
vistefan 06.04.2018 13:46 # 0
TOPT 06.04.2018 13:51 # +1
20_caHTuMeTpoB_ywaca 06.04.2018 15:07 # +1
DrAli 10.04.2018 14:20 # 0
shit 10.04.2018 14:36 # +2
1024-- 11.04.2018 14:23 # 0
DrAli 13.04.2018 07:49 # 0
Блок парсинга находится по адресу mozilla-central/parser/..., там 4 папки expat, html, htmlparser и xml. Копал все, но пока не понял какие конкретно файлы мне надо править.
Весь код можно посмотреть https://dxr.mozilla.org/mozilla-central/source/
Кто парсить умеет, подскажите куда копать.
1024-- 13.04.2018 12:55 # 0
Мы видим 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.
Должно прокатить.
bormand 13.04.2018 18:05 # +2
DrAli 19.04.2018 15:22 # −1
не хр....на не получается
но это у меня наверное.
yet_another_one_shit 19.04.2018 16:18 # +2
Наверное, недели две её долбишь, всё никак не можешь кончить. Ты хоть С++ то вычучил ?
Писал хоть раньше программы сложнее "угадай писло" ?
DrAli 30.08.2018 06:13 # −1
есть кто живой? ау...
DrAli 30.08.2018 06:17 # −1
есть кто живой? ау...
666_N33D135 30.08.2018 06:19 # +1
кагдила?
DrAli 30.08.2018 07:47 # 0
DrAli 30.08.2018 07:49 # 0
DrAli 30.08.2018 07:52 # 0
#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";
}
, но он с файла читает, а с буфера нет
yet_another_one_shit 30.08.2018 08:02 # 0
yet_another_one_shit 30.08.2018 08:12 # 0
> ifstream fin;
fin.open();
Где оргументы?
Что за пиздец в цикле?
DrAli 30.08.2018 08:36 # 0
DrAli 30.08.2018 08:39 # 0
DrAli 30.08.2018 08:48 # 0
DrAli 10.04.2018 15:41 # 0
shit 10.04.2018 15:52 # 0
1024-- 11.04.2018 14:25 # 0
Или это фаллический символ? Тогда почему столь короткий?
Возьмусь за "一"!
shit 11.04.2018 14:36 # 0