吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2940|回复: 26
上一主题 下一主题
收起左侧

[Web逆向] 某某猫投诉signature逆向-----------小白讲解08

  [复制链接]
跳转到指定楼层
楼主
Aircraftcomman5 发表于 2025-3-21 22:16 回帖奖励
本帖最后由 Aircraftcomman5 于 2025-3-21 22:24 编辑

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责

感谢各位大佬的观看

==============================================================
目标网址:aHR0cHM6Ly90b3VzdS5zaW5hLmNvbS5jbi9jb21wYW55L3ZpZXcvP2NvdWlkPTEwMDM2MDkmc2lkPTI2ODI4
==============================================================================

本文叙述思路
            抓包
            跟栈
             对比数据




:本文涉及到补环境 以及 加载器扣取 但在这里都不讲解,因为水平有限,还请各位大佬,自行搜索 这两个知识的相关文档



第一步
1.1 我们打开开发者工具 进行抓包

1.2我们打开数据包来看所需要扣取的参数  signature
1.2.1 其余参数我们可以一步一步跟栈看 是否为固定的,如果是动态的我们也需要一并扣取使用


1.3接着我们打开启动器 进入跟栈的第一步,根据1.1 发包我们来使断点生效




1.4  我们看到 参数找不到,a.data以及周围没有,相关参数,那么参数去哪了,
   在a里面,可以知道的是,有时参数的位置,会写在URL上,所以我们要多去,
     分析和观察,寻找到,(url内容大家可以自行去查看)


1.5那么由此就可以知道 我们接下来要找的就是 a里面的URL的生成位置,
           如果不确定加密的位置是不是在这个周围,我们可以在函数的头部下断,
            让断点在头部生效来查看是否有加密之后的参数传入,如果有说明,加密位置不在此处需要向上跟栈,
               如没有我们就可以缩小范围,在周围寻找



1.5.1 我们断住之后 查看到 我们要的参数 直接就在a里面,让我们不明所以,
         (打印完整数据大家可以自行在控制台查看),所以初步推测,
             密文没有在这里面生成而是在某个地方 传入的或赋值的,
                    那么我们就可以向上跟栈来寻找可以的地方

第二步
2.1 我们向上跟栈,在这个栈中我们发现,有许多,的参数,
        其中最最显眼的就是变量k,同样的为了验证加密是否在这里面生成,
             我们按照1.5.1 来在函数开头下断,查看密文是否由其他地方传入



2.2 我们按照1.1发包测试,我们发现 加密的参数 是由其他地方传入进来的,
      所以我们就知道,加密并不是在这里面形成的所以我们就需要再次向上跟栈

2.3  我们来到上一个站 名为  getComplaints  而显示的页面看到 这是一个巨大的函数 里面有很多
                  包括了 $.ajax  也就是我们现在的位置 ,而在$.ajax 我们可以看到有一个 url 经过前面我们知道加密内容被写在了 url上面 所以
                        我们来分析 url: "".concat(n, "?ts=").concat(c, "&rs=").concat(h, "&signature=").concat(r)


2.4 这很长的一堆 让人看的想吐  但是我们也发现了 "&signature=" 这个名字
       而我们要的 就是signature 所以我们选中看看里面是什么 ,总之很长 但我们可以想到的是 这是一个字符串拼接 而 加密在哪  
             在最后 也就是 r ,至于为什么 大家可以分别的去打印查看里面的值

2.5 但经过多次调试 最终是由 r 出的结果 ,所以我们目标明确了也就是 r

第三步
3.1在找寻r 之前 我们还要记得一件事 也就是 他的载荷 有许多值 最终也被拼接到 url 里面
           所以 我们先来看 其他参数是否为固定值 如果是 那我们 就可以 只扣取出 r 的代码 其余的就不看了

3.2 为了简易的介绍 我就直接总结出来了 就是上图 我们看到 我们需要扣取的有三个
               时间戳 会变换的字符串 在这里并不会去 演示调试 在找寻 r 的过程 就会出现   
                  所以我们现在要做的就是 在这个函数断点 因为我们还要验证 密文实在这附近出现还是 上一个栈传过来的

3.3 我们看到这个函数没有形参 也就是 不接受传值
          也就是说 密文 和 其余参数 就是在这里面 或者是 调用其余函数
                  那么接下来就需要我们单步调试 看他会 跳转到其他函数 还是怎样的过程,所以我们往下执行

3.4 依上图 我们断上断点 这是为了防止进入其他地方,出不来,做的保险,
          我们都先到第一个if 语句处看 条件 ,是false 那么他就会走 else ,所以我们单步调试

3.5我们单步调试 直到走到else语句处,在接着往下走之前我们来分析一下他在干什么,
       打眼一看 里面有个 r 他是否就是 2.5 分析的加密位置,我的逻辑就是 他们在同一个函数体内
            没有其他值出入 也就是只有这一个r 那么毫无疑问 他们就是一体的,所以我们执行到r 处查看 同时对比 数据包的载荷


第四步      4.1 我们对比出 他就是 我们要的数据密文 所以我们只要知道 这一串
           o([c, h, d, l, this.tabType, f, this.pageNum].sort().join(""))
                就能得到我们所需的密文

4.2 我们来查看这些值都是什么,这些都是经过多次调试的结果 大家可以自行调试看一看

4.3 最后的代码整理,我们整理完毕就会发现我们现在只要扣取出 o 就完成了signature 加密

第五步 5.1 我们开始寻找o,像上翻,我们来寻找,因为他是先定义后使用,完全不是凭空出来的

5.2 一直到最上面 找到 o的定义处,可以发现在我们的整理的代码内容,在这里开头,
           很相似,也可以说这些就是 那些值的定义处

5.3 那么我们就断在o 这里 去开始扣取 模块,但是这里不能选中 r(215)直接进入去扣取,
       因为在这里做了多次调试 发现 r(215),这个模块不完整,具体到哪里不完整,是因为他只有一半,
            这一半里面还加载了其他模块,然后拼           凑成一整个大模块,最后通过 r(215)全部
             加载出来使用


5.3.1我们还是进来r(215) 看一下,大家可以自己上下翻看,这个模块的全部内容虽然是加密 但不完成 内容也少的可怜,
            所以不能直接扣取我们需要单步执行,去查看在他加载 215 模块时之前 做了什么,从而最后完成出这一整个加密模块

5.4 所以我们在 o = r(215) 处 单步调试,在单步执行的时候 可以看到他经过加载器,
        最后又跑到了其他地方,那么我们就可以得出,我们在 5.3 讲的内容是对的 直接去扣取 215 会得到一半的加密,
          所以我们要根据浏览器的 步骤去扣取


5.5 所以我们需要先扣取上图 也就是 先经过的地方,再去扣取 215模块,但是奇特的就是 这里加载了一次216
          里面的内容就是我们在 5.3.1 跳转之后的位置 所以在此时 就有点清楚了  我们此时单步调试走的 就是 215 模块  
                  而5.3.1是 216模块 所以 浏览器加载的模块没错 而是跳转的位置会使我们扣取错误 也就是少扣取

第六步
6.1 讲解的差不多,大致意思就是 有时不能直接去选中加载模块直接跳转然后扣取,而是应该多次调试 查看他的完成使用流程,
        就如第五步讲的 如果我们直接选中跳转 去扣取那么就会导致我们 虽然补全了模块,但是最主要的模块会遗漏,导致虽说不报错,
             但会导致疑惑,或者迷一整天,所以我们回到主题,去扣取出这个模块

6.2 接着我们根据浏览器 调用 浏览器是 r(215),那我们在本地 就要是r(0),接着去运行代码,
             看报错,可以看到 是 429 ,我这个打印在前几章讲过 ,这里就不做赘述直接,我们在本地搜索 429 的位置


6.3 经过搜索,和查看 最符合的就是在加载器的尾部,为什么是这里,因为我们本地没有,
              429 模块,浏览器是有的 所以我们去浏览器看这个值是什么 r(r.s = 429) 这个等同于 r(429)
                    我们在浏览器找到之后下断 然后查看值 可以看到是一个 空对象 那么此时我们可以知道
                                 浏览器啥也没干 对于加载的这个 429 模块 所以我们在本地可以 直接删除



6.4 之后我们在打印 看报错 位置已经开始出现在我们扣取的模块里面了,
         所以我们就可以开始 补全缺失的模块了 , 这个216 模块我们在5.5分析了
            所以我们直接在o = r(215)就可以跳转到


6.5 所以我们接着打印看报错,可以看到打印了 38,那么我们就在本地搜索查看位置,
           接着我们返回浏览器,查看这个模块加载出来的值,可以看到在浏览器中这个模块属性是window
                      那么我们在本地就可以改写 这个模块 如 r(38) 替换为window




第七步
7.1 改完之后 接着运行看报错,可以看到已经不报错并且 打印出了值,那么我们就获取到了 signature

7.2 我们知道 我们的加密的参数是写死的所以其中我们要再找出 他们各自的参数的位置  
                       我们在 5.2 提前标注了几个位置 不仅有 o的位置 还有一些可疑的参数位置
                r = o([c, h, d, l, this.tabType, f, this.pageNum].sort().join(""))4.2 我们一个一个分析出了他们是什么 对应这里面 我们就只需要找到 h ,
                               他每次都会变换 在刷新时 所以我们来抓一次包 看一看是否会验证我们说的在刷新时变换

7.3 我们根据上图看到了 刷新前后刷新后的区别,rs 也就是 h是变化的,
                那么h在哪 我们在 5.2 标注了几个 哪里面就有h 也就是在多次调试才确定的
                     我们在h函数处下断看一看值(需要刷新才能断住)

7.4 我们根据上图 可以分析到 h 是一个自执行 里面内容就是 随机数再配上几个字符列表出值,
                那么我们断到return处 查看这一次出现的值 并且对比 载荷 看用的是不是这里

7.5 可以根据上图看到 确实是这里,那么我们将他扣取下来放入代码,
       并且根据 4.2 5.2 我们可以将代码补充完成,
          其中有些固定值大家可以根据自己喜好来 编写,到此我们就完



第八步  总结


我们依次的分析参数 和对比 数据包结果 最终得到了 signature 并且还 分析了rs 会变化的字符串 总的来说 模块的改写逻辑和跟踪逻相对简单 适合新手 去看和多调试




最后
           感谢大家观看
                          文章中还有些不足,还请大家,给出建议,请各位大佬可以直接指出我文章的少讲或错误逻辑给予指出和更正,感谢各位大佬

免费评分

参与人数 17威望 +2 吾爱币 +119 热心值 +15 收起 理由
AdAStra + 1 + 1 我很赞同!
hj170520 + 2 + 1 用心讨论,共获提升!
Issacclark1 + 1 谢谢@Thanks!
kelolado + 1 + 1 热心回复!
zhangliuer + 1 + 1 我很赞同!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
xhr2025 + 1 + 1 我很赞同!
xuyoung + 1 我很赞同!
Yao2903 + 1 + 1 用心讨论,共获提升!
FitContent + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
liuxuming3303 + 1 + 1 谢谢@Thanks!
wzh103103 + 1 我很赞同!
213xhy + 1 + 1 学习学习一下
beihai1314 + 1 + 1 我很赞同!
涛之雨 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Arcticlyc + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
helian147 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| Aircraftcomman5 发表于 2025-5-16 11:35 |楼主
hj170520 发表于 2025-5-16 06:18
您好!请问这个o = r(215)部分怎么打到断点,我在这个地方断不住

在o函数地方跟进去是一个
...

不能直接进  直接进他已经加载完了  你需要在他加载之前模块调用下断  然后单步你就知道  他怎样加载了
推荐
hj170520 发表于 2025-5-16 06:18
您好!请问这个o = r(215)部分怎么打到断点,我在这个地方断不住

在o函数地方跟进去是一个

[JavaScript] 纯文本查看 复制代码
1
2
3
4
5
_createHelper: function(e) {
    return function(t, r) {
        return new e.init(r).finalize(t)
    }
},


不知道是不是e.init(r)给到的启发,最后确定是一个webpack。麻烦您了!
沙发
littlewhite11 发表于 2025-3-21 23:12
3#
wzh103103 发表于 2025-3-21 23:39
太牛了 学习
4#
pw0n 发表于 2025-3-22 09:09
牛逼大佬
5#
schnappi2025 发表于 2025-3-22 12:36
大佬牛哇!思路太清晰了
6#
DJxiaojun 发表于 2025-3-22 23:52
从6.1就开始看不懂了 是不是因为我不会扣加载器代码  
7#
fpws 发表于 2025-3-22 23:55
又佬又肝,mark后面照着试试
8#
wjmzbmr 发表于 2025-3-23 09:06
学习了,对前端不太懂
9#
Yao2903 发表于 2025-3-23 15:52
授人以鱼的同时还授人以渔啊,没见过这么详细的的教程贴,膜拜大佬
10#
 楼主| Aircraftcomman5 发表于 2025-3-23 18:59 |楼主
DJxiaojun 发表于 2025-3-22 23:52
从6.1就开始看不懂了 是不是因为我不会扣加载器代码

加载可以自己试着扣取,导出使用,
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-18 12:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表