【爬虫逆向分析实战】某笔登录算法分析——本地替换分析法

news2024/11/19 11:30:57

前言

作者最近在做一个收集粉币的项目,可以用来干嘛这里就不展开了😁,需要进行登录换算token从而达到监控收集的作用,手机抓包发现他是通过APP进行计算之后再请求接口的,通过官网分析可能要比APP逆向方便多,但是通过这几天的观察我并没有头绪,这篇文章草稿创建了接近一个月了,无从下笔,借助了人工智能也没有达到效果,可见它的难度不一般(也可能是我JS基础太过薄弱的原因),本次我们用一种分析方法慢慢的瓦解击破他的层层逻辑!

JS启动分析

这里从网站入手,原因如下:

  • 没有验证码
  • JS结构清晰

在这里插入图片描述
观察不难发现,密码是被加密的
在这里插入图片描述
必定是通过js进行加密的,我们查看启动器
在这里插入图片描述
发现有以下几个关键JS
在这里插入图片描述
第一感觉是,main为主方法,其他的是用来调用的,encrypt应该是用于加密的方法,通过上面的启动器证实了main.js的确是优先启动的

找到main.js搜索password
密码通过this.encrypt()进行加密的
在这里插入图片描述

var n = {
phone: this.phone,
verification: this.verification,
password: this.encrypt(this.password)
};

找到encrypt()方法

encrypt(n) {
return window.encrypt(this.publicKey, n)
}

需要用到一个参数publicKey
在这里插入图片描述
到这里我们基本搞清楚了,登录时将原密码,进行调用window.encrypt(this.publicKey, n)加密

猜想

猜测n为原密码,如何证实呢?有很多人想说观察代码的调用,这当然可以,但如果是复杂的代码或者加密的你还能看吗?
这里用了一个浏览器自带的功能本地替换,可以无视代码加密,为什么这么说,因为代码加密最后还是要被执行,不能执行的代码加密了有啥用呢??

我们找到main.js将n弹窗显示

     encrypt(n) {
      alert(n);
      return encrypt(this.publicKey, n)
      }

在这里插入图片描述
替换到本地启用后,我们进行登录模拟,看看有没有效果?
在这里插入图片描述
在这里插入图片描述
这里将我的登录密码弹出来了,猜想正确!

顺藤摸瓜

有了刚刚的思想,我们直接找encrypt.js,因为在main.js中最后调用了

 return encrypt(this.publicKey, n)

而在main.js中没有其他方法了 ,在encrypt.js我们找到了相关方法

 av.encrypt = function(aG, z) {
 
        var t = new N();
        t.setPublic(a(aG), "10001");
        
        return ai(t.encrypt(z))
    }

代码是否运行到这里,和刚刚一样验证一下就可以了
在这里插入图片描述

发现又调用了新的方法ai(t.encrypt(z))

 function ai(aG) {
        var z;
        var aH;
        var t = "";
        for (z = 0; z + 3 <= aG.length; z += 3) {
            aH = parseInt(aG.substring(z, z + 3), 16);
            t += ad.charAt(aH >> 6) + ad.charAt(aH & 63)
        }
        if (z + 1 == aG.length) {
            aH = parseInt(aG.substring(z, z + 1), 16);
            t += ad.charAt(aH << 2)
        } else {
            if (z + 2 == aG.length) {
                aH = parseInt(aG.substring(z, z + 2), 16);
                t += ad.charAt(aH >> 2) + ad.charAt((aH & 3) << 4)
            }
        }
        while ((t.length & 3) > 0) {
            t += Y
        }
        alert(t);
        return t
        
    }

我们在修改代码将t进行弹窗显示,重新来一遍整个登录过程,观察最后的加密密码是否与请求的一致

模拟登录测试

在这里插入图片描述
在这里插入图片描述
经过对比是一致的,由于我们的环境是python,接下来借助GPT进行代码转换

代码转换

通过将涉及到的函数调用方法进行罗列,通过人工智能改写

var publicKey='ANKi9PWuvDOsagwIVvrPx77mXNV0APmjySsYjB1/GtUTY6cyKNRl2RCTt608m9nYk5VeCG2EAZRQmQNQTyfZkw0Uo+MytAkjj17BXOpY4o6+BToi7rRKfTGl6J60/XBZcGSzN1XVZ80ElSjaGE8Ocg8wbPN18tbmsy761zN5S';
var n='密码'
encrypt(publicKey, n)

encrypt(aG, z) {
        var t = new N();
        t.setPublic(a(aG), "10001");
        return ai(t.encrypt(z))
    }

    function a(aI) {
        alert("经过");
        var aG = "";
        var aH;
        var t = 0;
        var z;
        for (aH = 0; aH < aI.length; ++aH) {
            if (aI.charAt(aH) == Y) {
                break
            }
            v = ad.indexOf(aI.charAt(aH));
            if (v < 0) {
                continue
            }
            if (t == 0) {
                aG += aF(v >> 2);
                z = v & 3;
                t = 1
            } else {
                if (t == 1) {
                    aG += aF((z << 2) | (v >> 4));
                    z = v & 15;
                    t = 2
                } else {
                    if (t == 2) {
                        aG += aF(z);
                        aG += aF(v >> 2);
                        z = v & 3;
                        t = 3
                    } else {
                        aG += aF((z << 2) | (v >> 4));
                        aG += aF(v & 15);
                        t = 0
                    }
                }
            }
        }
        if (t == 1) {
            aG += aF(z << 2)
        }
        return aG
    }


        function ai(aG) {
        // alert(aG);
        var z;
        var aH;
        var t = "";
        for (z = 0; z + 3 <= aG.length; z += 3) {
            aH = parseInt(aG.substring(z, z + 3), 16);
            t += ad.charAt(aH >> 6) + ad.charAt(aH & 63)
        }
        if (z + 1 == aG.length) {
            aH = parseInt(aG.substring(z, z + 1), 16);
            t += ad.charAt(aH << 2)
        } else {
            if (z + 2 == aG.length) {
                aH = parseInt(aG.substring(z, z + 2), 16);
                t += ad.charAt(aH >> 2) + ad.charAt((aH & 3) << 4)
            }
        }
        while ((t.length & 3) > 0) {
            t += Y
        }
        alert(t);
        return t
        
    }

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

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

相关文章

2023-12-01 LeetCode每日一题(找出叠涂元素)

2023-12-01每日一题 一、题目编号 2661. 找出叠涂元素二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。arr 和 mat 都包含范围 [1&#xff0c;m * n] 内的 所有 整数。 从下标 0 开始遍历 arr 中的每…

【SpringBoot3+Vue3】七【后续2】【番外篇】- (使用docke部署)

目录 一、maven打包后端服务 1、clean 2、package 3、查看jar包 二、部署java后端服务 1、使用dockerfile构建一个java17的镜像 1.1 使用dokcerfile构建容器命令 1.2 方式一 将jar打包进容器镜像 1.3 方式二 jar不打包进容器镜像&#xff0c;通过映射主机目录映射方式…

C/C++ 内存管理(1)

文章目录 C/C 内存划分静态和动态内存C语言的动态内存分配函数mallocfreecallocrealloc 常见内存使用错误 C/C 内存划分 栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结 束时这些存储…

【QuickSort】单边快排思路及实现

思路&#xff1a; &#xff08;1&#xff09;首先定义一个递归函数&#xff1a;qucikSort(int [ ] arr,int l,int r)。函数的定义&#xff1a;给定一个数组arr&#xff0c;对它在[l,r]这个区间内的元素进行排序&#xff0c;从而使得整个数组在[l,r]这个区间内有序。 &#xff0…

NRF24L01 无线收发模块与 Arduino 的应用

NRF24L01 是一款常用的无线收发模块&#xff0c;与 Arduino 兼容性良好&#xff0c;可以用于实现无线通信和数据传输。本文将介绍如何将 NRF24L01 模块与 Arduino 配合使用&#xff0c;包括硬件的连接和配置&#xff0c;以及相应的代码示例。 一、引言 NRF24L01 是一款基于 2.…

Linux基础项目开发1:量产工具——文字系统(四)

前言&#xff1a; 前面我们已经把显示系统&#xff0c;输入系统的框架搭建好了&#xff0c;那么有了输入和显示&#xff0c;显示的内容应该是什么呢&#xff1f;这节就要让我们一起对显示的内容&#xff0c;文字系统进行搭建。 目录 一、数据结构抽象 1.描述一个文字的位图&a…

数字图像处理(实践篇) 十六 基于分水岭算法的图像分割

目录 一 分水岭算法 二 利用OpenCV实现分水岭算法的过程 三 实践 一 分水岭算法 基于任何灰度图像都可以视为地形表面&#xff0c;其中高强度表示山峰和山丘&#xff0c;而低强度表示山谷。首先&#xff0c;开始用不同颜色的水&#xff08;标签&#xff09;填充每个孤立的山…

循环单向链表(详解)

循环单向链表原理 循环单项链表项目结构 头文件RecycleLinlList.h 头文件具体代码 #ifndef RECYCLRLINKLIST #define RECYCLRLINKLIST#include <stdio.h> #include <stdlib.h>// 宏定义 #define CIRCLELINKLIST_TRUE 1 #define CIRCLELINKLIST_FALSE 0 // 链表…

7.2 Windows驱动开发:内核注册并监控对象回调

在笔者上一篇文章《内核枚举进程与线程ObCall回调》简单介绍了如何枚举系统中已经存在的进程与线程回调&#xff0c;本章LyShark将通过对象回调实现对进程线程的句柄监控&#xff0c;在内核中提供了ObRegisterCallbacks回调&#xff0c;使用这个内核回调函数&#xff0c;可注册…

vscode如何在没有网络的情况下安装插件

vscode如何在没有网络的情况下安装插件 start 遇到没有网络的电脑&#xff0c;无法直接从插件市场安装vscode的插件。写一下 vscode 插件离线安装的方法. 解决方案 目标电脑没有可以安装插件的网络&#xff0c;那我们只能在有网络的环境下载好我们的插件。然后拷贝软件到无…

localStorage 和sessionStorage

localStorage 和 sessionStorage 是浏览器提供的两种客户端存储数据的方式&#xff1a; 生命周期&#xff1a; localStorage&#xff1a; 存储在 localStorage 中的数据在浏览器关闭后仍然保留&#xff0c;直到被显式删除或浏览器清除缓存。sessionStorage&#xff1a; 存储在 …

【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;Docker零基础入门专栏 目录 第 1 步&#xff1a;创建 Dockerfile 第 2 步&#xff1a;构建 Docker 镜像 第 3 步&#xff1a;运行 Docker 容器 第 4 步&#xff1a;验证输出 dockerfile命令详解 最佳实践 默认情况下…

对el-select封装成组件使用

效果与直接使用el-select一样&#xff0c;多处用el-select显得代码冗余就进行了封装 效果图&#xff1a; el-select封装&#xff1a; <template><div class"my-select"><el-selectv-model"person.modelValue":placeholder"placehold…

【广州华锐视点】机械零件拆装VR仿真教学系统

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进我们的生活。在教育领域&#xff0c;VR技术的应用也日益广泛&#xff0c;为学生提供了更加生动、直观的学习体验。广州华锐视点开发的机械零件拆装VR仿真教学系统作为一种新兴的教学方式&…

oops-framework框架 之 初始了解(一)

引擎&#xff1a;CocosCreator 环境&#xff1a; Mac Gitee: oops-framework 简介 oops-framework是由作者dgflash编写&#xff0c;基于CocosCreator 3.x而实现的开源框架。 该框架以插件形式存在&#xff0c;主要目的是为了降低与项目的耦合&#xff0c;并且通过插件内部的…

【代码】基于麻雀搜索优化Kmeans图像分割算法

程序名称&#xff1a;基于麻雀搜索优化Kmeans图像分割算法 实现平台&#xff1a;matlab 代码简介&#xff1a;首先使用麻雀搜索优化算法来确定 K-means 算法的初始质心位置&#xff0c;然后进行传统的 K-means 聚类。这样做的目的是为了避免 K-means 算法陷入局部最优解&…

Mybatis 的操作(续集)

Mybatis 是一款优秀的 持久性 框架,用于简化 JDBC 的开发 持久层 : 指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的 简单来说 Mybatis 是更简单完成程序和数据库交互的框架 Mybatis 的写法有两种 : 1.xml 2.注解 这两者各有利弊,后面进行总结 Mybati…

HTML5 的全局属性 hidden 和 display:none 的关系

目录 1&#xff0c;hidden 和 display:none 的关系2&#xff0c;其他隐藏元素的方式2.1&#xff0c;语意上的隐藏2.2&#xff0c;视觉上的隐藏 1&#xff0c;hidden 和 display:none 的关系 hidden - MDN 参考 一句话总结&#xff1a;hidden 是HTML5 新增的全局布尔属性&…

播放器开发(七):音视频同步实现

目录 学习课题&#xff1a;逐步构建开发播放器【QT5 FFmpeg6 SDL2】 原理 简单分析&#xff1a; 下图简单描述了在一个播放过程中&#xff0c;假设我们先播放音频&#xff0c;对比一个公共时间轴&#xff0c;视频就会始终比音频慢0.003s。 我们在日常中用一些播放器播放视频…

Oracle:左连接、右连接、全外连接、(+)号详解

目录 Oracle 左连接、右连接、全外连接、&#xff08;&#xff09;号详解 1、左外连接&#xff08;LEFT OUTER JOIN/ LEFT JOIN&#xff09; 2、右外连接&#xff08;RIGHT OUTER JOIN/RIGHT JOIN&#xff09; 3、全外连接&#xff08;FULL OUTER JOIN/FULL JOIN&#xff0…