mirror of
https://github.com/luzhisheng/js_reverse.git
synced 2025-04-19 18:24:51 +08:00
知识点: sojson6.0,aa混淆,setInterval定时任务
解题思路
打开控制台,查看请求链接,程序执行setInterval(function(){ debugger; }, 300)
,定时任务每3毫秒执行一次
同时还存在另外一个setInterval(function(){ console.log(binb2b64(a+'error')); }, 300)
这里利用 Tampermonkey hook函数setInterval
// ==UserScript==
// @name debugger
// @namespace http://tampermonkey.net/
// @version 0.1
// @description pass
// @author ayf
// @run-at document-start
// @match *://*.python-spider.com/*
// @grant none
// ==/UserScript==
(function() {
var new_setInterval=setInterval;
window.setInterval=function(a,b){
if(a.toString().indexOf("debugger")!=-1)
{
return null;
}
if(a.toString().indexOf("console.log")!=-1)
{
return null;
}
new_setInterval(a,b);
}
})();
这样就可以顺利的查看请求地址,发现safe
是加密字段
进入断点,就可以发现一断aa混淆,复制代码破解,解决方法:
- 去掉代码最后一个符号 ('_') 后,放到浏览器里面去直接执行就可以看到源码
- 在线调试,在 AAEncode 代码第一行下断点,然后一步一步执行,最终也会在虚拟机(VM)里看到源码
结合上下文可以发现aa混淆生成了token
,然后又把token
赋值给了safe
,
token = window.localStorage.getItem('token');
request.setRequestHeader("safe", token);
通过控制台可以顺利的打印出加密值
观察加密函数
window.localStorage.setItem('token', window.btoa(a) + ('|') + binb2b64(hex_sha1(window.btoa(core_sha1(a)))) + b64_sha1(a));
这里面
window.btoa(a) -----------> 是函数 btoa
binb2b64(hex_sha1(window.btoa(core_sha1(a)))) -----------> 是函数 core_sha1,hex_sha1,binb2b64
b64_sha1(a) -----------> 是函数 b64_sha1
进入函数体内
可以看到这段内容jsjiami.com.v6
这就是sojson加密
用google插件v_jstools解sojson
最后复制js尝试执行
a = '1678067697';
b64_sha1_a = b64_sha1(a);
console.log(b64_sha1_a);
binb2b64_a = binb2b64(hex_sha1(window.btoa(core_sha1(a))));
console.log(binb2b64_a);
btoa_a = window.btoa(a);
console.log(btoa_a);
发现ReferenceError: window is not defined
报错
binb2b64_a = binb2b64(hex_sha1(window.btoa(core_sha1(a))));
ReferenceError: window is not defined
这里需要补一下环境window
和window.btoa
window = global;
global.Buffer = global.Buffer || require('buffer').Buffer;
if (typeof btoa === 'undefined') {
global.btoa = function (str) {
return new Buffer.from(str).toString('base64');
};
}
if (typeof atob === 'undefined') {
global.atob = function (b64Encoded) {
return new Buffer.from(b64Encoded, 'base64').toString();
};
}
顺利打印出数据