当前位置: 首页 > news >正文

常见反爬及应对

一,特殊混淆的还原

1.1 还原 AAEncode 与 JJEncode

AAEncode是一种JavaScript代码混淆算法,利用它,可以将代码转换成 颜文字 表示的JavaScript代码。

去掉代码最后的 (‘‘),这是函数的自调用,去除后就是函数的声明。也可以在去掉 (’’)后,加上 .toString(),进一步将方法转化成字符串。

JJEncode 的还原方法与 AAEncode 一致。

1.2 还原JSFuck

JSFuck是一种基于JavaScript的极简编程语言,它使用六个不同的字符来表示所有可能的JavaScript代码。这六个字符是:! + - * . /。由于其极简的语法,JSFuck通常用于教学目的,展示编程语言的基本概念,如运算符优先级和变量声明等。

下面是JSFuck的一些基本操作:

  • “!” 代表 NOT 操作,用于翻转布尔值。
  • “+” 代表 ADD 操作,用于加法运算。
  • “-” 代表 SUBTRACT 操作,用于减法运算。
  • “*” 代表 MULTIPLY 操作,用于乘法运算。
  • “.” 代表 DECIMAL POINT 操作,用于在数字中表示小数点。
  • “/” 代表 DIVIDE 操作,用于除法运算。

虽然JSFuck只使用六个字符,但它可以表达复杂的JavaScript代码。例如,下面是一个简单的JSFuck程序,它将两个数字相加并输出结果:

js复制代码+!!.++[+[+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!]

虽然JSFuck的语法非常简单,但它并不适合编写复杂的程序。由于其可读性和可维护性较差,因此在实际开发中很少使用。

JSFuck能够使用六个不同的字符来表示所有可能的JavaScript代码,主要基于以下几个原因:

  1. 递归和链式操作:JSFuck利用了JavaScript中的递归和链式操作特性。通过连续使用相同的字符,JSFuck可以表示复杂的操作和逻辑。例如,连续的"+“字符可以表示多次的加法操作,连续的”*"字符可以表示多次的乘法操作。
  2. 位运算:JSFuck也利用了JavaScript中的位运算。通过将数字转换为二进制位,然后进行一系列的位运算(如NOT、AND、OR等),JSFuck可以表示几乎所有的数字和布尔逻辑操作。
  3. 字符编码:JSFuck还利用了字符编码的知识。通过将不同的字符组合表示特定的编码值,JSFuck可以创建出任何想要的字符串或标识符。
  4. 堆栈操作:JSFuck还利用了堆栈的概念。通过连续的".“和”/"字符,JSFuck可以模拟出堆栈的行为,如入栈、出栈等。

因此,尽管JSFuck只使用六个不同的字符,但它通过递归、链式操作、位运算、字符编码和堆栈操作等方式,能够表示所有可能的JavaScript代码。

还原JSFuck:

找到代码最后的一个右括号和其对应的左括号,将中间的内容粘贴到控制台打印出来,其内容就是传入的参数,将这部分内容删除,剩下的过程就和 AAEncode 一样了。

二,WebAssembly 分析

WebAssembly 是一种可以使用非 JavaScript 编程语言编写代码并且能在浏览器上运行的技术方案。常见的呈现形式就是 wasm 后缀的文件,即原生代码被编译成了 wasm 后缀的文件,JavaScript 通过调用 wasm 文件得到对应的计算结果,然后配合其他 JavaScript 代码实现页面数据的加载和页面的渲染。

示例使用如下:

在这里插入图片描述

进入 wasm 文件的 encrypt 方法后,代码如下:

在这里插入图片描述

这里面的逻辑原本是用 C++ 编写的,通过 Emscripten 转化为 wasm文 件,就成了上面的代码形式。

此时已经看不懂了,但可以通过模拟执行的方式得到加密结果:将 wasm 文件下载下来,要使用 python 模拟执行 wasm,可以使用两个 python 库,一个是 pywasm,另一个是 wasmer-python,具体内容见崔庆才第11章节内容。

三,绕过无限 debugger

debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字,只要遇到它,JavaScript 的执行便会在此处中断,进入调试模式。

绕过方式有:

禁用全局断点,禁用局部断点(在断点行右键),条件断点(在断点行右键),替换原始文件等。

禁用全局断点图示:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C# Socket
  • 多个tomcat同时使用 不设置CATALINA_HOME环境变量
  • Oracle 11.2.0.1升级到11.2.0.4并做rman备份异机恢复
  • 如何用Java写一个整理Java方法调用关系网络的程序
  • 银河麒麟V10 SP1 审计工具 auditd更新
  • 在linux系统centos上面安装php7gmp扩展
  • 【算法专题】双指针算法
  • rider使用libman
  • k8s-第六节-数据持久化
  • JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
  • 51单片机基础10——串口实验
  • web前端开发——开发环境和基本知识
  • ROS 2官方文档(基于humble版本)学习笔记(四)
  • leetcode-每日一题
  • Vue 路由传参 query方法 bug 记录
  • [case10]使用RSQL实现端到端的动态查询
  • 【EOS】Cleos基础
  • 【mysql】环境安装、服务启动、密码设置
  • crontab执行失败的多种原因
  • Docker容器管理
  • leetcode386. Lexicographical Numbers
  • Python socket服务器端、客户端传送信息
  • SQL 难点解决:记录的引用
  • windows下如何用phpstorm同步测试服务器
  • 大数据与云计算学习:数据分析(二)
  • - 概述 - 《设计模式(极简c++版)》
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 首页查询功能的一次实现过程
  • 通过npm或yarn自动生成vue组件
  • 用jquery写贪吃蛇
  • 原生js练习题---第五课
  • 自动记录MySQL慢查询快照脚本
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #AngularJS#$sce.trustAsResourceUrl
  • #QT(一种朴素的计算器实现方法)
  • #Spring-boot高级
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (~_~)
  • (4)事件处理——(7)简单事件(Simple events)
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (十六)、把镜像推送到私有化 Docker 仓库
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (译)2019年前端性能优化清单 — 下篇
  • (轉貼) UML中文FAQ (OO) (UML)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .htaccess配置常用技巧
  • .Net IE10 _doPostBack 未定义
  • .NET 事件模型教程(二)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net连接oracle数据库
  • .NET连接数据库方式
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc