【万字解析】JS逆向由浅到深,3个案例由简到难,由练手到项目解析(代码都附详细注释)

news2024/11/24 7:16:25

目录

  • 介绍
  • 简单案例
  • 简单案例二
  • 项目实战案例-某查查

介绍

大家好,我是辣条哥!
今天给大家上点难度,不然总觉得辣条哥太菜了!我们今天聊聊JS逆向,首先JS逆向是指对使用JavaScript编写的代码进行逆向工程,以获取代码的逻辑、算法或者进行修改。
在这里插入图片描述

下面举一个简单的例子来说明JS逆向的过程:

假设有一个网站,它使用了JavaScript来进行表单验证。当用户在登录表单中输入用户名和密码后,点击登录按钮时,JavaScript代码会对输入的用户名和密码进行验证,如果验证通过,则允许用户登录,否则会提示错误信息。

现在我们想要绕过这个验证,直接登录到网站。我们可以通过以下步骤进行JS逆向:

1.打开网站登录页面,按下F12键打开开发者工具。
2.在开发者工具的Elements或者Sources选项卡中找到包含验证逻辑的JavaScript文件。
3.阅读JavaScript代码,寻找与表单验证相关的函数或者逻辑。
4.分析代码,找出验证的规则和条件。可能会涉及到正则表达式、字符串比较、加密算法等。
5.修改代码,绕过验证。可以通过修改验证函数的返回值,或者直接注释掉验证代码。
6.刷新页面,输入用户名和密码,点击登录按钮,验证是否成功绕过。

废话不过说直接上案例!
在这里插入图片描述

简单案例

以下是一个简单的JS逆向实战案例,用于解析一个简单的加密字符串。代码中包含了详细的注释,帮助你理解每一步的操作。


// 加密字符串
var encryptedString = "dGhpcyBpcyBhIHN0cmluZw==";

// 解密函数
function decryptString(encryptedString) {
  // Base64解码
  var decodedString = atob(encryptedString);
  
  // 字符串反转
  var reversedString = reverseString(decodedString);
  
  // 返回解密后的字符串
  return reversedString;
}

// 字符串反转函数
function reverseString(string) {
  // 将字符串转换为数组
  var stringArray = string.split("");
  
  // 反转数组
  var reversedArray = stringArray.reverse();
  
  // 将数组转换为字符串
  var reversedString = reversedArray.join("");
  
  // 返回反转后的字符串
  return reversedString;
}

// 调用解密函数并打印结果
var decryptedString = decryptString(encryptedString);
console.log(decryptedString)

这个案例中,我们首先定义了一个加密字符串 encryptedString,然后定义了一个解密函数 decryptString。解密函数接收一个加密字符串作为参数,并返回解密后的字符串。

解密函数中,我们首先使用 atob 函数对加密字符串进行 Base64 解码,得到解码后的字符串 decodedString。然后,我们调用自定义的 reverseString 函数对解码后的字符串进行反转操作,得到反转后的字符串 reversedString。最后,我们返回反转后的字符串作为解密结果。

reverseString 函数中,我们首先将字符串转换为数组,然后使用 reverse 函数对数组进行反转操作,得到反转后的数组 reversedArray。接着,我们使用 join 函数将数组转换为字符串,得到反转后的字符串 reversedString。最后,我们返回反转后的字符串作为结果。

最后,我们调用解密函数并将结果打印到控制台。在这个案例中,解密函数会将加密字符串 “dGhpcyBpcyBhIHN0cmluZw==” 解密为 “this is a string”

在这里插入图片描述

简单案例二

深入难度更高的JS逆向实战案例,带有详细注释:

// 假设有一个加密函数,将输入的字符串进行简单的加密
function encrypt(str) {
  var encryptedStr = "";
  for (var i = 0; i < str.length; i++) {
    var charCode = str.charCodeAt(i);
    encryptedStr += String.fromCharCode(charCode + 1);
  }
  return encryptedStr;
}

// 假设有一个使用加密函数的登录函数
function login(username, password) {
  var encryptedUsername = encrypt(username);
  var encryptedPassword = encrypt(password);

  // 发送加密后的用户名和密码到服务器进行验证
  // 这里只是模拟,实际上应该发送请求到服务器
  if (encryptedUsername === "ifmmp" && encryptedPassword === "qbttxpse") {
    console.log("登录成功");
  } else {
    console.log("登录失败");
  }
}

// 假设攻击者想要逆向加密函数,获取加密算法
function reverseEncrypt() {
  var encryptedStr = "ifmmp";
  var decryptedStr = "";
  for (var i = 0; i < encryptedStr.length; i++) {
    var charCode = encryptedStr.charCodeAt(i);
    decryptedStr += String.fromCharCode(charCode - 1);
  }
  console.log(decryptedStr); // 输出 "hello"
}

// 假设攻击者想要逆向登录函数,获取加密后的用户名和密码
function reverseLogin() {
  var encryptedUsername = "ifmmp";
  var encryptedPassword = "qbttxpse";

  var decryptedUsername = "";
  var decryptedPassword = "";

  for (var i = 0; i < encryptedUsername.length; i++) {
    var charCode = encryptedUsername.charCodeAt(i);
    decryptedUsername += String.fromCharCode(charCode - 1);
  }

  for (var i = 0; i < encryptedPassword.length; i++) {
    var charCode = encryptedPassword.charCodeAt(i);
    decryptedPassword += String.fromCharCode(charCode - 1);
  }

  console.log(decryptedUsername); // 输出 "hello"
  console.log(decryptedPassword); // 输出 "password"
}

// 调用逆向函数
reverseEncrypt();
reverseLogin();

在这个案例中,我们假设有一个加密函数 encrypt,它将输入的字符串进行简单的加密。然后有一个使用加密函数的登录函数 login,它将用户名和密码加密后发送到服务器进行验证。

攻击者想要逆向加密函数,获取加密算法。为了实现这个目标,攻击者编写了 reverseEncrypt 函数,它将加密后的字符串进行逆向操作,得到原始的字符串。

同样地,攻击者想要逆向登录函数,获取加密后的用户名和密码。为了实现这个目标,攻击者编写了 reverseLogin 函数,它将加密后的用户名和密码进行逆向操作,得到原始的用户名和密码。

这个案例展示了逆向工程的基本思路,即通过观察和分析代码的行为,逆向推导出加密算法或其他关键信息。

在这里插入图片描述

项目实战案例-某查查

为了解决某查查账号被封的问题,我们可以尝试使用逆向工程的方法来绕过访问频率限制。下面是一个使用JavaScript进行逆向实战的案例,带有详细注释。

// 导入所需的库
const axios = require('axios');
const cheerio = require('cheerio');

// 设置请求头,模拟正常的浏览器请求
const headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  'Referer': 'https://www.qcc.com/'
};

// 定义要访问的企查查页面URL
const url = 'https://www.qcc.com/';

// 发送GET请求获取页面内容
axios.get(url, { headers })
  .then(response => {
    // 使用cheerio解析页面内容
    const $ = cheerio.load(response.data);

    // 在页面中查找访问频率限制的提示信息
    const limitMessage = $('.limit-message').text();

    // 判断是否存在访问频率限制的提示信息
    if (limitMessage) {
      console.log('访问频率超限,请稍后再试');
    } else {
      console.log('访问成功');
      // TODO: 进行其他操作,如解析页面数据等
    }
  })
  .catch(error => {
    console.error('请求出错:', error);
  });

这个案例中,我们使用了axios库发送GET请求,模拟正常的浏览器请求。通过设置请求头中的User-AgentReferer字段,我们让请求看起来更像是来自真实的浏览器。

然后,我们使用cheerio库解析返回的页面内容。通过查找页面中的访问频率限制提示信息,我们可以判断是否被封禁。如果存在访问频率限制的提示信息,我们输出“访问频率超限,请稍后再试”;否则,我们输出“访问成功”,并可以进行其他操作,如解析页面数据等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA数据结构—飞机售票系统

飞机售票系统 1. 题目要求&#xff1a; 1.1 通过该系统可以实现如下功能。 录入功能&#xff1a;可以录入航班情况。 查询功能&#xff1a;可以查询某个航线的情况&#xff0c;如输入航班号&#xff0c;可以查询起降时间、起飞抵达城市、航班票价、票价折扣、确定航班是否满…

我爱学QT-QT上位机开发之串口助手-上

学习链接&#xff1a; QT上位机开发之串口助手&#xff08;上&#xff09;_哔哩哔哩_bilibili 一.QT下的串口编程 1.qt下的串口编程 2.qt下的网络编程 3.qt下操作GPIO 二.仿写串口助手 步骤一.做好UI界面 接收窗口组件&#xff1a; 选择窗口组件&#xff1a; 发送窗口组…

如何在Linux下搭建接口自动化测试平台

&#x1f4cc; 博客主页&#xff1a; 程序员念姐 &#x1f4cc; 专注于软件测试领域相关技术实践和思考&#xff0c;持续分享自动化软件测试开发干货知识&#xff01; &#x1f4cc; 如果你也想学习软件测试&#xff0c;文末卡片有我的交流群632880530&#xff0c;加入我们&…

【淘宝API接口开发系列】商品页面数据,接口可高并发,Python语言请求示例,其他语言请求示例可进参考

首先以taobao商品数据为例 item_get-获得taobao商品详情 taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;注册Key和secret接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址…

【软件测试】Windows下同一电脑配置多个Git公钥(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 首先在配置多个本…

数据备份和还原的简单操作

两个表如图所示&#xff0c;完成一下操作 1、使用mysqldump命令备份数据库中的所有表 先创建存储数据的目录 使用mysqldump命令备份数据库中的所有表 去查看已经备份 2、备份booksDB数据库中的books表 备份数据库中的某些表&#xff0c;在库后面空格间隔 备份完毕 3、使用…

紫光展锐CEO任奇伟博士:用芯赋能,共建XR新生态

7月6日&#xff0c;2023世界人工智能大会在上海世博中心及世博展览馆盛大开幕。紫光集团高级副总裁、紫光展锐CEO任奇伟博士受邀出席芯片主题论坛&#xff0c;并发表题为《用芯赋能&#xff0c;共建XR新生态》的演讲。 世界人工智能大会自2018年创办以来已成功举办五届&#xf…

力扣332. 重新安排行程 Java dfs回溯

给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK 开始。如果存在多种…

AutoDL使用教程

AutoDl是一个租用GPU显卡的平台&#xff0c;我们可以在上面租用显卡。我训练模型的时候租用了一块V100。 下面介绍一下使用AutoDL 来租用GPU显卡&#xff0c;并将自己的代码上传&#xff0c;运行代码。 目录&#xff1a; 创建实例配置环境 pytorch环境上传文件运行代码 一、…

DAY11_RequestResponse

目录 1 Request和Response的概述2 Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式 2.3 IDEA快速创建Servlet2.4 请求参数中文乱码问题2.4.1 POST请求解决方案2.4.2 GET请求…

flutter图片添加水印

flutter为图片右下角添加上水印 //制造字符串水印图片_makeStrMarkImage(String str, double fontSize) async {final picRecorder ui.PictureRecorder();final paragraphBuilder ui.ParagraphBuilder(ui.ParagraphStyle(textAlign: TextAlign.left,fontSize: fontSize,),)…

C#winform电脑关机实例

本篇实例演示C#winform电脑关机 创建winform添加一个按钮 Cs文件代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.T…

ThreadLocal学习

1、threadLocal图解 java.lang.ThreadLocal类实现了线程的本地存储。 ThreadLocal的内部实现&#xff1a; ThreadLocal的内部实现包括一个类似HashMap的对象&#xff0c;这里称之ThreadLocalMap。 ThreadLocalMap的key会持有对ThreadLocal实例的弱引用&#xff08;Weak Refer…

Perfectly Clear Workbench for Mac/Windows(智能图像清晰度处理软件)

Perfectly Clear Workbench是一款用于图像处理和修复的软件工具&#xff0c;它提供了一套强大的功能&#xff0c;旨在自动优化照片质量并消除常见的图像缺陷。这个工作台是Perfectly Clear家族的一部分&#xff0c;由Athentech Imaging开发和维护。 Perfectly Clear Workbench…

第一章:光纤通信概述

第一节&#xff1a;通信基本概念 1.1光纤通信基本概念 1.1.1光纤通信的概念 利用光导纤维传输广播信号的通信方式称为光纤通信。光波主要包括紫外线、可见光和红外线。光纤通信工作波长在近红外区&#xff0c;0.8um~1.8um的波长区&#xff0c;频率为167THz~375THz。光纤基础…

JWT跨域认证解决方案

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案&#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题 互联网服务离不开用户认证 一般流程是&#xff1a; 1、用户向服务器发送用户名和密码 2、服务器验证通过后&#xff0c;在当前对话…

【SpringBoot】SpringBoot-Admin 服务监控 + 告警通知

简单介绍 Spring Boot Actuator 是 Spring Boot 自带的一个功能模块&#xff0c; 提供了一组已经开箱即用的生产环境下常用的特性和服务&#xff0c;比如应用程序的健康检查、信息暴露、度量收集、日志记录等。 在实际项目中&#xff0c;Actuator 可以帮助我们快速了解应用程序…

三维重建以及神经渲染中的学习(一)

三维重建以及神经渲染中的学习 公众号AI知识物语 本文内容为参加过去一次暑期课程学习时的笔记&#xff0c;浅浅记录下。 显示表征&#xff1a; 点云points&#xff1a;由一组离散三维点表征物体表面 推理速度快&#xff0c;容易获取 -离散表征&#xff0c;无拓扑关系 [Fa…

mysql的聚簇索引和非聚簇索引的区别

MySQL InnoDB存储引擎时&#xff0c;索引类型可分为聚簇索引和非聚簇索引&#xff0c;有时候也通俗的称为主键索引和普通索引。MyISAM的引擎只有非聚簇索引&#xff0c;所以MYSIAM的引擎在查询的时候非主键索引的时候特别快 接下来讨论一下几个问题&#xff1a; 什么是聚簇索…

linux搭建vsftpd服务使用filezilla连接服务

背景&#xff1a;支持使用filezilla上传文件到公司的服务机器上&#xff0c;所以搭建vsftpd支持filezilla进行上传 一、linux机器搭建vsftpd服务 1、先看看自己的机器属于什么发行版&#xff0c;不同的发行版命令不一样 我的是centos&#xff0c;其他发行版命令不一样&#xf…