Cloudflare分析第二天:解密返回数据

前言

Cloudflare分析第一天:简单的算法反混淆

由上篇for (j = "10|8|5|9|1|4|0|2|3|6|7"["split"]('|')

可以看到循环的循序

case '6':o = (n = {},n["msg"] = f,n.cc = g,hF["VNwzz"](JSON["stringify"](n))["replace"]('+', "%2b"));continue;case '7':m["send"](i["TglBA"](i["iEKkH"]('v_', fy["_cf_chl_opt"]["cRay"]) + '=', o));continue;

提交之前先把数据转为字符串,再进行加密之后send

为了防止代码进入错误分支(第一天的分析中,只是为了定位加密的位置,调试出来的数据肯定是错误的),之后hook json来输出加密前的JSON数据

Hook代码:

JSON_=JSON.stringify;
JSON.stringify=function(data) {console.log(JSON_(data));return JSON_(data);}

输出如图:

 加密算法应该就是hF["VNwzz"]

算法暂且不提,提交之后返还如图:

明显也是加密过的,既然返回,既然有后续,那么可以断定肯定可以解密的,找一下解密函数的位置.

 从send往下跟(下面JS代码非第一篇中的JS代码了,是实时调试的代码,因为每次刷新JS内容都不一样,所以你们显示的代码跟我贴出来的不会相同,但是会类似)

i[jj(473)] = function(jm, l, m, n, o, s, u, v, w) {if (jm = jj,l = {},l["VWkdu"] = "unspun",m = l,n = "600010",i["readyState"] != 4)return;(o = this["getResponseHeader"]("content-type"),f["MMxvO"](o, f["SFsFE"])) && (s = JSON["parse"](i["responseText"]),s["err"] && (n = s["err"]));if (u = f["fzhiJ"](hj, n),u && f["fzhiJ"](hk, u),i["status"] === 400) {if ("QwWqw" === "QwWqw")return void fy["fUJhKx5"]();elsee(f, function(B, jn) {jn = jm,B[jn(274)][jn(448)] = jn(502),B[jn(274)][jn(1191)] = jn(496)})}if (f["mycqq"](i["status"], 200) && f["mycqq"](i["status"], 304)) {if (f["ZYzcT"]("Vjfpl", "Vjfpl"))return void f["AQGEw"](h);elsee("spinner-icon", function(C, jo) {jo = jm,C[jo(1878)][jo(397)](m[jo(1372)])}),f(f["YBWCH"])}(v = gc(i["responseText"]),v["startsWith"]("window._")) ? new fy[("Function")](v)(d) : (w = g2(v),f["jKZSc"](typeof w, "function") && w(d))
}

可以看到得到i["responseText"],会经过函数gc,然后根据gc内容进入两个分支,应该是不同版本的Cloudflare的原因,也可以是跟请求次数的原因,这个留着后面再看!

这里返回的V内容如图:

 明显跟分支一的判断条件v["startsWith"]("window._"))不相关,那就是走第二个分支(w = g2(v),
    f["jKZSc"](typeof w, "function") && w(d))

先把v经过函数g2复制给w,判断w是不是一个function,是的话用运行函数w 传入的参数是d,

记录一下d的值是:

{"KhMOxC9":"interactive","bndrvD9":"6653","MYYj1":"2","ikkssZ0":0,"kbcqog7":0,"VQtOX1":1,"BtZG4":{"ru":"aHR0cHM6Ly9yZXNlcnZlLmNvdGFpdGlja2V0aW5nLmNvbS92ZW5ldGlhbi9ib29raW5nL3RlYW1sYWIyMDIwYT9sYW5nPXpoX2Nu","ra":"TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNS4wLjAuMCBTYWZhcmkvNTM3LjM2","rm":"R0VU","d":"GLaiWK7+Aynp53e83DlICIPs5kPXyow7ZJCuyNtNUjK0jVYAnt+TbytmxWrcP+62RSFFXIPuPmb/3fbHixQTprOyAwChBbvM1MrAvfjlmXW6qkuXmRFOKuykwiPuP3DMHmmaC63qr/9BJ+yhj2PzrjTA952Vb9Su06wVTdu7kEqdvr8OieyHZCkOpa+lGKgP/c6gQgEFq6S8VyKgGecCBuxJ56f14LFIYU2oNONruHPciGevRsu5QOgcMsbuwvMHB9JeIQK59eMH9M4J7rru11sjzPYBJLctT93PUSVKYS4dmYcFsb0dj/6RX7y3ODNkmURLa3vso3UJByrBLVZ5IuVymXA87PlT+VLbdfBMyJbXP7xStKwqEmxlbnp9VLzvtAnTkVFY8DSIuvnUSjqQWnNnQvAr3RPIDxrQbSNgVzdV+g3bHulxk6UCVIV1PN7SMvsZ+NAFFzVvhBjXOJEKEOpgEvhjL+0KYUSx9h0/yQBzAsPL/0GC8O7wwAyttYwfGhRNud5X+76dmcm9xKMV92iQrREz3f/6EMIgpNbnhzs=","t":"MTY5NTczNTI1My4zNDQwMDA=","cT":1695735254,"m":"2nCYUb/c8IGLtnA7v0cShWvIPXJfl/OTJmP5UNxF+1w=","i1":"X+hEwD3IazR/zARQ0f6Vsg==","i2":"2zPnYa8F0C5i9HwWO/A93A==","zh":"nokJ+kv3PhcFpycs7wM5nNWc180K5fDj0ICCUUtH6GA=","uh":"49m45payZ+JaK1qP7bVg0G3ztg3QEguIG+n0xYKxzGA=","hh":"2lEEhm+aTIz86a+3BVsMSx+TmoW9esNsNWiuxMPl5I4="},"JTJoTA3":{"bxAwfI6":0,"EMltvi8":0,"byQaTk7":0,"OBLzip2":0,"QZKLG1":0,"NAzoXH1":0,"OUeDDN9":0,"Ybbkg4":0},"LkMnc9":false}

貌似跟刚hook JSON输出的内容一样.

w的函数内容是:

function fI(i, j, l, n, o, s, u, v, w, ig, x, B, C, D) {return ig = ia,x = {},x["VLuHS"] = "QTvFm",x["UFwjI"] = function(E, F) {return F * E},x["eQQaR"] = function(E, F) {return E < F},x["DMIyJ"] = function(E, F) {return E ^ F},x["kBIZP"] = function(E, F) {return E ^ F},x["hRCDz"] = function(E, F) {return F ^ E},x["uPoTE"] = function(E, F) {return F ^ E},x["CGyfQ"] = function(E, F) {return E ^ F},x["bKlIO"] = function(E, F) {return E ^ F},x["ckUij"] = function(E, F) {return E ^ F},x["EfMnC"] = function(E, F) {return F ^ E},B = x,C = this,D = this.h[133 ^ this.g],this.h[B["uPoTE"](9, this.g)]["push"]([NaN, '', '', 0], this.h[B["bKlIO"](97, this.g)]["length"], 20),this.h[B["uPoTE"](68, this.g)] = j,this.h[this.g ^ 139] = l,this.h[this.g ^ 149.42] = n,this.h[126 ^ this.g] = o,this.h[72 ^ this.g] = s,this.h[254.22 ^ this.g] = u,this.h[this.g ^ 26] = v,this.h[135 ^ this.g] = w,this.h[this.g ^ 133.86] = i["slice"](),function(ih, E, F) {for (ih = ig,E = {'YBIKS': ih(1687),'HjGch': B[ih(167)],'BmmCx': function(G, H, ii) {return ii = ih,B["UFwjI"](G, H)},'Tkrye': ih(1527),'SSwvN': function(G, H, ij) {return ij = ih,B[ij(1303)](G, H)}},F = {}; !isNaN(C.h[B[ih(376)](133, C.g)][0]); F = {'j': F.j},F.j = C.h[B[ih(1187)](133, C.g)][3] ^ 87 + C.h[B[ih(1861)](133, C.g)][1][ih(433)](C.h[B[ih(954)](133, C.g)][0]++) & 255.69,function(G, ik, H) {return ik = ih,H = {'Ljnku': E["YBIKS"],'AjvvY': E["HjGch"],'IPsXd': function(I, J) {return I + J},'BkFWt': function(I, J, il) {return il = ik,E[il(194)](I, J)},'zbNLn': function(I, J) {return J !== I},'gBDEx': E["Tkrye"],'aYteo': function(I, J) {return I ^ J},'GRFey': function(I, J, im) {return im = ik,E[im(1664)](I, J)},'LoecI': function(I, J) {return I ^ J}},function(io, I, J, N, K) {if (io = ik,I = {'ApVtT': H["Ljnku"],'ALfoN': function(L, M) {return L(M)},'BbJsM': function(L, M, N, O) {return L(M, N, O)}},"UbZvD" === H["AjvvY"])return !s(I["ApVtT"]) && I["ALfoN"](C, "cookies_missing"),![];else {J = (J = C.h[133.64 ^ C.g],J[3] = H["IPsXd"](H["BkFWt"](28083, J[3] + G.j), 13090) & 255,C.h[G.j ^ C.g]);try {H["zbNLn"]("tCuMr", H["gBDEx"]) ? (G = "symbol" !== typeof o ? s + '' : u,N = {},N["enumerable"] = !0,N["configurable"] = !0,N["writable"] = !0,N["value"] = void 0,v in w ? I["BbJsM"](x, B, C, N) : D[E] = void 0) : J["bind"](C)(G.j)} catch (N) {if (J = C.h[H["aYteo"](97, C.g)],H["GRFey"](0, J["length"]))C.h[H["aYteo"](155, C.g)] = N,K = J["pop"](),C.h[133 ^ C.g] = J["pop"](),C.h[H["LoecI"](9, C.g)]["splice"](K);elsethrow N}}}}(F)());return C.h[B[ih(1446)](135, C.g)]}(),this.h[B["ckUij"](133, this.g)] = D,this.h[B["EfMnC"](20, this.g)]
}

给自己留个备注:  暂时没看到解密出来的明文数据,需要进一步分析

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C++ 网络协议] 异步通知I/O模型

1.什么是异步通知I/O模型 如图是同步I/O函数的调用时间流&#xff1a; 如图是异步I/O函数的调用时间流&#xff1a; 可以看出&#xff0c;同异步的差别主要是在时间流上的不一致。select属于同步I/O模型。epoll不确定是不是属于异步I/O模型&#xff0c;这个在概念上有些混乱&a…

软件设计师_数据库系统_学习笔记

文章目录 3.1 数据库模式3.1.1 三级模式 两级映射3.1.2 数据库设计过程 3.2 ER模型3.3 关系代数与元组演算3.4 规范化理论3.5 并发控制3.6 数据库完整性约束3.7 分布式数据库3.8 数据仓库与数据挖掘 3.1 数据库模式 3.1.1 三级模式 两级映射 内模式直接与物理数据库相关联的 定…

作为SiteGPT替代品,HelpLook的优势是什么?

在当今快节奏的数字化世界中&#xff0c;企业不断寻求创新方式来简化运营并增强客户体验。由于聊天机器人能够自动化任务、提供快速响应并提供个性化互动&#xff0c;它们在业务运营中的使用变得非常重要。因此&#xff0c;企业越来越意识到像SiteGPT和HelpLook这样高效的聊天机…

大型项目开发设计文档规范

目录 一、 需求文档分析 二、 需求分析 1.交互层分析 2.功能需求分析 3.数据分析 4.兼容性分析 5.非功能性分析 三、 系统现状分析 1. 判断要开发的功能属于哪个模块&#xff0c;需要与哪几个模块联动&#xff1f; 2. 要开发的功能属于新接口开发&#xff0c;还是既有…

7.3 调用函数

前言&#xff1a; 思维导图&#xff1a; 7.3.1 函数调用的形式 我的笔记&#xff1a; 函数调用的形式 在C语言中&#xff0c;调用函数是一种常见的操作&#xff0c;主要有以下几种调用方式&#xff1a; 1. 函数调用语句 此时&#xff0c;函数调用独立存在&#xff0c;作为…

用于时间触发的嵌入式软件的IDE

TTE Systems的RapidiTTy IDE为希望创建“时间触发”微控制器软件以提高整体系统可靠性的开发人员提供了一个独立的环境。RapidiTTy&#xff08;下面的图1&#xff09;旨在解决深度嵌入的应用&#xff0c;包括医疗&#xff0c;国防&#xff0c;汽车和工业部门以及白色和棕色商品…

结合Mockjs与Bus事件总线搭建首页导航和左侧菜单

结合Mockjs与Bus事件总线搭建首页导航和左侧菜单 一、前言二、Mock.js的使用2.2.安装与配置2.2.引入Mock.js2.4.Mock.js的使用 三、Bus事物总线3.1.首页导航栏与左侧菜单搭建 ) 一、前言 Mock.js 是一个前端开发中常用的模拟数据生成工具。使用 Mock.js 可以方便地在前端开发…

Android 命令行工具简介

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关工具3.1 Android SDK 命令行工…

前端开发网站推荐

每个人都会遇见那么一个人&#xff0c;永远无法忘却&#xff0c;也永远不能拥有。 以下是一些可以用来查找和比较前端框架的推荐网站&#xff1a; JavaScript框架比较&#xff1a; 这些网站提供了对不同JavaScript框架和库的详细比较和评估。 JavaScripting: 提供了大量的JavaS…

MySQL的内置函数

文章目录 1. 聚合函数2. group by子句的使用3. 日期函数4. 字符串函5. 数学函数6. 其它函数 1. 聚合函数 COUNT([DISTINCT] expr) 返回查询到的数据的数量 用SELECT COUNT(*) FROM students或者SELECT COUNT(1) FROM students也能查询总个数。 统计本次考试的数学成绩分数去…

Java集成Onlyoffice以及安装和使用示例,轻松实现word、ppt、excel在线编辑功能协同操作,Docker安装Onlyoffice

安装Onlyoffice 拉取onlyoffice镜像 docker pull onlyoffice/documentserver 查看镜像是否下载完成 docker images 启动onlyoffice 以下是将本机的9001端口映射到docker的80端口上&#xff0c;访问时通过服务器ip&#xff1a;9001访问&#xff0c;并且用 -v 将本机机/data/a…

vue造轮子完整指南--npm组件包开发步骤

一、项目包文件的创建和初始化。 1. 新建项目包。 vue create <Project Name> //用于发布npm包的项目文件名 ps:一般选择自定义&#xff0c;然后不需要Vuex和Router&#xff0c;其他选项按自己实际情况选择安装即可。 2.修改原始src文件名、新增组件项目存放文件和修改…

【vue3】Suspense组件和动态引入defineAsyncComponent的搭配使用

假期第五篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 在app中定义子组件child //静态引入&#xff0c;网速慢的时候&#xff0c;父子组件也是同时渲染出来 <template><div><h3>APP父组件</…

【Python】返回指定时间对应的时间戳

使用模块datetime&#xff0c;附赠一个没啥用的“时间推算”功能(获取n天后对应的时间 代码&#xff1a; import datetimedef GetTimestamp(year,month,day,hour,minute,second,*,relativeNone,timezoneNone):#返回指定时间戳。指定relative时进行时间推算"""根…

【C++进阶】二叉搜索树

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

Android自动化测试之MonkeyRunner--从环境构建、参数讲解、脚本制作到实战技巧

monkeyrunner 概述、环境搭建 monkeyrunner环境搭建 (1) JDK的安装不配置 http://www.oracle.com/technetwork/java/javase/downloads/index.html (2) 安装Python编译器 https://www.python.org/download/ (3) 设置环境变量(配置Monkeyrunner工具至path目彔下也可丌配置) (4) …

【人工智能导论】线性回归模型

一、线性回归模型概述 线性回归是利用函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。简单来说&#xff0c;就是试图找到自变量与因变量之间的关系。 二、线性回归案例&#xff1a;房价预测 1、案例分析 问题&#xff1a;现在要预测140平方的房屋的价格&…

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理③

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理③ 第十八章 Linux系统对中断的处理 ③18.5 编写使用中断的按键驱动程序 ③18.5.1 编程思路18.5.1.1 设备树相关18.5.1.2 驱动代码相关 18.5.2 先编写驱动程序18.5.2.1 从设备树获得 GPIO18.5.2.2 从 GPIO获得中断号18.5…

Redis Cluster集群运维与核心原理剖析

文章目录 Redis集群方案比较哨兵模式高可用集群模式 Redis高可用集群搭建Java操作redis集群Redis集群原理分析槽位定位算法跳转重定位Redis集群节点间的通信机制集中式gossipgossip通信的10000端口 网络抖动Redis集群选举原理分析集群脑裂数据丢失问题集群是否完整才能对外提供…

Node18.x基础使用总结(二)

Node18.x基础使用总结 1、Node.js模块化1.1、模块暴露数据1.2、引入模块 2、包管理工具2.1、npm2.2、npm的安装2.3、npm基本使用2.4、搜索包2.5、下载安装包2.6、生产环境与开发环境2.7、生产依赖与开发依赖2.8、全局安装2.9、修改windows执行策略2.10、安装包依赖2.11、安装指…