Весь контент в этой статье предназначен только для обучения и общения, а не для каких-либо других целей. Полный код не предоставляется. Содержимое захвата пакетов, конфиденциальные URL-адреса, интерфейсы данных и т. д. были десенсибилизированы и строго запрещены для коммерческих и незаконных целей. В противном случае все последствия, вытекающие из этого, не имеют к автору никакого отношения!
Эту статью запрещено перепечатывать без разрешения и распространять после каких-либо изменений. Автор не несет ответственности за любые несчастные случаи, вызванные несанкционированным использованием технологии, описанной в этой статье. В случае каких-либо нарушений, пожалуйста, свяжитесь с автором. в публичном аккаунте [K Brother Reptile], чтобы немедленно удалить его!
aHR0cHM6Ly93d3cuZG91eWluLmNvbS9hd2VtZS92MS93ZWIvdXNlci9wcm9maWxlL290aGVyLw==
JSVMP означает защиту кода на основе виртуальной машины для JavaScript, которая представляет собой решение для защиты виртуализации кода JS.
Концепция JSVMP была впервые предложена Куанг Кайюанем, студентом магистратуры Северо-Западного университета в 2015 году, в его диссертации 2018 года. Название диссертации: «Исследование и реализация метода защиты виртуализации кода JavaScript на основе WebAssembly в том же году». Он также подал заявку. Получил национальный патент, название патента: «Метод защиты виртуализации JavaScript, основанный на технологии внешнего байт-кода», который можно напрямую искать в Интернете или вы можете ответить в фоновом режиме общедоступной учетной записи [K Brother Crawler] JSVMP, бесплатный доступ к оригинальным статьям и патентам в высоком разрешении без водяных знаков. В этой статье будет кратко представлено JSVMP. Если вы хотите узнать об этом больше, конечно, рекомендуется прочитать эту статью.
Суть JSVMP заключается во внедрении идеи виртуализации кода в процесс защиты кода JavaScript, реализации процесса виртуализации исходного кода и преобразовании целевого кода в настраиваемые байт-коды. Эти байт-коды могут распознаваться только специальными интерпретаторами, скрывая их. цель Ключевая логика кода. В статье Куанг Кайюаня технология WebAssembly использовалась для реализации специального виртуального интерпретатора, а логика выполнения интерпретатора была скрыта посредством компиляции. Процесс защиты JSVMP показан на рисунке ниже:
полный JSVMP Система защиты, общая архитектура должна быть такой: чтение на стороне сервера JavaScript код —> Лексический анализ —> синтаксический анализ —> Создать синтаксическое дерево AST —> Генерировать частные инструкции —> Создайте соответствующий частный интерпретатор, зашифруйте частные инструкции и отправьте частный интерпретатор в браузер, а затем интерпретируйте и выполните его.
Помимо статьи Куан Кайюаня, также стоит изучить следующие статьи:
На данный момент существует три обратных метода для JSVMP (автоматизация не включена): удаленный вызов RPC, исправление среды и алгоритм восстановления точки останова журнала. Точки останова журнала также называются инструментарием, который находит ключевые местоположения и выводит информацию журнала о ключевых параметрах. логику, работая в обратном направлении от результатов для достижения цели восстановления алгоритма. Брат К. из технологии RPC уже написал статью, и я напишу метод дополнения среды, когда у меня будет время. В этой статье в основном рассказывается, как использовать инструменты для этого. восстановить алгоритм.
Случайным образом зайдите на домашнюю страницу определенного блоггера, найдите ее после захвата пакета, и вы найдете интерфейс. JSON Данные содержат определенный номер телефона блоггера, сертификационную информацию, подпись, подписку, поклонников, лайки и т. д., запрос. Query String Parameters
содержит X-Bogus
Параметры будут меняться при каждом запросе, помимо sec_user_id
Это домашняя страница блоггера URL Веревка позади,webid
Напрямую запросите домашнюю страницу, чтобы вернуть контент.,msToken
и cookie связанный с ясным cookie Access, такого параметра нет, и интерфейс не проверен реальным тестированием. webid
и msToken
,Просто оставьте это поле пустым.
Этот запрос XHR Запрос, так что следующий XHR точка останова, когда URL Содержит X-Bogus
Когда параметр установлен, он будет отключен:
Следуйте за стопкой вперед и доберитесь до места под названием webmssdk.js из JS Файл, сюда естьгенерироватьпараметриз主要 JS Логика, то есть JSVMP в целом запутан и его можно использовать здесь. AST Чтобы прояснить путаницу, брат К. также написал ранее: AST из статьи, здесь дело не в восстановлении путаницы, мы используем это напрямую V Лаосский плагин v_jstools Чтобы восстановить:
Использовать браузер после восстановления Overrides Функция замены будет webmssdk.js Замените его и следуйте по стопке вверх, как показано на рисунке ниже, до W Он уже был создан здесь X-Bogus
Понятно,this.openArgs[1]
Просто неси это X-Bogus
неполный URL, посмотрите внимательно этот абзац, там много троичных выражений, когда M изценитьдля 15 Когда , мы придем к этой логике, U После того, как значение из сгенерировано, появляется S[C] = U
из эксплуатации.
Посмотри дальше, С. Это массив. Если вы выполните одноэтапную отладку, вы обнаружите, что код всегда будет выглядеть следующим образом. if-else
излогики, почти каждый шаг S Параметры массива, постоянно добавляйте, удаляйте, изменяйте и проверяйте значения в нем, для Внутри цикла из I ценность, определяет последующие действия if Предложение из направления, здесь также то Разгадка наличия приборов показана на рисунке ниже:
большойиз for цикл и if-else В логике есть два места. Чтобы окончательный журнал был более подробным и полным, установите точку останова журнала в обоих местах (щелкните правой кнопкой мыши). Add logpoint
),Содержимое точки остановадля:
"Расположение 1", "индексI", I, "Индекс А", A, "Ценности: ", JSON.stringify(S, function(key, value) {if (value == window) {return undefined} return value})
"Расположение 2", "индексI", I, "Индекс А", A, "Ценности: ", JSON.stringify(S, function(key, value) {if (value == window) {return undefined} return value})
Инструментальный выход S из Зачем писать такую длинную строку? первый JSON.stringify()
Функция метода из заключается в преобразовании JavaScript Значение преобразуется в JSON Строка, основной синтаксис JSON.stringify(value[, replacer [, space]])
,Без преобразования в JSON, тогда S из значения,Вывод может выглядеть такиз:[empty, Array(26), 1, Array(0)]
,ты не можешь видеть Array Конкретное значение в массиве, у этого метода есть опция параметра заменитель, если replacer является функцией, то JSON.stringify
Эта функция будет вызвана, и каждый ключ и значение члена будут переданы. Члены могут быть обработаны в функции, и, наконец, обработанное значение будет возвращено, если эта функция вернет результат. не определено, исключите член, например:
var obj1 = {key1: 'value1', key2: 'value2'}
function changeValue(key, value) {
if (value == 'value2') {
return 'Публичный аккаунт: Брат К, рептилия'
} return value
}
var obj2 = JSON.stringify(obj1, changeValue)
console.log(obj2)
// Вывод: {"key1":"value1","key2":"Официальный аккаунт: Брат К, рептилия"}
Выше изкодсередина JSON.stringify
Когда передается функция, value
для value2
заменить его строкой Публичный аккаунт: Брат К, рептилия
,Далее мы покажем, когда value
для window
Что происходит, когда:
Согласно отчету об ошибке мы можем Здесь возникает исключение из-за циклической ссылки. Вы должны знать, что во время инструментирования, если в содержимом инструментария сообщается об ошибке, журнал не будет выводиться нормально, и в этом случае часть журнала будет отсутствовать. можно добавить функцию для ее обработки. value для window время, JSON Функция возвращает результат при обработке undefined, исключите этот элемент, а остальные элементы будут выведены обычным образом, как показано на следующем рисунке:
выше есть точка останова журнала для Почему я должен писать это так? Причина в том, что после установки точки останова журнала обратите внимание на предыдущие шаги, которые мы сделали. XHR Не отменяйте точку останова, затем обновите веб-страницу, и консоль начнет печатать логи, потому что их много. XHR Запросы включены X-Подделка, если ты XHR При отмене точки останова журнал будет продолжать печататься до тех пор, пока он не заморозится. После завершения вывода журнала имеется около 8000 журналов. Последний журнал можно просмотреть с помощью поиска. X-Bogus Уже создано:
Щелкните правой кнопкой мыши страницу журнала печати напрямую. save as..
,Экспорт журналов на локальный компьютер для анализа。X-Bogus
Состоит из 28 символов, теперь сделайте это есть看 DFSzswVOAATANH89SMHZqF9WX7n6
этот28Откуда взялись персонажи?из,Найдите эту строку в журнале,Найдите место, где впервые появляется из,Это можно узнать, наблюдая,Он генерирует посимвольно посимвольно,Как показано в красном поле на рисунке ниже:
На изображении выше строка 8511, X-Bogus. Следующий элемент строки из — это null, в строке 8512 генерируется число 6, поэтому между этими двумя шагами есть номер 6из генерирует логику. В данный момент мы смотрим на строку 8511 и видим точку останова журнала. Расположение 2 индексI 16 Индекс А 738
,Затем мы возвращаемся на исходную веб-страницу,существовать Расположение2,следующая условная точка останова(Щелкните правой кнопкой мыши Add conditional breakpoint
),когда I == 16 && A == 738 && S[7] && S[7] == 21
Отрежьте, когда придет время. Причина добавления S[7]
Это потому что для индексI 16 Индекс А 738
из Расположение Есть много,Если поискать в журналах, их, вероятно, больше 40.,Добавьте больше ограничений, чтобы сузить область применения.,Конечно, можно добавить несколько условий и при этом иметь несколько удовлетворяемых положений.,Это требует от вас внимательного наблюдения,При вырезании через точку останова посмотрите на вывод журнала перед консолью, чтобы определить, хотим ли мы из Расположение. Это тоже маленькая деталь,Обязательно найдите правильное расположение,Не запутайтесь. (Просто напоминание,Ставьте точки останова, как я,В обычных условиях он будет отключен дважды.,Второй раз - выполнить требования из)
(Примечание: в этой статье описано, сколько строк в журнале、Точка останова в определенном положении、переменнаяиз具体ценить,подлежит изменению,На основе вашей реальной ситуации,Но идея та же)
Обновить веб-страницу,После отключения начните следовать в один шаг.,Подойдите к месту, показанному на картинке ниже:
После того, как попал сюда,Не делай следующий шаг,На следующем этапе может быть выполнен весь оператор.,Вы не можете видеть детали,Итак, здесь мы вводим по одному в консоль, чтобы увидеть:
можно увидеть на самом делеизлогичното есть возвращает указанный символ Расположение, y изценитьто есть S[5]
,m изценитьто есть S[4]
,После многих отладок было обнаружено, что m из значения фиксировано из,M то есть charAt()
метод,Давайте еще раз посмотрим на наши локальные журналы,S[5]
изценитьдля [20]
,charAt()
Получите ценность есть6, логика полностью верная.
Теперь нам еще нужно знать, откуда взялась эта 20.,Продолжайте смотреть вверх,Найдено 20 первых вхождений из мест.,В строке 8510,Тогда нам нужно сломать его на предыдущем шаге.,такжето есть Нет.8509ХОРОШО,Как показано ниже:
Строка 8509 из индексной информации для Расположение 2 индексI 47 Индекс А 730
,Как сгенерировать наблюдение условной точки останова при тех же условиях:
Вы можете видеть, что логика S[5] & S[6]
,Давайте посмотрим на нашу местность S[5] = 5647508
、S[6] = 63
,5647508 & 63 = 20
,логически правильный,20то есть такое. Потом я снова начал искать 5647508
и 63
Как сгенерировать из, также на предыдущем этапе генерации из, также есть8508 строка, следующая точка условного останова, эта строка из индекса для Расположение 2 индексI 72 Индекс А 726
。
можно увидеть 63 прямой q[A]
Генерировать из, q большой массив, A то естьиндексдля 726,q Давайте не будем беспокоиться о том, как появился этот большой массив. 5647508
этот个большой数字,Поиск,Обнаружил, что их много,Давай сначала оставим это в покое,На этом этапе мы можем суммировать шаги по созданию последнего символа следующим образом:
short_str = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe="
q[726] = 63
5647508 & 63 = 20
short_str.charAt(20) = '6'
Тогда продолжайте читать и смотрите вверх,Посмотрите, как происходит предпоследняя буква из,Метод такой же, как и в предыдущей демонстрации.,Продолжайте двигаться вперед, чтобы установить условные точки останова.,Пошаговой демонстрации здесь больше не будет.,После того, как вы нашли четыре числа,Вы можете начать просмотр 5647508
Как появилось это большое число? Найдите это число и найдите первое вхождение из. Сделайте условную точку останова на предыдущем шаге. Прокрутив шаги, вы обнаружите, что прошла искаженная строка. charCodeAt()
действовать,Плюс некоторые битовые операциивыйти из,Искаженная строка выглядит, как показано на рисунке ниже:
к于этот个乱码字符串怎么来из,Мы поговорим об этом позже,Давайте подведем итоги здесь,Прежде всего мы X-Bogus = DFSz swVO AATA NH89 SMHZ qF9W X7n6
,Думайте об этом как о группе из четырех человек.,Причина, по которой они сгруппированы так,Это потому что для Вы найдете после анализа,Процесс генерации для каждой группы символов одинаков.,Вот последние два набора примеров:,Процесс примерно следующий:
short_str = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe="
X-Bogus = DFSz swVO AATA NH89 SMHZ qF9W X7n6
============== Группа 6【qF9W】==============
"\u0002ÿ-%.*yê^s6ðýÇýV,".charCodeAt(15) = 158
q[342] = 16
158 << 16 = 10354688
"\u0002ÿ-%.*yê^s6ðýÇýV,".charCodeAt(16) = 253
q[408] = 8
253 << 8 = 64768
10354688 | 64768 = 10419456
"\u0002ÿ-%.*yê^s6ðýÇýV,".charCodeAt(17) = 156
156 | 10419456 = 10419612
q[520] = 16515072
10419612 & 16515072 = 10223616
q[532] = 18
10223616 >> 18 = 39
short_str.charAt(39) = 'q'
q[590]= 258048
10419612 & 258048 = 192512
q[602] = 12
192512 >> 12 = 47
short_str.charAt(47) = 'F'
q[660] = 4032
10419612 & 4032 = 3456
q[668] = 6
3456 >> 6 = 54
short_str.charAt(54) = '9'
q[726] = 63
10419612 & 63 = 28
short_str.charAt(28) = 'W'
============== Группа 7【X7n6】==============
"\u0002ÿ-%.*yê^s6ðýÇýV,".charCodeAt(18) = 86
q[342] = 16
86 << 16 = 5636096
"\u0002ÿ-%.*yê^s6ðýÇýV,".charCodeAt(19) = 44
q[408] = 8
44 << 8 = 11264
5636096 | 11264 = 5647360
"\u0002ÿ-%.*yê^s6ðýÇýV,".charCodeAt(20) = 148
148 | 5647360 = 5647508
q[520] = 16515072
5647508 & 16515072 = 5505024
q[532] = 18
5505024 >> 18 = 21
short_str.charAt(21) = 'X'
q[590] = 258048
5647508 & 258048 = 139264
q[602] = 12
139264 >> 12 = 34
short_str.charAt(34) = '7'
q[660] = 4032
5647508 & 4032 = 3200
q[668] = 6
3200 >> 6 = 50
short_str.charAt(50) = 'n'
q[726] = 63
5647508 & 63 = 20
short_str.charAt(20) = '6'
Сравнивая процесс, можно обнаружить, что каждый шаг q Значения из внутри все одинаковые. Это можно написать напрямую. Разница в том, что вначале из. charCodeAt()
Операция, а также то есть возвращает искаженную строку, определяющую символ расположения Unicode Кодирование, 7-я группа 18, 19, 20, 6-я группа — 15, 16, 17 и так далее, 1-я группа — это ровно 0, 1, 2, как показано на рисунке ниже:
Логика каждой группы одинакова,Мы можем написать общий метод,Сгенерируйте семь наборов строк последовательно,Наконец-то склеен в полноценныйиз X-Bogus
,код выглядит следующим образом: (Генерация искаженной строки будет обсуждаться позже)
function getXBogus(originalString){
// Создать искаженную строку
var garbledString = getGarbledString(originalString);
var XBogus = "";
// Сгенерируйте семь наборов строк последовательно
for (var i = 0; i <= 20; i += 3) {
var charCodeAtNum0 = garbledString.charCodeAt(i);
var charCodeAtNum1 = garbledString.charCodeAt(i + 1);
var charCodeAtNum2 = garbledString.charCodeAt(i + 2);
var baseNum = charCodeAtNum2 | charCodeAtNum1 << 8 | charCodeAtNum0 << 16;
// Создать четыре символа последовательно
var str1 = short_str[(baseNum & 16515072) >> 18];
var str2 = short_str[(baseNum & 258048) >> 12];
var str3 = short_str[(baseNum & 4032) >> 6];
var str4 = short_str[baseNum & 63];
XBogus += str1 + str2 + str3 + str4;
}
return XBogus;
}
Прежде чем перейти к следующему шагу, следует обратить внимание на два момента:
JSON.stringify
处理Понятноиз,Некоторые шаги заключаются в передаче искаженных строк в функцию для обработки.,Вы обнаружите, что результаты и журналы после обработки несовместимы.,Это нормально.Генерация искаженной строки относительно сложнее.,Но идея все та же,Я не буду показывать вам скриншоты по одному.,Непосредственно опишите ключевые шаги в журнале.,Обратите внимание, что следующие журналы представляют собой шаги вперед.,Я не буду толкать его в противоположном направлении.,Я предлагаю вам сначала пройти процесс в обратном порядке.,Если вы посмотрите на этот шаг еще раз, вы поймете.
Step1:Прежде всего URL За изпараметром, также есть Query String Parameters
Сделайте это дважды MD5, две передачи Uint8Array
Обработать и наконец получить из Uint8Array
объектсуществовать后面из步骤середина用得到,Шаги следующие:
Расположение 1 индексI 4 Индекс А 134: будет URL За выполненным изпараметром MD5 Зашифровать, чтобы получить строку
Расположение 1 индексI 16 Индекс А 460: Преобразовать предыдущий шаг из строки в для. Uint8Array объект
Расположение 1 индексI 4 Индекс А 134: будет Предыдущий шагиз Uint8Array объект进ХОРОШО MD5 Зашифровать и получить строку
Расположение 1 индексI 29 Индекс А 472: Преобразовать предыдущий шаг из строки в для. Uint8Array объект
В вышеуказанных шагах,мы в конце концоввыйти именование результатовдля uint8Array
,Реализация ключевого кода выглядит следующим образом:
var md5 = require("md5");
// Преобразование строкдля Uint8Array объект,Отсутствующийизпеременная自ХОРОШО补齐
_0x5960a2 = function(a) {
for (var c = a.length >> 1, e = c << 1, b = new Uint8Array(c), d = 0, f = 0; f < e; ) {
b[d++] = _0x511f86[a.charCodeAt(f++)] << 4 | _0x511f86[a.charCodeAt(f++)];
}
return b;
}
// originalString: URL вернуться к исходным параметрам
var uint8Array = _0x5960a2(md5(_0x5960a2(md5(originalString))));
Step2:генерировать两个большой数,Один из них — это временная метка,Мы называем это для fixedString1
,Другой вызов метода для генерации,Мы называем это для fixedString2
。
fixedString1
Расположение 1 индексI 43 Индекс А 806:1663385262240 / 1000 = 1663385262.24
fixedString2
Расположение 1 индексI 16 Индекс А 834:M.apply(null, []) = 536919696
На вышеуказанных этапах M В соответствии со следующими методами недостающие из методов будут заполнены вами самостоятельно (среди них _0x229792
создан canvas
):
function _0x2996f8() {
try {
return _0x4b3b53 || (_0xb55f3e.perf ? -1 : (_0x4b3b53 = _0x229792(3735928559), _0x4b3b53));
} catch (a) {
return -1;
}
}
Step3:先后генерировать两个множество,Мы называем это для array1
、array2
,array2
то есть Зависит от array1
из элемента Расположение преобразуется в из,Строго говоря,array1
Не массив полных,Но каждое число,Это может быть отражено в журнале,Для удобства мы можем рассматривать его непосредственно как массив.,Оба массива имеют 19 элементов,Шаги следующие:
array1[0] к array1[3] для фиксированной стоимости
array1[4]
Расположение 1 индексI 25 Индекс А 946:uint8Array[14]
array1[5]
Расположение 1 индексI 25 Индекс А 970:uint8Array[15]
array1[6] к array1[7] для фиксированной стоимости,8、9 и ua связанный
array1[10]
Расположение 1 индексI 52 Индекс А 1090:fixedString1 >> 24 = 99
Расположение 1 индексI 47 Индекс А 1098:99 & 255 = 99
array1[11]
Расположение 1 индексI 52 Индекс А 1122:fixedString1 >> 16 = 25417
Расположение 1 индексI 47 Индекс А 1130:25417 & 255 = 73
array1[12]
Расположение 1 индексI 52 Индекс А 1154:fixedString1 >> 8 = 6506755
Расположение 1 индексI 47 Индекс А 1162:6506755 & 255 = 3
array1[13]
Расположение 1 индексI 52 Индекс А 1186:fixedString1 >> 0 = 241
Расположение 1 индексI 47 Индекс А 1194:241 & 255 = 241
array1[14]
Расположение 1 индексI 52 Индекс А 1218:fixedString2 >> 24 = 32
Расположение 1 индексI 47 Индекс А 1226:32 & 255 = 32
array1[15]
Расположение 1 индексI 52 Индекс А 1250:fixedString2 >> 16 = 8192
Расположение 1 индексI 47 Индекс А 1258:8192 & 255 = 0
array1[16]
Расположение 1 индексI 52 Индекс А 1282:fixedString2 >> 8 = 2097342
Расположение 1 индексI 47 Индекс А 1290:2097342 & 255 = 190
array1[17]
Расположение 1 индексI 52 Индекс А 1314:fixedString2 >> 0 = 536919696
Расположение 1 индексI 47 Индекс А 1322:536919696 & 255 = 144
array1[18]
Расположение 1 индексI 27 Индекс А 1352:array1.reduce(function(a, b) { return a ^ b; }); = 100
array1 Полная стоимость следующая
Расположение 1 индексI 27 Индекс А 1538:64,1.00390625,1,8,9,185,69,63,74,125,99,73,3,241,32,0,190,144,100
array2 Зависит от array1 Элементы заменены на Расположение:
array2 = [array1[0], array1[2], array1[4], array1[6], array1[8], array1[10], array1[12], array1[14], array1[16], array1[18], array1[1], array1[3], array1[5], array1[7], array1[9], array1[11], array1[13], array1[15], array1[17]]
array2 Полная стоимость следующая
array2 = [64,1,9,69,74,99,3,32,190,100,1.00390625,8,185,63,125,73,241,0,144]
Step4:Воля Step3 выйти из array2 После преобразования получается искаженная строка. Шаги следующие:
Расположение 1 индексI 16 Индекс А 1706:
_0x2f2740.apply(null, array2) = "@\u0000\u0001\u000eíxE?\u0016c%>® \u0000¾ó"
Расположение 1 индексI 16 Индекс А 1760:
_0x46fa4c.apply(null, ["ÿ", "@\u0000\u0001\u000e\t¹E?J}cI\u0003ñ \u0000¾d"]) = "\u0002ÿ-%.*yê^s6ðýÇýV,"
Расположение 1 индексI 16 Индекс А 1812:
_0x2b6720.apply(null, [2, 255, "\u0002ÿ-%.*yê^s6ðýÇýV,"]) = "\u0002ÿ-%.*yê^s6ðýÇýV,"
Функция из используется:
function _0x2f2740(a, c, e, b, d, f, t, n, o, i, r, _, x, u, s, l, v, h, g) {
let w = new Uint8Array(19);
return w[0] = a,
w[1] = r,
w[2] = c,
w[3] = _,
w[4] = e,
w[5] = x,
w[6] = b,
w[7] = u,
w[8] = d,
w[9] = s,
w[10] = f,
w[11] = l,
w[12] = t,
w[13] = v,
w[14] = n,
w[15] = h,
w[16] = o,
w[17] = g,
w[18] = i,
String.fromCharCode.apply(null, w);
}
function _0x46fa4c(a, c) {
let e, b = [], d = 0, f = "";
for (let a = 0; a < 256; a++) {
b[a] = a;
}
for (let c = 0; c < 256; c++) {
d = (d + b[c] + a.charCodeAt(c % a.length)) % 256,
e = b[c],
b[c] = b[d],
b[d] = e;
}
let t = 0;
d = 0;
for (let a = 0; a < c.length; a++) {
t = (t + 1) % 256,
d = (d + b[t]) % 256,
e = b[t],
b[t] = b[d],
b[d] = e,
f += String.fromCharCode(c.charCodeAt(a) ^ b[(b[t] + b[d]) % 256]);
}
return f;
}
function _0x583250(a) {
return String.fromCharCode(a);
}
function _0x2b6720(a, c, e) {
return _0x583250(a) + _0x583250(c) + e;
}
С тех пор весь процесс был завершен. доступный JavaScript Для реализации всего алгоритма используйте Python также可以,После завершения кода просто запросите домашнюю страницу блоггера.,Просто проанализируйте некоторые данные,Вывод нормальный: