JavaScript逆向技术

一、无限Debugger

1.1 Questions

  1. 什么情况下会出现无限Debugger?
    分析请求、查看时间监听器、跟踪js时候,第一步就是打开浏览器的开发者工具,而打开这个工具的时候就出出现无限Debugger的死循环。
  2. 为什么反爬虫会用到无限Debugger?
    因为在反爬虫的过程中,我们会用到开发者工具,这个时候精准设防,不让我们获取代码逻辑,从而设计无限Debugger。

1.2 无限Debugger的解决方案

  1. 方案一:禁用所有的断点
    将所有的断点都禁用之后,所有断点处都不执行,即可不在断点处循环,但这种方法不切实际,因为我们的目的就是要分析代码,不使用断点分析则不可能;
  2. 方案二:禁用某处的断点
    有可能会使我们在死循环中无法出来。
  3. 方案三:条件断点
    在可能断点处加上条件,不满足条件就不执行。
  4. 方案四:利用中间人替换原理
    将debugger关键字,使用字符串替换,替换后就没有这个关键字存在。
  5. 方案五:reres浏览器插件替换本地修改过的文件
  6. 方案六:重写关键函数
    将函数声明之后,执行之前的位置打上断点,然后在控制台中重新debugger函数,将这个函数内容置空,则后续遇到这个函数就不会停下来了。

二、如何快速定位加密参数

  1. 快速定位——搜索
  2. 快速定位——断点
    XHR断点
    DOM断点
    Event断点
    自定义断点
  3. 快速定位——hook
    json
    cookie
    window attr
    eval/Function
    websocket

三、JavaScript加密或混淆

3.1 为什么要对JS代码加密或混淆

  • 因为JS代码是运行于客户端的
  • 因为JS代码是公开透明的

3.2 如何对JavaScript进行保护

  • 代码压缩:去空格、换行
  • 代码加密:eval、emsscripten、webAssembly
  • 代码混淆:变量混淆、常量混淆、控制流扁平化、调试保护

3.3 代码加密

  1. eval()加密:将一段JS代码进行eval函数包装后,得到一场串的JS代码,实际已经被加密过了,变得可读性很差,不过解密也很简单;
  2. EmScripten:将C/C++代码编译成JS代码,结果其实是asm.js文件,起到保护核心的效果;
  3. WebAssembly:核心是C/C++,经过加密后是wasm文件

3.4 JavaScript混淆技术

  • 变量、字符常混淆:将变量名混淆成十六进制或者一大串字符的样式,使代码可读性变差,使用md5、base64等加密功能混淆字符串,使得无法通过搜索功能查到代码的关键字;
  • 属性加密:JS中属性的关系一般是键值对,用属性加密将key和value的关系混淆掉,使得难以寻找里面的逻辑;
  • 控制流平台化:打乱了原有逻辑的关系,将逻辑变复杂难读;
  • 僵尸代码注入:将无用的代码注入到原有代码里,使代码变得复杂;
  • 反调试:基于浏览器的特性,对代码加上debug语句,让代码变成无限debugger,用一些断点进行干扰;
  • 多态变异:JS代码一旦被调用,代码立刻发生变化,变成和之前完全不同的代码,避免代码被动态分析调试;
  • 锁定域名:JS代码必须运作在特定的域名下;
  • 反格式化:如果格式化之后,代码会用一些机制使得程序无法顺利运行
  • 特殊编码:将JS代码编译成符号、表情等等

你可能感兴趣的:(笔记,javascript,前端,开发语言)