李恒道 发表于 2022-4-18 09:45:08

【工程实战篇】乱杀学起Sign加密

# 开篇
这节课主要负责简单逆向出来学起的sign加密
首先的任务是跑通,后续我们会逐步附加各种其他内容来确保加密的正确性
首先抓包学校列表
```
https://xueqiplus.chinaedu.net/aliothprovider/router
```
提交内容是
appKey=00000001&format=json&v=1.0&timestamp=时间戳&ns=&service=alioth.login.customer.listValid&deviceCode=2&tenantCode=&sign=sign加密
我们需要破解的就是sign加密
这时候我们在header里发现了一些有意思的东西
![图片.png](data/attachment/forum/202204/18/093338moeb11j9pwekjbmj.png)
可以看到Referer是一个链接
那么就可以推测出学起app不是一个传统的app
而是一个软件包裹页面,提供一些系统级api的封装app
类似于超星app的技术
我们直接访问这个网址
![图片.png](data/attachment/forum/202204/18/093535eci6wh6tshactnkt.png)
发现可以正常抓包和调试
不用使用MT管理器逆向了!
摔,我他妈研究半天学起App
![图片.png](data/attachment/forum/202204/18/093607z8crccrmp3pr2v63.png)
查看堆栈发现created和schoolListReq非常可疑
一个是创建,另外一个可能是调用菜单post的函数
我们堆栈追送schoolListReq
![图片.png](data/attachment/forum/202204/18/093719pont6r60rrttkfe2.png)
可以看到这里有一个n.request,提交参数是service,deviceCode,tenantCode
打个断点,然后继续这个函数里走
![图片.png](data/attachment/forum/202204/18/093806j5fafe0415y19ai0.png)
根据多次调试确定最后一行return生成加密
倒数第二行的u暂时不确定到底干啥的,我们先忽略,跑通基本的加密
![图片.png](data/attachment/forum/202204/18/093846fsgsgegashgm3nsg.png)
最后一行的return函数继续往里走,发现里面有一个e.request
提交的数据是data,应该是json字符串化一下
字符串了什么?
对h函数传入了n,r,d,并且得到了返回内容
所以h函数很有可能是加密函数
我们控制台打印一下看看
![图片.png](data/attachment/forum/202204/18/094101oz2hzc66zj9hfg9r.png)
可以看到内部生成了sgin加密
继续往里跟
![图片.png](data/attachment/forum/202204/18/094129iiiox3k9xxkdikii.png)
根据调试是g函数生成了加密,继续跟
![图片.png](data/attachment/forum/202204/18/094156fqy5aksgsa5gk2ko.png)
这里根据调试是m(u,n)生成了sign加密
在sign的时候打印一下u
发现他混合了上方的数据,观察一下应该是这里的
![图片.png](data/attachment/forum/202204/18/094307w77htfjn3pbjyjph.png)
可以基本确定appKer,format,v,timstamp基本固定了,ns未知先不管
继续往里追
![图片.png](data/attachment/forum/202204/18/094406u2338rroobec3t06.png)
这里是通过u函数生成sign加密
我们先读一下上方的代码
```
i.forEach((function(t) {
                a.push({
                  key: t,
                  value: e
                })
}

            a.sort((n = "key",
            function(e, t) {
                var i, a;
                if ("object" === Object(s.a)(e) && "object" === Object(s.a)(t) && e && t)
                  return (i = e) === (a = t) ? 0 : Object(s.a)(i) === Object(s.a)(a) ? i < a ? -1 : 1 : Object(s.a)(i) < Object(s.a)(a) ? -1 : 1;
                throw "error"
            }
            )),
```
可以发现是遍历对象,然后投入key和value做对应的值
然后进行了sort排序
排序代码太乱了,所以这里就不看了
可以直接复制粘贴一下
```
let list = [];
let listkeys = Object.keys(obj);
listkeys.forEach(function (t) {
    list.push({
      key: t,
      value: obj,
    });
});
    list.sort(function (e, t) {
    var i, a;
    if ("object" === "object" && "object" === "object" && e && t)
      return (i = e["key"]) === (a = t["key"])
      ? 0
      : "undefined" === "undefined"
      ? i < a
          ? -1
          : 1
      : "undefined" < "undefined"
      ? -1
      : 1;
    throw "error";
});
```

这里我直接对特殊的字符和内容做了替换,没有进行其他处理
接下来观察最后的调用函数
![图片.png](data/attachment/forum/202204/18/094714mhodt1uteu6g1t85.png)
a是我们的数组
而t存在则传e,不存在则是c.e的默认字符
我们观察一下u
![图片.png](data/attachment/forum/202204/18/094837de7dfrr192cf7df1.png)
```
            var n = "";
            n += t;
            for (var i = 0; i < e.length; i++)
                n = n + e.key + e.value;
```
这里首先n+t字符串,然后把所有的key和value做了一个累加
紧接着调用了return 函数
他的return函数是一个函数嵌套函数嵌套函数的情况
这种我推荐分而治之
就是根据路径逐渐拆开第一个函数
第二个函数
第三个函数
第四个函数
![图片.png](data/attachment/forum/202204/18/095123tg3v3chnhwggzudl.png)
然后把代码贴进去,缺什么补什么,然后继续反复测试
没事打印一下结果
确保内容和代码跑的一致即可
最后跑通了sign
根据测试与app一致
![图片.png](data/attachment/forum/202204/18/095239oc2p8zbwt180tg2z.png)
app结果
![图片.png](data/attachment/forum/202204/18/095253lkfmfqknhdfd8qo3.png)
那么我们就基本实现sign解密了
# 结语
撒花~

发表于 2022-4-18 09:48:21

ggnb!!!每日学习

李恒道 发表于 2022-4-18 10:44:59

雯 发表于 2022-4-18 09:48
ggnb!!!每日学习

哥哥牛逼!{:4_110:}

Ne-21 发表于 2022-4-18 11:04:19

跟着道总混,三天搞死一个app

李恒道 发表于 2022-4-18 11:34:47

Ne-21 发表于 2022-4-18 11:04
跟着道总混,三天搞死一个app

主要大部分的app的加解密做的比较简单
只是正向开发麻烦
逆向的难度其实还好

wwwwwllllk 发表于 2022-5-8 11:25:27

ggnbggnbggnp
页: [1]
查看完整版本: 【工程实战篇】乱杀学起Sign加密