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

news2024/11/24 9:02:27

前言

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"]();
        else
            e(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);
        else
            e("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);
                                         else
                                             throw 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.coloradmin.cn/o/1044235.html

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

相关文章

多线程和并发编程(6)—并发编程的设计模式

优雅终止 如何优雅终止线程&#xff1f; 中断线程的思路是使用两阶段法&#xff1a;第一阶段发生中断请求&#xff0c;第二阶段根据中断标识结束线程&#xff1b; public class Test1 {private volatile static boolean interrupted false;public static void main(String[…

生信教程:使用全基因组SNP数据进行ABBA-BABA分析

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 ABBA BABA 统计&#xff08;也称为“D 统计”&#xff09;为偏离严格的分叉进化历史提供了简单而有力的测试。因此&#xff0c;它们经常用于使用基因组规模的 SNP 数据&#xff08;例如来自全基因组测序或 RADseq&#xf…

monkeyrunner环境搭建和初步用法

一、打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器&#xff0c;不然monkeyrunner无法连接设备。 用Elipse打开Android模拟器或在CMD中用Android命令打开模拟器。这里重点讲一下在CMD中用Android命令打开模拟器 命令&#xff1a;emulator -avd test &#xff08;注…

使用ElementUI结合Vue完善主页的导航菜单和书籍管理以及后台数据分页查询

目录 动态树 数据表 案列 书籍管理 动态树 动态树&#xff08;Dynamic tree&#xff09;是一种数据结构&#xff0c;它可以在树中动态地插入、删除和修改节点。与静态树不同&#xff0c;静态树的节点是固定的&#xff0c;一旦构建完成就无法再进行修改。而动态树可以在运行时…

中间件 - 分布式协调服务Zookeeper

目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…

Learn Prompt- Midjourney案例:Logo设计

Logo设计是一个充满挑战的任务&#xff0c;因为Logo是品牌重要价值的浓缩。 快速开始​ 直接使用logo design for...来获取灵感。 备注 图像中生成文字在Midjourney中的效果还不是很好&#xff0c;但你可以用Canva编辑图片并替换自己的文字。 在提示中使用那些擅长你所寻找的…

02-Zookeeper实战

上一篇&#xff1a;01-Zookeeper特性与节点数据类型详解 1. zookeeper安装 Step1&#xff1a; 配置JAVA环境&#xff0c;检验环境&#xff1a; java -versionStep2: 下载解压 zookeeper wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeepe…

大数据安全 | 【实验】仿射加密

文章目录 &#x1f4da;实验目的&#x1f4da;关于仿射加密&#x1f525;使用暴力破解的方式对仿射加密进行破解&#xff0c;还原明文&#x1f525;使用词频统计的方式对仿射加密进行破解&#xff0c;还原明文&#x1f525;在同一运行环境下&#xff0c;对比两种破解方式所需的…

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略

LLM之Colossal-LLaMA-2&#xff1a;Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读&#xff1a;2023年9月25日&#xff0c;Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节&#xff0c;主要核心要点总结如下: >> 数据处…

融合之力:数字孪生、人工智能和数据分析的创新驱动

数字孪生、人工智能&#xff08;AI&#xff09;和数据分析是当今科技领域中的三个重要概念&#xff0c;它们之间存在着紧密的关联和互动&#xff0c;共同推动了许多领域的创新和发展。 一、概念 数字孪生是一种数字化的模拟技术&#xff0c;它通过复制现实世界中的物理实体、…

应用在手机触摸屏中的电容式触摸芯片

触控屏&#xff08;Touch panel&#xff09;又称为触控面板&#xff0c;是个可接收触头等输入讯号的感应式液晶显示装置&#xff0c;当接触了屏幕上的图形按钮时&#xff0c;屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置&#xff0c;可用以取代机械式的按钮面板&…

数据库存储引擎和数据类型详细介绍

目录 一、数据库存储引擎&#xff08;了解&#xff09;1.了解MySQL体系结构2.存储引擎&#xff08;了解&#xff09;2.1.存储引擎的介绍2.2.存储引擎分类2.3.如何选择引擎&#xff1f; 3.事务控制语言(TCL)事务的四个特性(ACID) 二、数据类型&#xff08;了解&#xff09;1.整型…

【文献】TOF标定 Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair

文章目录 Article info.Introduction处理TOF误差Take home messagesResourcesIDEAS Article info. Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 37, NO. 7, JULY 2015 Intr…

(一)连续随机量的生成-加权重采样

加权重采样 import numpy as np import matplotlib.pyplot as plt# Step 1: Generate 10,000 random theta values from U([0, 1]) n 10000 theta_values np.random.rand(n)# Define the function to compute weights for a given theta def compute_weight(theta):return (…

SQLAlchemy列参数的使用和query函数的使用

目录 Column常用参数 代码演示 代码刨析 query函数的使用 基本用法 常见用法示例 查询所有记录 根据条件查询 查询第一条符合条件的记录 查询特定列的值 添加排序规则 使用聚合函数 连接查询 使用filter_by Column常用参数 primary_key&#xff1a;True设置某个字…

当蛋白质成为儿童的敌人:应对蛋白过敏的挑战

儿童时期是充满欢笑和探索的时光&#xff0c;但对某些孩子来说&#xff0c;它可能伴随着一项不太受欢迎的挑战——蛋白过敏。在这篇文章中&#xff0c;我们将探讨蛋白过敏的现象、挑战以及如何在这个过程中为孩子提供支持。 蛋白质过敏&#xff1a;小儿的无情敌人 蛋白质过敏…

flink的序列化基准测试

背景&#xff1a; flink提供了在本地环境使用jmh测试不同序列化方法的性能差异&#xff0c;本文就是基于这个https://github.com/apache/flink-benchmarks这个性能测试&#xff0c;总结几个结论&#xff0c;以便后面使用时避免掉坑 基准测试 我们本次运行的是SerializationF…

2023 年解锁网络安全即服务

在当今快速发展的数字世界中&#xff0c;强大的网络安全机制的重要性怎么强调都不为过。对于越来越多地发现自己成为网络威胁焦点的小型企业来说尤其如此。 那么&#xff0c;“网络安全即服务”到底是什么&#xff1f;为什么它对小型企业至关重要&#xff1f; 网络安全即服务…

【RocketMQ】(八)Rebalance负载均衡

消费者负载均衡&#xff0c;是指为消费组下的每个消费者分配订阅主题下的消费队列&#xff0c;分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息&#xff0c;这里针对集群模式&#xff0c;因为广播模式&#xff0c;所有的消息队列可以被消费组下的每个消费者消费不…

服务断路器_服务雪崩解决方案之服务限流

服务熔断和服务隔离都属于出错后的容错处理机制&#xff0c;而限流模式则可以称为预防模式。 限流模式主要是提前对各个类型的请求设置最高的QPS阈值&#xff0c;若高于设置的阈值则对该请求直接返回&#xff0c;不再调用后续资源。 注意&#xff1a; 限流的目的是通过对并发访…