第一题 js混淆源码乱码 - 猿人学https://match.yuanrenxue.cn/match/1一、逆向点分析
打开开发者工具发现进入一个setInterval的定时器debugger。个人觉得猿人学这个反调试的debugger设置的非常好,每一题的debugger几乎都不一样,这20题你都过了,基本反调试的debugger也就难不住你了。言归正传,定时器debugger,那直接把定时器置空不就好了。
for (let i = 1; i < 99999; i++) window.clearInterval(i);
控制台直接运行, 发现轻松跳过了反调试debugger。通过分析不难看出只有请求体的m值需要逆向,别着急,翻几页看看除了发数据包以外它还发其他的包不。此题难度标为简单,果然没有发其他乱七八糟的的包。
二、m值逆向
观察数据包的请求url,发现包含m,那就好办了,直接通过游猴hookxhr。
// ==UserScript==
// @name hookxhr
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://match.yuanrenxue.cn/match/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=yuanrenxue.cn
// @grant none
// @run-at document-start
// ==/UserScript==
(function () {
let openCache = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, url) {
console.log("Hook xhr method => %s, url => %s", method, url);
if (url.indexOf("m=") !== -1) {
debugger;
}
return openCache.apply(this, arguments);
};
})();
刷新网页很轻松的hook到m值,往上追几步来到request这一栈,一个混淆的js,但是不难找到请求体data生成的地方。
可以看出m值重点是_0x57feae这个变量值,那就将断点走到_0x57feae = oo0O0(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']()) + window['\x66']这个赋值的地方,可以看出oo0O0(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']())这部分为‘’ 空字符串,主要是 window['\x66']也就是window.f的值,window.f在哪里定义的呢,不好找啊。
静下来想想生成m值时非要拼接这个oo0O0(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']())空字符串干嘛,会不会在这里面定义来window.m?,那就测试下,在_0x57feae = oo0O0(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']()) + window['\x66'];这个的上下行各打一个断点,当走到上方断点时,控制台输出window.f为undefined,走到下方就出现了m值。那么oo0O0这个函数定义了window.f是无疑了,进入oo0O0函数,并记下其传入的参数值mw='1712769444000',大致看了下并没有发现window.f赋值的地方,只有一个eval函数有点可疑,同样打上断点调试下,发现在走到eval上方时window.f还是没定义,走完eval函数就出现了window.f值。直接控制台输出eval里传的参数,发现是一串js代码,复制下来去掉首尾的引号格式化下看一看,果然发现了window.f复制的地方。而且直接运行就拿到了m值。
还有一步要研究下,生成f值得这个hex_md5函数传入的时间戳参数哪来的?我们知道oo0O0函数传入的也是时间戳参数,它俩会不会是一个值,返回oo0O0函数看看,eval函数里传入了oo0O0函数的得传参mw。数值也是相同的,那就找到了hex_md5函数的传参。
剩下的就是修改m值的生成方式并封装函数以便py调用。
function get_m(){
var _0x2268f9 = Date['\x70\x61\x72\x73\x65'](new Date()) + (16798545 + -72936737 + 156138192)
, _0x57feae = hex_md5(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']());
m= _0x57feae + '\u4e28' + _0x2268f9 / (-1 * 3483 + -9059 + 13542);
return m
}
剩下的就是自己编写py代码了。