码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JS逆向实战27——pdd的anti_content 分析与逆向


    合集 - JS逆向实战(33)
    1.JS逆向实战1——入门难度 某省在线审批网站params 随机生成2022-08-282.JS逆向实战2--cookie——__jsl_clearance_s 生成2022-08-293.JS逆向实战3——某企业服务平台内容encrypt_data加密2022-08-294.JS逆向实战4——cookie 参数 acw_sc__v22022-08-295.JS逆向实战5--JWT TOKEN x_sign参数2022-09-206.JS逆向实战6-- x轴 y轴 过点触验证码2022-09-207.JS逆向实战7-- 某市链接params-DES加密2022-09-238.JS逆向实战8——某网实战2022-10-149.JS逆向实战9——cookies DES加密混淆2022-11-2810.JS逆向实战10——某集团RSA长加密2023-01-0411.JS逆向实战11——某金属集团动态cookie加密2023-02-2112.JS逆向实战12——某店 captchaToken 参数 加密2023-03-2513.JS逆向实战13——某市公共资源交易中心Cookie混淆加密2023-04-2414.JS逆向实战13.5——某小说网站 小说字数 和月票字体加密2023-05-1715.JS逆向实战14——猿人学第二题动态cookie2023-05-2616.JS逆向实战15——猿人学第五题 动态cookie乱码增强2023-05-3117.JS逆向实战16——猿人学第20题 新年挑战-wasm进阶2023-06-0718.JS逆向实战17——猿人学第七题 动态字体 随风漂移2023-06-0819.JS逆向实战18——猿人学第八题 验证码 - 图文点选2023-06-1420.JS逆向实战19——通杀webpack逆向2023-06-3021.JS逆向实战20——某头条jsvm逆向2023-07-0422.JS逆向实战21——某查查webpack密码加密2023-08-1523.JS逆向实战22——某政府采购网简单cookie反爬2023-08-3024.JS逆向实战26——某店ua模拟登陆2023-11-1625.JS逆向实战24—— 补环境过某房地产瑞数4.02023-10-1126.JS逆向实战25——某壳找房模拟登录+百度喵星人指纹加密破解.2023-10-3027.JS逆向实战23——某市wss URL加密+请求头+ws收发2023-10-0728.逆向实战28——补环境过瑞数602-01
    29.JS逆向实战27——pdd的anti_content 分析与逆向01-24
    30.逆向实战29——某度-某家号2024旋转验证码识别02-1131.逆向实战30——阿里227逆向分析02-2232.逆向实战31——xhs—xs算法分析02-2733.逆向实战32——某东最新h5st4.4算法分析02-29
    收起

    声明

    本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
    本文已在微信公众号发布

    目标

    网站

    aHR0cHM6Ly9tb2JpbGUucGluZHVvZHVvLmNvbS8=

    任务

    获取商品列表接口中的内容

    接口参数分析

    我们获取的接口。可能在web端出不来。所以我们切换成手机端。

    然后刷新网页。

    然后我们跟栈一步一步去找这个anti_content

    从第一个栈慢慢进就行了。

    断点到这里 就能看到 anti_content的值了 但是这个值好像并不是生成值的地方。继续往上找。
    走到异步方法里面。

    然后找到这个方法。

    发现这个方法只是个实例对象 没办法调用,但是我们因此知道了 这个方法。我们搜下这个方法试试

    看到一共有五个。我们去最后这个方法里面看看。不要问为什么只看最后一个。

    一步一步打断点 进入这个 n.getRiskControlInfoAsync()方法里面。
    然后再一步一步打断点(这是个过程,需要很有耐心 一步一追踪)


    最终发现anti_content的值。
    其实这个时候不难发现。这是个ob混淆啊。

    生成逻辑分析

    我们先不着急去扣代码。或者是干别的。我们先来看看他的生成逻辑。
    我们进入ne这个方法去看看里面的生成。

    这个方法 前面都是一些逻辑层的移位与混淆还有定义变量。这里就不分析了。
    这里我简单脱了一下混淆

    点击展开
    function ne() {
        function n(e, t) {
            return B(t, e - 1064)
        }
    
        var r = t["CTxCC"]
            ,
            a = (e = [])["concat"].apply(e, [W[r](), P[r](), C[r](),
     E[r](), I[r](), D[r](), T[r](), N[r](), R[r](), A[r](), L[r](), M[r](), 
    z[r]()].concat(function (e) {
                if (Array.isArray(e)) {
                    for (var t = 0, n = Array(e.length); t < e.length; t++)
                        n[t] = e[t];
                    return n
                }
                return Array.from(e)
            }(q[r]()), [F[r](), G[r](), Q[r](), H[r](), U[r](), V[r](), Y[r](), J[r](), X[r]()]));
    
        t["npRBP"](setTimeout, (function () {
                t["JSeyi"](ee)
            }
        ), 0);
        for (var c = a["length"]["toString"](2)["split"](""),
                 s = 0;
             t["iSDtI"](c["length"], 16); s += 1)
            c["unshift"]("0");
        c = c["join"]("");
        var u = [];
        t["hNmVQ"](a["length"], 0) ? u["push"](0, 0) : t["xfDub"](a["length"], 0) && t["HvucD"](a["length"],
     t["kbnzE"](t["YrazO"](1, 8), 1)) ? u["push"](0, a["length"]) : t["fBcAN"](a['length'], 
    t["kbnzE"](t["YrazO"](1, 8), 1)) && u["push"](d["parseInt"](c["substring"](0, 8), 2), 
    d["parseInt"](c["substring"](8, 16), 2)),
            a = []["concat"]([1], [1, 0, 0], u, a);
        var l = o["deflate"](a)
            , p = []["map"]["call"](l, (function (e) {
                return String["fromCharCode"](e)
            }
        ));
    
        function h(e, t) {
            return B(t, e - 1797)
        }
    
        return t["dhItA"](t["yQQNR"], i["encode"](t["dhItA"](p["join"](""), f["join"]("")), i["budget"]))
    
    }
    

    其实可以看到

    1. r获取a的切片值。 通过合并多个数组(其实这里都是cookie和一些指纹。),从而让a获取qr展开后的内容再次合并形成一个新的数组。
    2. 之前获得的新数组重新展开生成一个二进制的新字符串。并且添加了补长度功能。
    3. 根据a 和 u判断从而继续生成新数组
    4. 再根据新数组 重新添加某些值。并且进行了压缩操作。
    5. 压缩并且再生成字符串 然后进行编码生成anti_content。

    解决方案

    其实这个有两种思路。根据刚刚我提供的思路
    第一种:硬扣代码。
    难度较大
    第二种就是使用webpack去扣。其实也说不上来扣 全都抓取下来 然后补环境就行。

    至于为什么是webpack。往上翻就行了。

    首先这是一个一个模块。这就不多说了。
    再次再往上滑。看到加载器.

    然后把加载器和后面的列表全扣下来就行。
    然后全部扣下来之后。我们不要放到代码中运行。
    我们利用浏览器的这个片段。直接运行看看。

    ok 也能直接出结果 感觉长度的话也像那么回事。现在我们搞到代码里面慢慢补就行了。

    补环境


    这里呢首先第一个错就是Cannot use 'in' operator to search for 'ontouchstart' in undefined
    这还是个移动端事件
    手指触摸屏幕时触发,即使已经有手指在屏幕上也会触发。但是我们的代码中没有这个事件。所以就会报错。
    这是个监听事件。我们先加上监听事件。看看然后会不会报错

    document = {};
    document.addEventListener = function addEventListener(type, listener, options, useCapture){};

    然后发现就不报这个错了。

    然后就开始报另一个错
    根据网页API中所写 https://developer.mozilla.org/zh-CN/docs/Web/API/Screen/availWidth
    这个方法是返回浏览器窗口可占用的水平宽度(单位:像素)。
    但是这个是个方法 所以不能直接赋值 需要用方法的方式。

    window.screen = Screen = function () {
    return {
    availHeight: 1032,
    availLeft: 0,
    availTop: 0,
    availWidth: 1920,
    colorDepth: 24,
    height: 1080,
    isExtended: false,
    }
    }

    这个补完之后还有个报错。

    报错 Element 没有被定义。
    这里呢,官方解释是这样的:

    Element 是最通用的基类,Document 中的所有元素对象(即表示元素的对象)都继承自它。它只具有各种元素共有的方法和属性。更具体的类则继承自 Element。
    这个方法要补的其实不少。但是我们可以简单定义一个对象。后期需要什么就补什么

    Element = function(){}

    剩下的其实也就是一样。缺什么补什么 可以挂个proxy框架。很简单。大家可以自己试试,

    结果

    结语

    对了 总有人问我要代码。说实话很多人都是抱着白嫖的心思,问完就没有任何交集了。我感觉这样加好友说实话没啥意义。那与其这样,不如我挂个星球。大家想要代码 直接去里面拿。我也有收益,你也不会问的不清不楚。星球里遇到的问题我看见都会回答。

  • 相关阅读:
    prometheus中PromQL查询语言
    integrin + Receptor ; platelet ; Ig-CAM
    【系统稳定性】1.6 黑屏(三)
    《重磅发布 | 80+大屏&组件模板,即刻下载、快速构建应用!遥遥领先~》
    Hive的开窗函数和Rank
    Linux操作文档——seliunx、iptables、firewalld
    Jetbrains Fleet这十个快捷键,效率提高50倍
    C++ Reference: Standard C++ Library reference: Containers: list: list: size
    有哪些相见恨晚的stm32学习的方法?
    Java数据结构:前缀、中缀、后缀表达式与逆波兰计算器的实现
  • 原文地址:https://www.cnblogs.com/zichliang/p/17972465
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号