-
-
[原创]一次加密的js插件解码
-
发表于:
2018-8-17 13:58
3186
-
昨儿部门头在群里反馈,自家平台主页被人插了广告,用户还以为是我们的广告,遂出于好奇就打开看看,发现都是密文,如下:
遂出于好奇,尝试进行一番调戏(过程简单)
插件地址: https://pexy.hrt360.com/js/xy_1.js
过程描述
插件头部第一行是一个很大的数组变量,数组经过处理,这个数组里主要存的是其他地方要用的函数,成员属性,变量的值等等,类似字典功能
校正数组的代码(3~10行):
(function(_0xc7d02b, _0x91fb3b) {
var _0x423ad0 = function(_0x3cc810) {
while (--_0x3cc810) {
_0xc7d02b['push'](_0xc7d02b['shift']());
}
};
_0x423ad0(++_0x91fb3b);
} (_0x2257, 0xd2));
处理方式就是将头部一部分元素移除追加到数组的结尾,然后通过函数获取数组中的元素替换到后续代码中进行使用(12~16行)
var _0x494e = function(_0x49d74a, _0x46aee5) {
_0x49d74a = _0x49d74a - 0x0;
var _0x1e647d = _0x2257[_0x49d74a];
return _0x1e647d;
};
Decode
插件中的字符串部分都转换成了字节码格式的表达方式,需要进行字符化,还有一些进行了unicode格式转换也需要转换出来
<?php
// 这里就是把插件的第一行数组的值
$dict =["\x65\x67\x61\x6d\x65\x2e\x71\x71\x2e\x63\x6f\x6d\x2f\x34\x32\x36\x36\x30\x32\x33\x33", "\x65\x67\x61\x6d\x65\x2e\x71\x71\x2e\x63\x6f\x6d\x2f\x32\x31\x34\x33\x34\x30\x30\x38\x36", ...];
for($i = 0; $i < 0xd2; $i++) {
array_push($dict, array_shift($dict));
}
$o = file_get_contents('xy_1.js');
$n = preg_replace_callback('/\\\\x([0-9a-zA-Z]{2})/', function($matches) {
return chr(hexdec($matches[1]));
}, $o);
$n = preg_replace_callback('/_0x494e\(\'0x([^\']+)\'\)/', function($matches) use($dict) {
return "'". $dict[hexdec($matches[1])] . "'";
}, $n);
$n = preg_replace_callback('/%([0-9a-zA-Z]{2})/', function($matches) {
return rawurldecode($matches[0]);
}, $n);
$n = preg_replace_callback('/\\\\u[0-9a-z]{4}/', function($matches) {
return json_decode("{\"unicode\": {$matches[0]}}")->unicode;
}, $n);
file_put_contents('./xy.js', $n);
结果
源码(这是经过格式化后的,不然只有一行):
转换后:
过程简单,大神勿喷
[课程]Linux pwn 探索篇!
最后于 2018-8-17 14:01
被KamiBoy编辑
,原因: 内容有遗漏