此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。
简单的Js逆向, 这是个不错的案例。
加速乐兄弟篇:
标题 | 链接 |
---|---|
【Js逆向】__jsl_clearance 无混淆加速乐 |
点击直达 |
这里就不做分析了,上来就是剧透。
这个需要三次请求,
Cookie
字段的 __jsl_clearance 的和 一个 set-cookie(两个 Cookie
字段);Cookie
去访问,会返回最终的 Cookie
字段 __jsl_clearance;Cookie
去访问,即可返回正常的网页内容。带着问题往下走。
可以看到有三次请求,前两次的状态码都是521,第三次才正常。
第一次请求,
第二次请求,
Cookie
中 有两个字段,除了 set-cookie的 __jsluid_h,还有 __jsl_clearance,这个值是第一次请求返回的代码生成的;__jsl_clearance=1611979015.267|-1|KZNU7CKXrFKDC5PDwffTcqd60HA%3D
第三次请求,
以上,就是请求的全部内容了。继续往下走
第一次请求返回的结果如下,
<script>
document.cookie = ('_') + ('_') + ('j') + ('s') + ('l') + ('_') + ('c') + ('l') + ('e') + ('a') + ('r') + ('a') + ('n') + ('c') + ('e') + ('=') + (-~[] + '') + (6 + '') + ((+true) + '') + (-~0 + '') + (2 + 7 + '') + (2 + 5 + '') + (3 + 6 + '') + ((+[]) + '') + ((+true) + '') + (([2] + 0 >> 2) + '') + ('.') + (2 + '') + (6 + '') + (1 + 6 + '') + ('|') + ('-') + (-~false + '') + ('|') + ('K') + ('Z') + ('N') + ('U') + (2 + 5 + '') + ('C') + ('K') + ('X') + ('r') + ('F') + ('K') + ('D') + ('C') + (([2] + 0 >> 2) + '') + ('P') + ('D') + ('w') + ('f') + ('f') + ('T') + ('c') + ('q') + ('d') + ((1 + [2]) / [2] + '') + ((+false) + '') + ('H') + ('A') + ('%') + ((2 ^ 1) + '') + ('D') + (';') + ('m') + ('a') + ('x') + ('-') + ('a') + ('g') + ('e') + ('=') + (-~[2] + '') + (-~[5] + '') + (~~'' + '') + (~~'' + '') + (';') + ('p') + ('a') + ('t') + ('h') + ('=') + ('/');
location.href = location.pathname + location.search
script>
将它掐头去尾,删除 script 标签,再删除 location.href = location.pathname + location.search,
然后执行一遍,返回结果如下:
"__jsl_clearance=1611979015.267|-1|KZNU7CKXrFKDC5PDwffTcqd60HA%3D;max-age=3600;path=/"
可以看到和上面的第二次请求中的 Cookie 字段的 __jsl_clearance 是一致的。
第二次请求返回的结果如下、
<script>
var _0x3321 = ['w7o0w7HCnA==', 'dsKCTcKc', 'MHU8Nw==', 'woU9TcK/', 'wpTCkcKgKA==', 'AsOwU38=', 'YMKFFFc=', 'wrTCvSIt', 'clMIwoY=',];
(function (_0x5abfa4, _0x33213d) {
var _0x56d52a = function (_0x227294) {
while (--_0x227294) {
_0x5abfa4['push'](_0x5abfa4['shift']());
}
};
_0x56d52a(++_0x33213d);
}(_0x3321, 0x1e1));
var _0x56d5 = function (_0x5abfa4, _0x33213d) {
// 略
};
function hash(_0x32d5bc) {
// 略
};
function go(_0x167c4f){
//略
};
go({
"bts": ["1611979015.525|0|i8G", "oUN9MM0HpvY%2FeJXbD4GNVM%3D"],
"chars": "RZWGNLIg8GXvUZkWfRkvjR",
"ct": "a42d82412d8f2568d32115bc977c4466b2bbed036ab318176b41d9792ab28240",
"ha": "sha256",
"tn": "__jsl_clearance",
"vt": "3600",
"wt": "1500"
})
script>
很明显可以看出这是一个 OB混淆,用Ast去解一下, 自己写也行
我这里使用猿人学的 OB解混淆:http://tool.yuanrenxue.com/decode_obfuscator
如果你想学一手 OB解混淆,可以通过此链接去购学习蔡老板的AST星球:https://t.zsxq.com/2rJU7qR
代码解混淆后,是这样子的,
function hash(_0x32d5bc) {
// 略
}
function go(_0x167c4f) {
function _0x55901e() {
var _0x2acfe4 = window["navigator"]["userAgent"],
_0x1d02e1 = ["Phantom"];
for (var _0x3105eb = 0; _0x3105eb < _0x1d02e1["length"]; _0x3105eb++) {
if (_0x2acfe4["indexOf"](_0x1d02e1[_0x3105eb]) != -1) {
return true;
}
}
if (window["callPhantom"] || window["_phantom"] || window["Headless"] || window["navigator"]["webdriver"] || window["navigator"]["__driver_evaluate"] || window["navigator"]["__webdriver_evaluate"]) {
return true;
}
}
if (_0x55901e()) {
return;
}
var _0x2e53af = new Date();
function _0x444987(_0x28e422, _0x3f9e80) {
var _0x3ddf96 = _0x167c4f["chars"]["length"];
for (var _0x18fafc = 0; _0x18fafc < _0x3ddf96; _0x18fafc++) {
for (var _0x1d9e6b = 0; _0x1d9e6b < _0x3ddf96; _0x1d9e6b++) {
var _0x486e56 = _0x3f9e80[0] + _0x167c4f["chars"]["substr"](_0x18fafc, 1) + _0x167c4f["chars"]["substr"](_0x1d9e6b, 1) + _0x3f9e80[1];
if (hash(_0x486e56) == _0x28e422) {
return [_0x486e56, new Date() - _0x2e53af];
}
}
}
}
var _0x2d68da = _0x444987(_0x167c4f["ct"], _0x167c4f["bts"]);
if (_0x2d68da) {
var _0x529226;
if (_0x167c4f["wt"]) {
_0x529226 = parseInt(_0x167c4f["wt"]) > _0x2d68da[1] ? parseInt(_0x167c4f["wt"]) - _0x2d68da[1] : 500;
} else {
_0x529226 = 1500;
}
setTimeout(function () {
document["cookie"] = _0x167c4f["tn"] + "=" + _0x2d68da[0] + ";Max-age=" + _0x167c4f["vt"] + "; path = /";
location["href"] = location["pathname"] + location["search"];
}, _0x529226);
} else {
alert("\u8BF7\u6C42\u9A8C\u8BC1\u5931\u8D25");
}
}
go({
"bts": ["1611979015.525|0|i8G", "oUN9MM0HpvY%2FeJXbD4GNVM%3D"],
"chars": "RZWGNLIg8GXvUZkWfRkvjR",
"ct": "a42d82412d8f2568d32115bc977c4466b2bbed036ab318176b41d9792ab28240",
"ha": "sha256",
"tn": "__jsl_clearance",
"vt": "3600",
"wt": "1500"
});
看到这个, 很明显 这个是设置 cookie 的
document["cookie"] = _0x167c4f["tn"] + "=" + _0x2d68da[0] + ";Max-age=" + _0x167c4f["vt"] + "; path = /";
跟着逻辑处理了一下,删除一些没用的代码,是以下这个样子的:
function hash(verification) {
// 略
}
function go(data) {
function get_data(ct, bts) {
var chars_length = data["chars"]["length"];
for (var i = 0; i < chars_length; i++) {
for (var j = 0; j < chars_length; j++) {
var verification = bts[0] + data["chars"]["substr"](i, 1) + data["chars"]["substr"](j, 1) + bts[1];
if (hash(verification) == ct) {
console.log(verification)
return verification
}
}
}
}
var after_data = get_data(data["ct"], data["bts"]);
var cookie = data["tn"] + "=" + after_data
console.log("cookie: " + data["tn"] + "=" + after_data)
}
go({
"bts": ["1611979015.525|0|i8G", "oUN9MM0HpvY%2FeJXbD4GNVM%3D"],
"chars": "RZWGNLIg8GXvUZkWfRkvjR",
"ct": "a42d82412d8f2568d32115bc977c4466b2bbed036ab318176b41d9792ab28240",
"ha": "sha256",
"tn": "__jsl_clearance",
"vt": "3600",
"wt": "1500"
});
值得开心的是,这个只是验证了 MD5 就可以得到 Cookie了。
执行代码之后,返回的 Cookie
值如下:
__jsl_clearance=1611979015.525|0|i8G8ZoUN9MM0HpvY%2FeJXbD4GNVM%3D
可以看到和第三次请求中的 Cookie
的 __jsl_clearance 字段的值是一摸一样的~。
改写成 python 是这样的:
import hashlib
def hash(value: str, _mode: str) -> str:
_hash = eval(f"hashlib.{_mode}(value.encode('utf-8')).hexdigest()")
return _hash
def get_cookie(item: dict) -> str:
ct = item.get('ct', None)
bts = item.get('bts', None)
chars = item.get('chars', None)
hash_mode = item.get('ha', None)
chars_length = len(item.get('chars', None))
for i in range(chars_length):
for j in range(chars_length):
value = bts[0] + chars[i] + chars[j] + bts[1]
if hash(value, hash_mode) == ct:
print('__jsl_clearance=' + value)
return value
# 调用函数
get_cookiego({
"bts": ["1611979015.525|0|i8G", "oUN9MM0HpvY%2FeJXbD4GNVM%3D"],
"chars": "RZWGNLIg8GXvUZkWfRkvjR",
"ct": "a42d82412d8f2568d32115bc977c4466b2bbed036ab318176b41d9792ab28240",
"ha": "sha256",
"tn": "__jsl_clearance",
"vt": "3600",
"wt": "1500"
})
再总结一下:
Cookie
去请求第二次,Cookie
去请求第三次,以上,打完收工。
本次的分享到这里结束。
如有疑问,请自行解决。