下载的模板将通用JS加密并强行注入外链,解密代价高且代码仍被混淆。
虽然可通过打断点或注释loadS…(函数名就不具体指出了)函数解决,但若以后函数名也被混淆就又得重新找。
因此研究直接重写document.createElement,无需解密即可拦截加密脚本中的恶意外链,一劳永逸。
- 拦截代码
const nativeCreateElement = document.createElement;
const blockedUrls = [‘xxx.com/js.js’, ‘yyy.com/malware.js’]; // 自行增减需要拦截的URL列表
document.createElement = function(tagName) {
const element = nativeCreateElement.call(document, tagName);
if (tagName.toLowerCase() === ‘script’) {
// 拦截script.src = ‘…’
Object.defineProperty(element, ‘src’, {
set(url) {
if (blockedUrls.some(blockedUrl => url.includes(blockedUrl))) {
console.log(‘[拦截] 阻断外链:’, url);
return;
}
element.setAttribute(‘src’, url);
},
get() {
return element.getAttribute(‘src’);
}
});
// 拦截script.setAttribute(‘src’, ‘…’)
const originalSetAttr = element.setAttribute;
element.setAttribute = function(name, value) {
if (name === ‘src’ && blockedUrls.some(blockedUrl => value.includes(blockedUrl))) {
console.log(‘[拦截] 阻断setAttribute:’, value);
return;
}
originalSetAttr.call(this, name, value);
};
}
return element;
};
- 使用方式
- 核心优势
1、无需解密:直接拦截DOM API调用,对加密脚本透明
2、双重防护:覆盖src属性赋值和setAttribute两种注入方式
3、精准拦截:仅针对特定域名规则,不影响其他正常脚本
- 注意事项
1、这种拦截方式应该在页面最早加载的脚本中执行
2、可能会与某些框架的脚本加载机制冲突
3、不能拦截通过innerHTML或document.write等方式插入的脚本
4、通过其他方式插入的脚本可以把该代码喂给AI补充完善