前言
突然无聊想搞个4399的swf下载脚本
然后发现4399已经搞的非常恶心了
大概有无限debugger+ob混淆+反开发者窗口打开+来路校验balabalabala
已经不是我童年的白月光了~
正好还算是比较基础又对新手有一点挑战
所以决定记录一下
开始
目标网址
https://www.4399.com/flash/90302_3.htm
首先他禁止打开了开发者工具
一般会对key的键值进行阻断
也就是f12 Ctrl+Shift+I
我们通过右上角的工具-》更多工具-》开发者工具,即可打开
因为他大部分代码还是没花的
所以直接搜f12的键值 123
找到了keydown的监听
jq的代码是使用的addeventlistener
那我们直接对其进行劫持,因为我观察只有两个keydown,也就是截图中的两个
所以直接无脑过滤就行了
// @run-at document-start抢先注入哦
let oldadd = EventTarget.prototype.addEventListener
EventTarget.prototype.addEventListener = function (...args) {
if (args[0] === 'keydown') {
return;
}
return oldadd.call(this, ...args)
}
这样就解除了f12的问题
然后发现存在无限debugger
直接卡在了这里
观察使用了setinterval函数
那直接对setinterval函数做劫持
将传入的函数用toString字符化然后搜索特定的字符串,如果搜到了就不进行调用
let inter = unsafeWindow.setInterval
unsafeWindow.setInterval = function (func, time) {
if (func.toString().indexOf('clearInterval(_windon_handler)') !== -1) {
return
}
return inter.call(this, func, time)
}
这处过了之后发现上方还有一个
使用setinterval定时回调,并在下方也调用一次,那我们思路还是比较简单的
直接对setinterval劫持,并且检查是否存在check,如果存在,则提前用Object.defineproperty冻结掉属性
完整代码如下
let inter = unsafeWindow.setInterval
unsafeWindow.setInterval = function (func, time) {
if (func.toString().indexOf('check()') !== -1) {
Object.defineProperty(unsafeWindow, "check", {
value: () => { },
writable: false,
configurable: false
});
return
}
if (func.toString().indexOf('clearInterval(_windon_handler)') !== -1) {
return
}
return inter.call(this, func, time)
}
这样我们就可以正常打开f12并不存在debugger了~
开始愉快的分析吧
结语
撒花~