一、无限Debugger
1.1 Questions
- 什么情况下会出现无限Debugger?
分析请求、查看时间监听器、跟踪js时候,第一步就是打开浏览器的开发者工具,而打开这个工具的时候就出出现无限Debugger的死循环。 - 为什么反爬虫会用到无限Debugger?
因为在反爬虫的过程中,我们会用到开发者工具,这个时候精准设防,不让我们获取代码逻辑,从而设计无限Debugger。
1.2 无限Debugger的解决方案
- 方案一:禁用所有的断点
将所有的断点都禁用之后,所有断点处都不执行,即可不在断点处循环,但这种方法不切实际,因为我们的目的就是要分析代码,不使用断点分析则不可能; - 方案二:禁用某处的断点
有可能会使我们在死循环中无法出来。 - 方案三:条件断点
在可能断点处加上条件,不满足条件就不执行。 - 方案四:利用中间人替换原理
将debugger关键字,使用字符串替换,替换后就没有这个关键字存在。 - 方案五:reres浏览器插件替换本地修改过的文件
- 方案六:重写关键函数
将函数声明之后,执行之前的位置打上断点,然后在控制台中重新debugger函数,将这个函数内容置空,则后续遇到这个函数就不会停下来了。
二、如何快速定位加密参数
- 快速定位——搜索
- 快速定位——断点
XHR断点
DOM断点
Event断点
自定义断点 - 快速定位——hook
json
cookie
window attr
eval/Function
websocket
三、JavaScript加密或混淆
3.1 为什么要对JS代码加密或混淆
- 因为JS代码是运行于客户端的
- 因为JS代码是公开透明的
3.2 如何对JavaScript进行保护
- 代码压缩:去空格、换行
- 代码加密:eval、emsscripten、webAssembly
- 代码混淆:变量混淆、常量混淆、控制流扁平化、调试保护
3.3 代码加密
- eval()加密:将一段JS代码进行eval函数包装后,得到一场串的JS代码,实际已经被加密过了,变得可读性很差,不过解密也很简单;
- EmScripten:将C/C++代码编译成JS代码,结果其实是asm.js文件,起到保护核心的效果;
- WebAssembly:核心是C/C++,经过加密后是wasm文件
3.4 JavaScript混淆技术
- 变量、字符常混淆:将变量名混淆成十六进制或者一大串字符的样式,使代码可读性变差,使用md5、base64等加密功能混淆字符串,使得无法通过搜索功能查到代码的关键字;
- 属性加密:JS中属性的关系一般是键值对,用属性加密将key和value的关系混淆掉,使得难以寻找里面的逻辑;
- 控制流平台化:打乱了原有逻辑的关系,将逻辑变复杂难读;
- 僵尸代码注入:将无用的代码注入到原有代码里,使代码变得复杂;
- 反调试:基于浏览器的特性,对代码加上debug语句,让代码变成无限debugger,用一些断点进行干扰;
- 多态变异:JS代码一旦被调用,代码立刻发生变化,变成和之前完全不同的代码,避免代码被动态分析调试;
- 锁定域名:JS代码必须运作在特定的域名下;
- 反格式化:如果格式化之后,代码会用一些机制使得程序无法顺利运行
- 特殊编码:将JS代码编译成符号、表情等等
本文含有隐藏内容,请 开通VIP 后查看