1 место «Со скриптами на ТЫ» | Часть 1 | Деобфускация JavaScript для начинающих

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
86495

Материал, как по мне, получился интересный, но немного технический, поэтому может не всем зайдёт, однако я даже мельком посмотрел на cloudflare, чего изначально в планах совсем не было.

По содержанию:
  • Часть 0(текст данной статьи). Эту часть можно рассматривать как введение в то, чем мы будем заниматься.
  • Часть 1(первое видео). Здесь мы знакомимся с AST(Abstract Syntax Tree), а также с инструментарием для дальнейшей работы, деобфусцируем PixelScan.net, а ещё кратко рассматриваем разные виды обфускации JavaScript.
  • Часть 2(второе видео). Данная часть, наверное, получилась самой интересной, хотя изначально планов по её созданию не было. Здесь мы рассматриваем CloudFlare, его обфускацию, а также автоматизируем извлечение данных для составления первого запроса(Готового решения "CloudFlare POST/GET" нет). Материал данной части полезен не только юным JS-реверсерам, но и людям, которые учатся/любят писать шаблоны на запросах, но пока обходят сложные случаи стороной, потому что не знают к чему подступиться.
  • Часть 3(третье видео). В этой части мы связываем получившееся приложение из второй части на NodeJS с ZennoPoster.

В добрый путь....

Обфускация кода, проще говоря, - это "процесс запутывания кода" с целью затруднить анализ программы, однако результат работы одного и того же обфусцированного и не обфусцированного кода должен быть одинаковым.
Под деобфускацией будем понимать обратный процесс ("процесс распутывания кода"), то есть приведения кода к более читабельному виду, чтобы упростить понимание работы программы.
В качестве примера возьмём PixelScan.net, хотя бы потому что он многим знаком, а ещё на нём наглядно можно продемонстрировать некоторые моменты.
Рассматривая скрипты можно сразу заметить парочку интересностей:


86496

  • Вместо нормального нейминга переменных у нас какая-то белиберда, соотвественно зачем эта переменная нужна мы можем понять только проследив за тем, как и где она используется. К сожалению, автоматически сделать нормальный смысловой нейминг возможным не представляется. Но, если честно, не так уж это и мешает, а порой, даже помогает. Почему это не страшно, мы поймём немного позже, сейчас пока не будем забегать вперед.
  • Большое количество скорее мёртвого кода, то есть такого кода, который никогда не будет выполняться. Эти мысли посещают сразу, когда видим кучу какого-то однообразного барахла, как это:
86497

С некоторым мёртвым кодом замечательно справляются минификаторы(UglifyJs, Google Closure Compiler), а с каким-то придётся повозиться вручную(точнее говоря написать скрипт, который удалит что-то по заданным признакам). Гуглить данную тему можно запросом "Dead code elimination".

  • Вишенкой на торте являются фрагменты кода вида x[call(123)]:
86498

Людей, знакомых с JS, сразу посещает мысль о том, что внутри [...] должна находиться строка, ведь конструкция x['y'] говорит говорит об обращении к свойству 'y' объекта x . Мы можем тормознуть скрипт, нажать esc(или открыть вкладку консоли), дабы поработать с консолью в текущем контексте, и убедиться в своей правоте, выполнив несколько вызовов:

86490

На самом деле такое сокрытие строк является основной проблемой при работе с данным кодом, ведь мы понятия не имеем что где вызывается, что конкретно делает какой-нибудь фрагмент кода и тд... Например, если бы отчётливо увидели строку кода window['navigator']['userAgent'], то могли бы предположить, что в данном месте начинается сбор данных о браузере и на всём, что следует дальше, стоит заострить внимание. Вместо такой строки в данном скрипте мы увидим что-то типа window[x(123)][x(321)].
Или, например, при ошибках в консоли зеннопостера по типу 'test failed: C4', мы бы могли использовать поиск по тексту скрипта, чтобы посмотреть, где этот test failed выводится, и что это за "C4" такой.

Для того чтобы заменить строкой вызовы функций внутри свойств объекта нужно понять что делает функция и что это за аргумент(об этом ниже в видео). После того, как мы найдём нужную нам информацию, можно приступать к замене данных фрагментов. Но как это сделать?

С одной стороны, для изменения текста программы можно использовать регулярные выражения, но дело в том, что JavaScript немного своеобразный язык программирования, который допускает всякие мыслимые и немыслимые конструкции. Например, введём в консоли +!+{} - и результатом будет 1! Обфускаторы могут этим пользоваться для того, чтобы усложнять нам жизнь. Сходу так и не поймёшь, что это какое-то выражение, а выражение, как известно, может быть вычислено. Следовательно, использование регулярок нам не очень подходит, поэтому лучше использовать что-то другое, а ещё лучше что-то готовое... Это я так плавно вас подвожу к
абстрактным синтаксическим деревьям.

Для начала стоит немного отойти от темы и понять, что происходит, когда наша программа выполняется, а точнее, какие есть промежуточные представления у нашей программы.
Первый этап - лексический анализ. Программа, которая им занимается известна как лексер/токенайзер(Lexer/Tokenizer). Она призвана разбить наш текст на лексемы(токены), то есть на некие неделимые единицы. Допустим, у нас есть программа, которая состоит из одного объявления переменной: let a = 2. Тогда результатом работы токенайзера будет какой-то такой массив(stream of tokens):

Код:
[
    { type: 'Keyword', value: 'let' },
    { type: 'Identifier', value: 'a' },
    { type: 'Punctuator', value: '=' },
    { type: 'Numeric', value: '2' }
]
Как мы видим, токен имеет какое-то описание в виде типа и значения.

Но токенайзер не может проверить синтаксически ли корректно написана наша программа, везде ли вы, например, где требуется, поставили ;. Синтаксическую корректность программы проверяет (как не странно) синтаксический анализатор или, попросту говоря, - парсер. В общем случае целью парсера(в теории) является проверка на синтаксическую корректность, но на практике парсер выдаёт ещё одно промежуточное представление, известное как "Абстрактное синтаксическое дерево"(Abstract Syntax Tree(AST)).
Всё, с текстом пока закончили, дальнейший процесс работы лучше всего демонстрировать в видео формате.


Пара слов по качеству записей: в видео иногда есть небольшие проблемы со звуком. За все три части я так и не заметил что наушники были не до конца вставлены в разъём. Также никакого сценария заранее прописано не было(это съело бы уйму времени), соответсвенно много мычания, раздумий, проговаривания чего-то про себя, но всё около-дела пояснено. Получился этакий live-формат. В первой части жёсткие затупы на 47:00 - 1:02:00, поэтому данный фрагмент рекомендую смотреть минимум на 2х, всё остальное тоже советую немного ускорить.

ЧАСТЬ 1. AST, BABEL, PIXELSCAN, OBFUSCATOR.IO

ЧАСТЬ 2. CLOUDFLARE

ЧАСТЬ 3. NODEJS + ZENNOPOSTER

C НАСТУПАЮЩИМ, ZENNOLAB!
Полезные материалы:
https://gist.github.com/attilabuti/78a493f174803c47c49f#minification-and-compression
 
Тема статьи
Нестандартные хаки
Номер конкурса статей
Шестнадцатый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Спасибо за статью, давно хотел попробовать разобрать, как вообще этот JS смотреть. А то предыдущие попытки открытия кода, когда все переменные названы одной буквой, вызывали только автоматический рефлекс закрытия страницы с последующей реабилитацией глаз от увиденного, и пожелания отдельного котла, для тех, кто этот код пишет :-)
 
  • Спасибо
Реакции: rastvl

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 992
Благодарностей
4 457
Баллы
113

DrunkDeath

Client
Регистрация
24.12.2014
Сообщения
589
Благодарностей
402
Баллы
63
Однозначно круто!!! Как раз в джаву ударился сильно
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 095
Благодарностей
6 496
Баллы
113

SHILY

Client
Регистрация
05.06.2016
Сообщения
258
Благодарностей
307
Баллы
63
Шикарный материал!
Спасибо большое за труды!:ay:

Позабавило, конечно, когда, непонимающий я, услышал "...ну это прям плинтус..."*HAHA*
 
Последнее редактирование:
  • Спасибо
Реакции: rastvl

Sanekk

Client
Регистрация
24.06.2016
Сообщения
999
Благодарностей
390
Баллы
63
ТС спасибо за ман, попробую на одном из проектов!
 

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
Спасибо за статью, давно хотел попробовать разобрать, как вообще этот JS смотреть. А то предыдущие попытки открытия кода, когда все переменные названы одной буквой, вызывали только автоматический рефлекс закрытия страницы с последующей реабилитацией глаз от увиденного, и пожелания отдельного котла, для тех, кто этот код пишет :-)
В данной теме с одной статьи во всём не разобраться, хотя она может быть даст кому-то старт.
Но вообще, такие умения не помешают всем, кто работает в вебе. Та же анонимность постера через эти знания и исправляется.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
Спасибо за инфу. С JS мало знаком, постепенно стараюсь применять в своих проектах и такая информация очень полезна.
 
Регистрация
23.03.2015
Сообщения
1 222
Благодарностей
765
Баллы
113
За видосики отдельный респект
 
  • Спасибо
Реакции: rastvl

strcn

Client
Регистрация
08.07.2017
Сообщения
73
Благодарностей
46
Баллы
18
Ну это настоящий подарок на Новый Год! Спасибо большое!
 

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
200
Баллы
43
техническая статья , круто )
 

heks

Client
Регистрация
01.10.2013
Сообщения
1 226
Благодарностей
330
Баллы
83
Ничего не понятно, но интересно))):D:D:D:D
 

Castaneda

Client
Регистрация
24.05.2019
Сообщения
873
Благодарностей
299
Баллы
63
Посмотреть вложение 86495
Материал, как по мне, получился интересный, но немного технический, поэтому может не всем зайдёт, однако я даже мельком посмотрел на cloudflare, чего изначально в планах совсем не было.

По содержанию:
  • Часть 0(текст данной статьи). Эту часть можно рассматривать как введение в то, чем мы будем заниматься.
  • Часть 1(первое видео). Здесь мы знакомимся с AST(Abstract Syntax Tree), а также с инструментарием для дальнейшей работы, деобфусцируем PixelScan.net, а ещё кратко рассматриваем разные виды обфускации JavaScript.
  • Часть 2(второе видео). Данная часть, наверное, получилась самой интересной, хотя изначально планов по её созданию не было. Здесь мы рассматриваем CloudFlare, его обфускацию, а также автоматизируем извлечение данных для составления первого запроса(Готового решения "CloudFlare POST/GET" нет). Материал данной части полезен не только юным JS-реверсерам, но и людям, которые учатся/любят писать шаблоны на запросах, но пока обходят сложные случаи стороной, потому что не знают к чему подступиться.
  • Часть 3(третье видео). В этой части мы связываем получившееся приложение из второй части на NodeJS с ZennoPoster.

В добрый путь....

Обфускация кода, проще говоря, - это "процесс запутывания кода" с целью затруднить анализ программы, однако результат работы одного и того же обфусцированного и не обфусцированного кода должен быть одинаковым.
Под деобфускацией будем понимать обратный процесс ("процесс распутывания кода"), то есть приведения кода к более читабельному виду, чтобы упростить понимание работы программы.
В качестве примера возьмём PixelScan.net, хотя бы потому что он многим знаком, а ещё на нём наглядно можно продемонстрировать некоторые моменты.
Рассматривая скрипты можно сразу заметить парочку интересностей:



  • Вместо нормального нейминга переменных у нас какая-то белиберда, соотвественно зачем эта переменная нужна мы можем понять только проследив за тем, как и где она используется. К сожалению, автоматически сделать нормальный смысловой нейминг возможным не представляется. Но, если честно, не так уж это и мешает, а порой, даже помогает. Почему это не страшно, мы поймём немного позже, сейчас пока не будем забегать вперед.
  • Большое количество скорее мёртвого кода, то есть такого кода, который никогда не будет выполняться. Эти мысли посещают сразу, когда видим кучу какого-то однообразного барахла, как это:

С некоторым мёртвым кодом замечательно справляются минификаторы(UglifyJs, Google Closure Compiler), а с каким-то придётся повозиться вручную(точнее говоря написать скрипт, который удалит что-то по заданным признакам). Гуглить данную тему можно запросом "Dead code elimination".

  • Вишенкой на торте являются фрагменты кода вида x[call(123)]:

Людей, знакомых с JS, сразу посещает мысль о том, что внутри [...] должна находиться строка, ведь конструкция x['y'] говорит говорит об обращении к свойству 'y' объекта x . Мы можем тормознуть скрипт, нажать esc(или открыть вкладку консоли), дабы поработать с консолью в текущем контексте, и убедиться в своей правоте, выполнив несколько вызовов:


На самом деле такое сокрытие строк является основной проблемой при работе с данным кодом, ведь мы понятия не имеем что где вызывается, что конкретно делает какой-нибудь фрагмент кода и тд... Например, если бы отчётливо увидели строку кода window['navigator']['userAgent'], то могли бы предположить, что в данном месте начинается сбор данных о браузере и на всём, что следует дальше, стоит заострить внимание. Вместо такой строки в данном скрипте мы увидим что-то типа window[x(123)][x(321)].
Или, например, при ошибках в консоли зеннопостера по типу 'test failed: C4', мы бы могли использовать поиск по тексту скрипта, чтобы посмотреть, где этот test failed выводится, и что это за "C4" такой.

Для того чтобы заменить строкой вызовы функций внутри свойств объекта нужно понять что делает функция и что это за аргумент(об этом ниже в видео). После того, как мы найдём нужную нам информацию, можно приступать к замене данных фрагментов. Но как это сделать?

С одной стороны, для изменения текста программы можно использовать регулярные выражения, но дело в том, что JavaScript немного своеобразный язык программирования, который допускает всякие мыслимые и немыслимые конструкции. Например, введём в консоли +!+{} - и результатом будет 1! Обфускаторы могут этим пользоваться для того, чтобы усложнять нам жизнь. Сходу так и не поймёшь, что это какое-то выражение, а выражение, как известно, может быть вычислено. Следовательно, использование регулярок нам не очень подходит, поэтому лучше использовать что-то другое, а ещё лучше что-то готовое... Это я так плавно вас подвожу к
абстрактным синтаксическим деревьям.

Для начала стоит немного отойти от темы и понять, что происходит, когда наша программа выполняется, а точнее, какие есть промежуточные представления у нашей программы.
Первый этап - лексический анализ. Программа, которая им занимается известна как лексер/токенайзер(Lexer/Tokenizer). Она призвана разбить наш текст на лексемы(токены), то есть на некие неделимые единицы. Допустим, у нас есть программа, которая состоит из одного объявления переменной: let a = 2. Тогда результатом работы токенайзера будет какой-то такой массив(stream of tokens):

Код:
[
    { type: 'Keyword', value: 'let' },
    { type: 'Identifier', value: 'a' },
    { type: 'Punctuator', value: '=' },
    { type: 'Numeric', value: '2' }
]
Как мы видим, токен имеет какое-то описание в виде типа и значения.

Но токенайзер не может проверить синтаксически ли корректно написана наша программа, везде ли вы, например, где требуется, поставили ;. Синтаксическую корректность программы проверяет (как не странно) синтаксический анализатор или, попросту говоря, - парсер. В общем случае целью парсера(в теории) является проверка на синтаксическую корректность, но на практике парсер выдаёт ещё одно промежуточное представление, известное как "Абстрактное синтаксическое дерево"(Abstract Syntax Tree(AST)).
Всё, с текстом пока закончили, дальнейший процесс работы лучше всего демонстрировать в видео формате.


Пара слов по качеству записей: в видео иногда есть небольшие проблемы со звуком. За все три части я так и не заметил что наушники были не до конца вставлены в разъём. Также никакого сценария заранее прописано не было(это съело бы уйму времени), соответсвенно много мычания, раздумий, проговаривания чего-то про себя, но всё около-дела пояснено. Получился этакий live-формат. В первой части жёсткие затупы на 47:00 - 1:02:00, поэтому данный фрагмент рекомендую смотреть минимум на 2х, всё остальное тоже советую немного ускорить.

ЧАСТЬ 1. AST, BABEL, PIXELSCAN, OBFUSCATOR.IO

ЧАСТЬ 2. CLOUDFLARE

ЧАСТЬ 3. NODEJS + ZENNOPOSTER

C НАСТУПАЮЩИМ, ZENNOLAB!
Самая актуальная тема сейчас!
Голосую! Даешь первое место!!!
 
  • Спасибо
Реакции: rastvl

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
Позабавило, конечно, когда, непонимающий я, услышал "...ну это прям плинтус..."*HAHA*
В данном случае что-то могло показаться сложным, если не знать JS, ведь всё, что по сути делалось, это "Смотрим на дерево, ищем нужный фрагмент, возвращаемся в код и пишем нужные условия для извлечения этого фрагмента. Повторяем" :-). Без знаний JS здесь, возможно, могли показаться сложными некоторые моменты, как например тот, где вытягивались нужные переменные для нужного блока кода, однако сам язык сейчас настолько популярен, что сложно по нему не найти обучающих материалов. Из того что я про себя помню:
- "Д. Флэнаган | JavaScript. Полное руководство" (Где-то очень всё сухо, без гугла не обойтись, но прелесть книги в том, что рассматривается не только ES6, а более старые версии языка + рассматривается в первой части сам язык, как таковой, то есть без его использования в браузере)
- https://exploringjs.com/es6/ (Доходчиво про относительно новые фичи)
- https://gist.github.com/attilabuti/78a493f174803c47c49f#minification-and-compression (Полезно знать какими оптимизациями могут пользоваться те же минификаторы, чтобы не впадать в ступор, когда видишь строчку "void 0" вместо "undefined", ну или бесконечное количество запятых. Дополнительно можно гуглить "JavaScript golfing")
... Ну и всякий стандарт, который легко гуглится: learn.javascript.ru, You don't know JS и тд...

Самая актуальная тема сейчас!
Самая актуальная анонимность, наверное)
Но статья и к ней имеет прямое отношение. В том же коде клауда встретилась строчка:
(function(){ var workerData = {platform: navigator.platform,languages: navigator.languages};postMessage(workerData);})()
которая говорит о скане языков из воркеров. Сейчас зенке это не страшно, но потом они могут из воркеров ещё больше брать... А ещё CF выполняет какие-то неадекватные проверки по типу Object.getOwnPropertyNames(window). В общем, есть там занимательные моменты... Понимание того, что происходит, никому не помешает
 
  • Спасибо
Реакции: todayer и Castaneda

Castaneda

Client
Регистрация
24.05.2019
Сообщения
873
Благодарностей
299
Баллы
63
Посмотреть вложение 86495
Материал, как по мне, получился интересный, но немного технический, поэтому может не всем зайдёт, однако я даже мельком посмотрел на cloudflare, чего изначально в планах совсем не было.

По содержанию:
  • Часть 0(текст данной статьи). Эту часть можно рассматривать как введение в то, чем мы будем заниматься.
  • Часть 1(первое видео). Здесь мы знакомимся с AST(Abstract Syntax Tree), а также с инструментарием для дальнейшей работы, деобфусцируем PixelScan.net, а ещё кратко рассматриваем разные виды обфускации JavaScript.
  • Часть 2(второе видео). Данная часть, наверное, получилась самой интересной, хотя изначально планов по её созданию не было. Здесь мы рассматриваем CloudFlare, его обфускацию, а также автоматизируем извлечение данных для составления первого запроса(Готового решения "CloudFlare POST/GET" нет). Материал данной части полезен не только юным JS-реверсерам, но и людям, которые учатся/любят писать шаблоны на запросах, но пока обходят сложные случаи стороной, потому что не знают к чему подступиться.
  • Часть 3(третье видео). В этой части мы связываем получившееся приложение из второй части на NodeJS с ZennoPoster.

В добрый путь....

Обфускация кода, проще говоря, - это "процесс запутывания кода" с целью затруднить анализ программы, однако результат работы одного и того же обфусцированного и не обфусцированного кода должен быть одинаковым.
Под деобфускацией будем понимать обратный процесс ("процесс распутывания кода"), то есть приведения кода к более читабельному виду, чтобы упростить понимание работы программы.
В качестве примера возьмём PixelScan.net, хотя бы потому что он многим знаком, а ещё на нём наглядно можно продемонстрировать некоторые моменты.
Рассматривая скрипты можно сразу заметить парочку интересностей:



  • Вместо нормального нейминга переменных у нас какая-то белиберда, соотвественно зачем эта переменная нужна мы можем понять только проследив за тем, как и где она используется. К сожалению, автоматически сделать нормальный смысловой нейминг возможным не представляется. Но, если честно, не так уж это и мешает, а порой, даже помогает. Почему это не страшно, мы поймём немного позже, сейчас пока не будем забегать вперед.
  • Большое количество скорее мёртвого кода, то есть такого кода, который никогда не будет выполняться. Эти мысли посещают сразу, когда видим кучу какого-то однообразного барахла, как это:

С некоторым мёртвым кодом замечательно справляются минификаторы(UglifyJs, Google Closure Compiler), а с каким-то придётся повозиться вручную(точнее говоря написать скрипт, который удалит что-то по заданным признакам). Гуглить данную тему можно запросом "Dead code elimination".

  • Вишенкой на торте являются фрагменты кода вида x[call(123)]:

Людей, знакомых с JS, сразу посещает мысль о том, что внутри [...] должна находиться строка, ведь конструкция x['y'] говорит говорит об обращении к свойству 'y' объекта x . Мы можем тормознуть скрипт, нажать esc(или открыть вкладку консоли), дабы поработать с консолью в текущем контексте, и убедиться в своей правоте, выполнив несколько вызовов:


На самом деле такое сокрытие строк является основной проблемой при работе с данным кодом, ведь мы понятия не имеем что где вызывается, что конкретно делает какой-нибудь фрагмент кода и тд... Например, если бы отчётливо увидели строку кода window['navigator']['userAgent'], то могли бы предположить, что в данном месте начинается сбор данных о браузере и на всём, что следует дальше, стоит заострить внимание. Вместо такой строки в данном скрипте мы увидим что-то типа window[x(123)][x(321)].
Или, например, при ошибках в консоли зеннопостера по типу 'test failed: C4', мы бы могли использовать поиск по тексту скрипта, чтобы посмотреть, где этот test failed выводится, и что это за "C4" такой.

Для того чтобы заменить строкой вызовы функций внутри свойств объекта нужно понять что делает функция и что это за аргумент(об этом ниже в видео). После того, как мы найдём нужную нам информацию, можно приступать к замене данных фрагментов. Но как это сделать?

С одной стороны, для изменения текста программы можно использовать регулярные выражения, но дело в том, что JavaScript немного своеобразный язык программирования, который допускает всякие мыслимые и немыслимые конструкции. Например, введём в консоли +!+{} - и результатом будет 1! Обфускаторы могут этим пользоваться для того, чтобы усложнять нам жизнь. Сходу так и не поймёшь, что это какое-то выражение, а выражение, как известно, может быть вычислено. Следовательно, использование регулярок нам не очень подходит, поэтому лучше использовать что-то другое, а ещё лучше что-то готовое... Это я так плавно вас подвожу к
абстрактным синтаксическим деревьям.

Для начала стоит немного отойти от темы и понять, что происходит, когда наша программа выполняется, а точнее, какие есть промежуточные представления у нашей программы.
Первый этап - лексический анализ. Программа, которая им занимается известна как лексер/токенайзер(Lexer/Tokenizer). Она призвана разбить наш текст на лексемы(токены), то есть на некие неделимые единицы. Допустим, у нас есть программа, которая состоит из одного объявления переменной: let a = 2. Тогда результатом работы токенайзера будет какой-то такой массив(stream of tokens):

Код:
[
    { type: 'Keyword', value: 'let' },
    { type: 'Identifier', value: 'a' },
    { type: 'Punctuator', value: '=' },
    { type: 'Numeric', value: '2' }
]
Как мы видим, токен имеет какое-то описание в виде типа и значения.

Но токенайзер не может проверить синтаксически ли корректно написана наша программа, везде ли вы, например, где требуется, поставили ;. Синтаксическую корректность программы проверяет (как не странно) синтаксический анализатор или, попросту говоря, - парсер. В общем случае целью парсера(в теории) является проверка на синтаксическую корректность, но на практике парсер выдаёт ещё одно промежуточное представление, известное как "Абстрактное синтаксическое дерево"(Abstract Syntax Tree(AST)).
Всё, с текстом пока закончили, дальнейший процесс работы лучше всего демонстрировать в видео формате.


Пара слов по качеству записей: в видео иногда есть небольшие проблемы со звуком. За все три части я так и не заметил что наушники были не до конца вставлены в разъём. Также никакого сценария заранее прописано не было(это съело бы уйму времени), соответсвенно много мычания, раздумий, проговаривания чего-то про себя, но всё около-дела пояснено. Получился этакий live-формат. В первой части жёсткие затупы на 47:00 - 1:02:00, поэтому данный фрагмент рекомендую смотреть минимум на 2х, всё остальное тоже советую немного ускорить.

ЧАСТЬ 1. AST, BABEL, PIXELSCAN, OBFUSCATOR.IO

ЧАСТЬ 2. CLOUDFLARE

ЧАСТЬ 3. NODEJS + ZENNOPOSTER

C НАСТУПАЮЩИМ, ZENNOLAB!

86667

с вот таким кодом справиться какими-то автоматическими инструментами возможно или тоже все ручками?
 

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93

Bas

Client
Регистрация
15.12.2013
Сообщения
636
Благодарностей
263
Баллы
63
Круто. Спасибо. Жаль что inject так и остался за кадром. Не хватает знаний самостоятельно добить второй запрос :( Да и куки, которые тоже генерит этот же скрипт клауда как-то надо вытянуть...
 
  • Спасибо
Реакции: rastvl

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
Круто. Спасибо. Жаль что inject так и остался за кадром. Не хватает знаний самостоятельно добить второй запрос :( Да и куки, которые тоже генерит этот же скрипт клауда как-то надо вытянуть...
Хронометраж) Да и я сомневаюсь, что за те же 2 часа можно было бы пройти второй шаг, иначе зачем этот клаудфлеер вообще был бы нужен. А ещё в общий доступ вываливать слишком много инфы такой себе вариант... Лучше самому изучить и понять, как нужно правильно всё сделать. Да, долго, но зато и на следующий день будет работать
 
  • Спасибо
Реакции: SHILY

Jambo

Client
Регистрация
28.11.2019
Сообщения
7
Благодарностей
16
Баллы
3
Очень круто, автору большой респект.;-) Увидел на ютубе, посмотрел залпом, тема развёрнута очень доходчиво. Даже с моими начальными знаниями веб-разработчика, удалось достичь такого результата:
86714

Будем дальше разбираться :ay:
 
Последнее редактирование:

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
js исполняется в браузере - зачем он вообще нужен при использовании ZP? - не ясно направление применения ....
 

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
js исполняется в браузере - зачем он вообще нужен при использовании ZP? - не ясно направление применения ....
Тема напрямую касается работы с сайтами в принципе, иногда полезно понимать, как работает тот или иной функционал. Бывает даже в браузере для скорости нужно нажать кнопочку без мышки, а вот она средствами зенки не нажимается, потому что события кастомные(или мышка вообще бежит до цели полчаса).
Да и вообще-то далеко не все пишут браузерные шаблоны, если уж на то пошло, запросы-то побыстрее будут и полегче во много-много раз
 
  • Спасибо
Реакции: bigloafer, Kulya и SHILY

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
149
Благодарностей
117
Баллы
43
Лайк этому господину за старания!) А скажи пожалуйста, как можно использовать javascript в зеннопостере чтобы запустить событие из этой темы https://zennolab.com/discussion/threads/vopros-po-javascript.98278/ Желательно без использования кнопок, а сразу на выполнение. Если поможешь с меня лайки не только с этого аккаунта, но и с остальных лицух
 

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
как можно использовать javascript в зеннопостере
Кубик есть "Свой JavaScript код", который имеет несколько вариантов. Аналог расширений скорее всего параметр "При загрузке страницы". Параметр "на текущей странице" это по сути как в консоль код вставить.
Желательно без использования кнопок, а сразу на выполнение.
Я не знаю как работает расширение метамаска. Если оно в глобальный объект Window добавляет свойство ethereum, то должно быть можно в консоли сделать что-то такое:
Код:
window.accounts = [];

//Sending Ethereum to an address
window.sendEth = _ => {
  ethereum
    .request({
      method: 'eth_sendTransaction',
      params: [
        {
          from: window.accounts[0],
          to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970',
          value: '0x29a2241af62c0000',
          gasPrice: '0x09184e72a000',
          gas: '0x2710',
        },
      ],
    })
    .then((txHash) => console.log(txHash))
    .catch((error) => console.error);
};

window.getAccount = async () => {
  window.accounts = await ethereum.request({ method: 'eth_requestAccounts' });
}
Соответственно, аналог нажатию кнопки "Enable Ethereum" есть функция window.getAccounts(), а аналог кнопки "SendEth" функция window.sendEth().
Значит в той же зенке можно выполнить сначала "свой JS код" с параметром "на текущей странице" код выше.
И сделать два подобных кубика, в первом из которых будет:
JavaScript:
window.getAccounts()
- выполнение этого кубика будет аналогом нажатию кнопки "Enable Ethereum",
а второй:
JavaScript:
window.sendEth()
- а это аналог нажатию кнопки "SendEth".
Стоит обратить внимание, что в обоих случаях асинхронность, следовательно друг за другом кубы без пауз выполнять не стоит.
Если поможешь с меня лайки не только с этого аккаунта, но и с остальных лицух
Такого наверн делать не нужно, я ответил, потому что вопрос немного касается темы, а точнее zennoposter+js
 
  • Спасибо
Реакции: ShikoFess

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
149
Благодарностей
117
Баллы
43
Кубик есть "Свой JavaScript код", который имеет несколько вариантов. Аналог расширений скорее всего параметр "При загрузке страницы". Параметр "на текущей странице" это по сути как в консоль код вставить.

Я не знаю как работает расширение метамаска. Если оно в глобальный объект Window добавляет свойство ethereum, то должно быть можно в консоли сделать что-то такое:
Код:
window.accounts = [];

//Sending Ethereum to an address
window.sendEth = _ => {
  ethereum
    .request({
      method: 'eth_sendTransaction',
      params: [
        {
          from: window.accounts[0],
          to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970',
          value: '0x29a2241af62c0000',
          gasPrice: '0x09184e72a000',
          gas: '0x2710',
        },
      ],
    })
    .then((txHash) => console.log(txHash))
    .catch((error) => console.error);
};

window.getAccount = async () => {
  window.accounts = await ethereum.request({ method: 'eth_requestAccounts' });
}
Соответственно, аналог нажатию кнопки "Enable Ethereum" есть функция window.getAccounts(), а аналог кнопки "SendEth" функция window.sendEth().
Значит в той же зенке можно выполнить сначала "свой JS код" с параметром "на текущей странице" код выше.
И сделать два подобных кубика, в первом из которых будет:
JavaScript:
window.getAccounts()
- выполнение этого кубика будет аналогом нажатию кнопки "Enable Ethereum",
а второй:
JavaScript:
window.sendEth()
- а это аналог нажатию кнопки "SendEth".
Стоит обратить внимание, что в обоих случаях асинхронность, следовательно друг за другом кубы без пауз выполнять не стоит.


Такого наверн делать не нужно, я ответил, потому что вопрос немного касается темы, а точнее zennoposter+js
Спасибо почти все работает)
window.getAccounts() не пашет, н о вместо него в коде from: window.accounts[0], сразу вписал свой адрес. И все робит если запускать на текущей странице, при открытой вкладке с любым сайтом
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
window.getAccounts() не пашет
Это к коду самого метамаска вопрос)

Делать запросы через фетч? Или как он там у них называется ...
А это здесь причём? Запросы через зеннопостер делаются. Тема не про сам JavaScript, а про его деобфускацию, которая нужна для того, чтобы понимать функциональность сайта, что где и как генерируется в тех же запросах и т.д... Вон выше человек также привёл пример того, как исправил ситуацию на том же пиксельскане, ведь если на этот сайт просто зайти через зеннопостер, то получится это:
86788
То есть сайт определяет браузер зенно, как бота, но, понимая как он это делает(опять же, понимая функциональность), можно таких детектов избежать.
Да и вообще, в одном из прикольных интервью (тайминг: 1:13:40)
очень хорошо подмечено, что нам с серверов сайтов прилетают какие-то скрипты, по сути являющиеся полноценными программами, которые без нашего ведома исполняются на наших компьютерах. Я думаю, мало кому помешает умение разбираться в том, что эти скрипты делают
 
Последнее редактирование:
  • Спасибо
Реакции: bigloafer, SHILY и semafor

Zoron

Client
Регистрация
24.09.2014
Сообщения
145
Благодарностей
39
Баллы
28
Очень интересная статья, мой голос за тобой! )
Если есть что еще по теме - выкладывай, с удовольствием почитаем...
 
  • Спасибо
Реакции: rastvl

rastvl

Client
Команда форума
Регистрация
16.01.2019
Сообщения
656
Благодарностей
1 061
Баллы
93
Если есть что еще по теме - выкладывай, с удовольствием почитаем...
В самый конец статьи что-то прикрепил, потом ещё может чего добавлю(всё разбросано по браузерам/компьютерам, поэтому так сразу всё и не найти).
 
  • Спасибо
Реакции: Zoron

ZennoCat

Client
Регистрация
06.01.2020
Сообщения
46
Благодарностей
14
Баллы
8
Спасибо, давно пытаюсь разобраться с этой темой. Отдал голос. :-)
 
  • Спасибо
Реакции: rastvl

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)