【Js逆向】__jsl_clearance ob混淆加速乐

此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。

前言

简单的Js逆向, 这是个不错的案例。

加速乐兄弟篇:

标题 链接
【Js逆向】__jsl_clearance 无混淆加速乐 点击直达

分析

这里就不做分析了,上来就是剧透。
这个需要三次请求,

  • 第一次请求返回一串生成 Cookie 字段的 __jsl_clearance 的和 一个 set-cookie(两个 Cookie 字段);
  • 第二次请求携带第一次生成 Cookie 去访问,会返回最终的 Cookie 字段 __jsl_clearance
  • 第三次请求则携带第二次返回的 Cookie 去访问,即可返回正常的网页内容。

带着问题往下走。

抓包

可以看到有三次请求,前两次的状态码都是521,第三次才正常。
【Js逆向】__jsl_clearance ob混淆加速乐_第1张图片

第一次请求,

  • 此处有一个 set-cookie,对应的是后面两次请求中的 Cookie 都带上的 __jsluid_h
  • __jsluid_h=7a5c726f92bd6afc3564c6650c3be86c
    【Js逆向】__jsl_clearance ob混淆加速乐_第2张图片

第二次请求,

  • 本次请求的 Cookie 中 有两个字段,除了 set-cookie__jsluid_h,还有 __jsl_clearance,这个值是第一次请求返回的代码生成的;
  • __jsl_clearance=1611979015.267|-1|KZNU7CKXrFKDC5PDwffTcqd60HA%3D
    【Js逆向】__jsl_clearance ob混淆加速乐_第3张图片

第三次请求,

  • 第二次请求会重新生成 __jsl_clearance,携带新的 Cookie 去请求即可返回正常数据。
  • ps: 第二次请求是返回正常的页面的,这里不做展示
    【Js逆向】__jsl_clearance ob混淆加速乐_第4张图片

以上,就是请求的全部内容了。继续往下走


上来就是一把梭

第一次请求返回的结果如下,

<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
然后执行一遍,返回结果如下:
【Js逆向】__jsl_clearance ob混淆加速乐_第5张图片

"__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执行

改写成 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"
})

再总结一下:

  1. 第一次请求时候,记得获取它的 set-cookie 值,
  2. 携带第一次请求生成和返回的 Cookie 去请求第二次,
  3. 携带第二次请求生成和返回的 Cookie 去请求第三次,
  4. 跟着 上来就是一把梭 将第三次的代码处理即可,
  5. 不得不说,AST 解混淆真是一个好东西,学习蔡老板的AST星球:https://t.zsxq.com/2rJU7qR

以上,打完收工。

后话

本次的分享到这里结束。
如有疑问,请自行解决。

你可能感兴趣的:(#,JS逆向,javascript,python,爬虫,加速乐,cookie)