点点APP排行榜深度解析

413 阅读4分钟

逆向网址

aHR0cHM6Ly9hcHAuZGlhbmRpYW4uY29tL3JhbmsvYW5kcm9pZA==

加密参数定位分析(跟栈法):

1️⃣找到对应的数据接口,发现为请求类型为xhr,于是进行xhr断点

​编辑

2️⃣使用关键字“rank?”进行xhr断点后最终停留在如下页面中,并且找到了我们所需要的参数k,我们往上进行跟栈

​编辑

​编辑

3️⃣最终跟到了第一个异步栈前,发现我们所需要的加密参数k还在,那么我们就必须进行异步跟栈

​编辑

4️⃣在此处下一个断点,并释放之前的断点,翻译,进入这个异步栈当中,可以看到返回的是一个proxy代理的promise对象,我们接下来进行单步调试

​编辑

5️⃣可以看到对象l的arg恰好是一个promise的代理对象,说明刚刚的函数执行的l的arg参数的生成,我们在l = u(e,t,r)下一个断点,指导promise的代理对象完成。

​编辑

6️⃣再次观察网络监听器可以看到每次请求都会有一个genre的预检

​编辑

7️⃣我们刷新页面,在如下地方断下,并释放断点至右侧出现这个信息出现,说明已经步入到我们所需要的参数的生成

​编辑

​编辑

8️⃣我们继续进行单步调试,最终到达参数生成的位置,其中b = _(...)是主要的参数生成的位置

​编辑

9️⃣我们进入到_(...)函数中,发现进行加密的是f.encodeParams()函数,步入到f.encodeParams函数中

​编辑

​编辑

🔟其中l,s,f,u分别是固定的密钥,p为固定值10,m为aes的解密操作,根据这些函数,我们可以在node.js中进行复现,唯一不确定的便是密钥的生成,我们发现在翻页时,密钥是不变的。

​编辑

​编辑

​编辑

密钥的生成分析

1️⃣在上面的页面中往上继续跟栈,发现密钥存储在对象u当中,并且u不作为函数的参数传递,意味着u在之前就已经生成好啦,我们根据函数的作用域来寻找u

​编辑

2️⃣最终在如下位置找到u的生成位置,我们在此处下一个断点,并刷新界面

​编辑

3️⃣但是这里的u.default为undefined,我们用如下代码通过hook来锁定u.default的设置位置,并进行跟栈

​编辑

4️⃣可以看到u.default在这个位置进行赋值,但是state还未生成,跟栈发现走的是上面s的生成,猜测在set_U函数生成正式的参数,我们在set_U函数下断点,并跟栈

​编辑

5️⃣跟栈到最后发现a 是一个16为的随机数,n也是一个16为的随机数,i以sign_key签名为密钥,进行aes加密,最终生成64位数的字符串,而上述结果中的m则是解密出来位sign_key的字符串,因此,我们在js模拟中只需要请求sign_key参数即可。

​编辑

最终的js逆向代码:

​编辑

总结:本网站采用aes对称加密算法对登录的sign_key进行了加解密操作,sign_key可通过请求basic接口得到

​编辑

  • 所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用,并严格遵守相关法律法规,如《中华人民共和国网络安全法》。作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
  • 文章中涉及的程序或方法仅供安全研究与教学之用,严禁用于非法目的,如未经授权的入侵、破解等。若读者将信息用于其他非法用途,由读者承担全部法律及连带责任,相关方不承担任何责任。
  • 未经授权使用文章中的技术资料对任何计算机系统进行非法操作,由此产生的直接或间接后果和损失,均由使用者本人负责。