码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 逆向实战31——xhs—xs算法分析


    合集 - 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-0129.JS逆向实战27——pdd的anti_content 分析与逆向01-2430.逆向实战29——某度-某家号2024旋转验证码识别02-1131.逆向实战30——阿里227逆向分析02-22
    32.逆向实战31——xhs—xs算法分析02-27
    33.逆向实战32——某东最新h5st4.4算法分析02-29
    收起

    前言

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

    目标网站

    aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tLw==

    逆向分析

    打开网站

    这里 eyj这种开头的,做过正向的应该很熟悉。这明显是{ 大括号的base64编码啊。
    那这里我们尝试以下base64解码

    如上图 得到json值。
    通过hook json.Stringify() 定位加密点。

    点击展开
    (function() {
    var stringify = JSON.stringify;
    JSON.stringify = function(params) {
    console.log("Hook JSON.stringify ——> ", params);
    debugger;
    return stringify(params);
    }
    })();
    //或者下一个//
    (function () {
    var stringify = JSON.stringify;
    JSON.stringify = function () {
    if (arguments[0] && arguments[0]['payload']){
    debugger;
    }
    let temp = stringify.apply(this, arguments)
    return temp
    }
    })();

    然后我们需要注入到浏览器中去
    这里可以通过油猴脚本。或者手动注入。
    这里建议手动注入在发包之前注入。
    这里直接走第一个堆栈 跳过两个栈既可。


    然后往上找堆栈。


    l = (a && void 0 !== window._webmsxyw ? window._webmsxyw : encrypt_sign)(s, i) || {};

    这里可以看到这里有个三元表达式。
    调用 window._webmsxyw 传值 s和 i
    s: url切割的链接
    i: 传值的参数(get的undefined,post为data)

    然后继续往下面的栈走

    发现到了这个地方 可以发现这个文件是个jsvmp。
    那我们如何去解决这个JSVMP呢?
    这里呢,可以通过两种方式去解决了。

    1. 补环境
    2. 纯算

    补环境 分析

    这里滑到最上面

    可以看到。JSVMP是个自执行函数。那是不是代表。我们把这一整段代码。放到浏览器中可以正常运行呢?
    我们试试。


    可以看到可以正常运行。那后面就很简单了。
    把代码放到js中运行即可。
    这里直接运行。

    定义window。

    window = global;


    ok 又少createElement。

    document.createElement=function createElement(x) {
    return {}
    }

    这里简单的补完之后。

    好了又开始报缺少apply函数了。
    那我们就知道了 原来这个地方就是JSVMP所有指令集执行的地方。
    那这个点我们可以暂时记下来。虽然没什么用。但是在后续做纯算的时候可以做插桩。
    其实到这里包括后续的getAttribute 找起来很麻烦需要自己手动浏览器打断点。非常的麻烦。
    这里建议挂个proxy框架来补。
    这里不带着大家补了。
    最后补出来大概一百多行。
    包含canvas。regex校验等。

    纯算分析

    这里对于纯算的手撸和还原 可以看看志远佬的视频。真是让人收获颇丰。
    这里整体说一下完整算法呢,还是比较简单的、
    在手撸xs算法之前 先来了解一下什么是插桩。

    何为插桩

    有些时候我们想获取某个变量的值,看其如何变化!但是又不想每次都是断点之后再在控制台打印,
    那么有没有什么简便的办法呢?那就是插桩!
    插桩的主要应用场景就是在面对一个复杂的控制流时,可以通过插桩实现环境自吐。
    通过如下手段进行浏览器插桩。

    插桩查找

    这里在这个地方插桩。至于为什么上文补环境的时候已经说了。

    _ace_1ae3c(_ace_8712.apply(typeof _ace_25a6._ace_936 == "undefined" ? _ace_4752e : _ace_25a6._ace_936, _ace_bdcc), _ace_be07c, _ace_be07c, 0);

    这个地方插桩可以透露出很多的信息。因为这个地方是调用函数的地方。
    所以我们可以打印出一些内容。

    console.log(_ace_8712,_ace_25a6._ace_936,_ace_bdcc);false;

    这里是一个条件表达式。最后返回值是false。这是什么意思呢?
    意思是 在我们断住这个断点的时候需要执行一段JS。但是这个js不会因为什么情况而断住。
    好 然后我们放开断点。

    可以看到打印出了很多信息。这些信息大部分都是返回值。
    我们可以通过返回值得到很多有用的信息。
    这里我们从明文开始加密的地方开始断点。然后在刚刚打条件表达式的时候再打上一次断点。
    明文密文都有了。就可以分析加密的过程了。

    插桩分析


    如上图所示。打印出来大概2w多行代码。
    我们通过其中的逻辑(这里分析忽略)可知。
    传参得到payload的函数的传参由x1,x2,x3,x4拼接而成。
    x1为md5,
    x2为环境检测函数后函数的返回值可以写死。
    x3为cookie中的a1
    x4为时间戳。

    到这里。我们来捋一下整个的流程。
    目标:

    x-s 解密base64=> 得到 一段Json=> Json中Payload是我们需要加密的值。

    结果:

    由x1链接。x2定值。x3 cookie中的a1 以及x4时间戳拼接出来的字符串base64加密。再进行3des加密得到Payload。

    这里需要注意的是。分析全靠经验而言。

    1. 分析x1是md5。1732584193、271733879、1732584194、271733878
      上面的内容是需要大家熟记的内容,在解决MD5加密时能够给你带来不少的好处,节约大量的时间。
    2. 分析base64加密。这个就更简单了。常见的屁股后面==号。或者代码中带着 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
      这些。上述代码其实就是通过对于数组的移位生成的编码。
    3. 分析Des。不知道秘钥和IV没关系。尝试去插桩自吐出来的值扣除相应的iv或者key也能完成加密。

    结语

    这里江夏在星球也写了一份文章,底部有代码 感兴趣的可以看看

    https://articles.zsxq.com/id_qe1og69f8wa9.html

    无论是补环境还是硬扣算法。其实都阔以得到正常结果。不同的是运行速度以及花费的精力的成本不同。
    选择什么样的方法最后还是靠自己。

    最后运行。两者都能得到结果

    公众号链接
    星球链接

  • 相关阅读:
    深入解析:Symfony框架的配置文件组织结构
    玩转SQLite7:基本语法与数据类型
    【C++并发编程】(九)线程池
    2023年【公路水运工程施工企业安全生产管理人员】新版试题及公路水运工程施工企业安全生产管理人员模拟试题
    热忱与专业齐飞 | 微软最有价值专家项目,广纳微软技术贡献者!
    Ai创作系统ChatGPT网站源码+图文搭建教程+支持GPT4.0+支持ai绘画(Midjourney)
    Nginx中 配置文件 nginx.conf 详解
    【重拾C语言】四、循环程序设计(后判断条件循环、先判断条件循环、多重循环;典例:计算平均成绩、打印素数、百钱百鸡问题)
    OCI 发布了容器运行时和镜像规范!
    WINSOFT ComPort轻松连接到各种串行端口和连接设备
  • 原文地址:https://www.cnblogs.com/zichliang/p/18029666
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号