gojoy参数的生成过程,反调试,以及混淆js

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 该文章主要提供交流学习使用,请勿利用其进行不当行为!如本篇文章侵犯了贵公司的隐私,请联系我立刻删除!
该文章主要提供交流学习使用,请勿利用其进行不当行为!

如本篇文章侵犯了贵公司的隐私,请联系我立刻删除!


今天分享一下gojoy的登陆产生的参数是如何形成的。


这里感谢    ttdd666 分享的参数生成过程。


好了,进入正题,这里我们全方位进行讲解。


这里我们打开'aHR0cHM6Ly9wYXNzcG9ydC5nb2pveS5jb20vbG9naW4=',进行登陆,打开f12开发者工具,我们会看到这个。有个debugger,自动进入调试。



这里我们在debugger处,打上断点,右键选择Edit  Breakpoint ,然后输入false,点击下一步就行了,断点会自动断下来。



然后我们输入账号密码,开始抓包,post提交的参数如下,一串数字加字母的组合,不知道什么东西,而且我们经常见的参数名也没有了,这怎么找参数呢。



不要慌,问题不大,慌也没用撒。我们看这里,就会发现很多js参数。这里提醒一下,并不是所有都是这样找的,这个只是方便点。



我们点进去第一个js。然后格式化,在此处打上断点,如下,我们就会发现参数l,就是我们要找的参数。



但是这里我们就是想明白,这个l已经是加密过后的参数了,那我们就得往前翻,找到没被加密之前的事如何传参的。我们继续往后找。



然后发现在这里,我们下上断点,然后运行,会发现,post,mobile,等,看着是不是很熟悉。然后我们看到s就是我们的账号密码,此处,还没有加密,那我们就执行下一步,,这里执行下一步,我们要小心点,用心看,别执行那么快。



大约执行10次左右,我们发现,Q函数里面,有我们的账号密码。



那我们看一下,Q函数携带上账号密码,是不是我们要的结果。



此处我们进入Q函数,然后发现,我们进入的怎么使s函数。当时我也是一阵迷茫,这是啥情况呢,然后慢慢发现,这里有一行代码,我们调用s函数,实际上就是Q函数。



此处我们看代码发现,这是个大列表,,别表里面有五六个函数,然后相互调用。那我们先把代码抠出来。就是这个大列表,我们放入VScode里面,因为我们要进行调试。里面有很多坑,需要我们进行调试。



然后我们发现,代码里面竟然有debugger,我敲,神了,那我们就看看代码哪里有debugger。



我们通过断点发现,这就是debugger。我敲。真的是。。。。。。



既然发现了,我们得把他删除掉,影响我们代码运行,然后我们又发现,这是一段for循环的代码,但是 i < 后面的东西应该是个数字,这么一长串是什么东西呢。



我们把后面的复制出来,然后特喵的,发现这么一长段,竟然是个0。我就想问问他们程序员这么无聊的吗,无力吐槽。



那我们就把代码删掉,因为里面有debug程序,而且我们也知道结果是什么了。



我们继续调试。然后发现还有一个又出来一个debug,,,,,,,,,,,,和上面的一样,替换成0就行了。

然后接着运行,然后又有一个debug,我吐吐血,我。我。我。。。。。。



这个地方删除这个函数就行了。如下。



然后发现程序可以运行了,我们,打印一下输出的东西。



然后就会输出结果,这个就是生成过程,但是如果用python调用的话还是会报错的。我们下面更改一下。



python调用js如下。



这里我们用v8模块运行js,会发现报错了,我们查看一下,发现,这是错误抛异常的代码,不管里面哪个代码错了,都会跑出来异常。



那我们就先把try捕获异常去掉,看看是哪个代码报错了。然后发现是这行代码,那我们知道哪行代码错了,我们就开始进行调试。



经过调试发现,this.b就是atob,,而atob是js里面base64的方法,atob,btoa,解码,和编码。具体可搜索base64.js。



这里我们用base64.decode和encode代替一下。复制原生的js代码。


var Base64 = {    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",    encode: function(e) {        var t = "";        var n, r, i, s, o, u, a;        var f = 0;        e = Base64._utf8_encode(e);        while (f < e.length) {            n = e.charCodeAt(f++);            r = e.charCodeAt(f++);            i = e.charCodeAt(f++);            s = n >> 2;            o = (n & 3) << 4 | r >> 4;            u = (r & 15) << 2 | i >> 6;            a = i & 63;            if (isNaN(r)) {                u = a = 64            } else if (isNaN(i)) {                a = 64            }            t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)        }        return t    },    decode: function(e) {        var t = "";        var n, r, i;        var s, o, u, a;        var f = 0;        e = e.replace(/[^A-Za-z0-9+/=]/g, "");        while (f < e.length) {            s = this._keyStr.indexOf(e.charAt(f++));            o = this._keyStr.indexOf(e.charAt(f++));            u = this._keyStr.indexOf(e.charAt(f++));            a = this._keyStr.indexOf(e.charAt(f++));            n = s << 2 | o >> 4;            r = (o & 15) << 4 | u >> 2;            i = (u & 3) << 6 | a;            t = t + String.fromCharCode(n);            if (u != 64) {                t = t + String.fromCharCode(r)            }            if (a != 64) {                t = t + String.fromCharCode(i)            }        }        t = Base64._utf8_decode(t);        return t    },    _utf8_encode: function(e) {        e = e.replace(/rn/g, "n");        var t = "";        for (var n = 0; n < e.length; n++) {            var r = e.charCodeAt(n);            if (r < 128) {                t += String.fromCharCode(r)            } else if (r > 127 && r < 2048) {                t += String.fromCharCode(r >> 6 | 192);                t += String.fromCharCode(r & 63 | 128)            } else {                t += String.fromCharCode(r >> 12 | 224);                t += String.fromCharCode(r >> 6 & 63 | 128);                t += String.fromCharCode(r & 63 | 128)            }        }        return t    },    _utf8_decode: function(e) {        var t = "";        var n = 0;        var r = c1 = c2 = 0;        while (n < e.length) {            r = e.charCodeAt(n);            if (r < 128) {                t += String.fromCharCode(r);                n++            } else if (r > 191 && r < 224) {                c2 = e.charCodeAt(n + 1);                t += String.fromCharCode((r & 31) << 6 | c2 & 63);                n += 2            } else {                c2 = e.charCodeAt(n + 1);                c3 = e.charCodeAt(n + 2);                t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);                n += 3            }        }        return t    }}


这里我们修改为..如下。



然后运行,如下。



用python调用。



今天的分享到此结束,谢谢大家阅读此文章,下篇文章见撒!


目录
相关文章
|
2月前
|
前端开发
用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版
用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版
|
8天前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
24 7
|
2月前
|
JavaScript 前端开发
JavaScript基础知识-函数的参数
关于JavaScript函数参数基础知识的介绍。
25 4
JavaScript基础知识-函数的参数
|
2月前
|
JavaScript 前端开发
JavaScript 函数参数
JavaScript 函数参数
26 3
|
2月前
|
前端开发 JavaScript
前端JS截取url上的参数
文章介绍了两种前端JS获取URL参数的方法:手动截取封装和使用URLSearchParams。
48 0
|
4月前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
57 1
|
4月前
|
存储 资源调度 前端开发
JavaScript 使用axios库发送 post请求给后端, 给定base64格式的字符串数据和一些其他参数, 使用表单方式提交, 并使用onUploadProgress显示进度
使用 Axios 发送包含 Base64 数据和其他参数的 POST 请求时,可以通过 `onUploadProgress` 监听上传进度。由于整个请求体被视为一个单元,所以进度可能不够精确,但可以模拟进度反馈。前端示例代码展示如何创建一个包含 Base64 图片数据和额外参数的 `FormData` 对象,并在上传时更新进度条。后端使用如 Express 和 Multer 可处理 Base64 数据。注意,实际进度可能不如文件上传精确,显示简单加载状态可能更合适。
|
4月前
|
JavaScript 前端开发 数据格式
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
228 0
|
4月前
|
JavaScript
js 获取并解析 url 中参数的三种方法
js 获取并解析 url 中参数的三种方法
407 0
|
5月前
|
JavaScript
fastadmin js里获取后端传的参数
fastadmin js里获取后端传的参数
128 0