这个当时想了各种办法, 由于封装在 so 里面想了好久也没法解决. 后面在 csdn 看到一篇关于 hook 分析的, 让我打开了新世界的大门.
直接 HOOK 签名函数
截止到目前, 快手接口已经不需要 __NS_sig3 参数
建议先去看看 参考资料1 的原文, 本文不会过多的介绍寻找调用的位置
各位老板有这方面的需求(包括, 并不限于这些)可以滴滴我~
Xposed
自从手机换了 iPhone 再也没接触过安卓了, 不过 xposed 还是记得的. 以前刷好 CM 还得装各种插件, 各种模块 6 的起飞. 之前都是使用大佬写好的插件, 这次需要自己编写插件去 hook 函数
反 Xposed
比如你发现反编译时候函数是存在的, hook 时候遍历出来的函数表不一致的时候, 就需要考虑这个了
很多 App 都做了一些用来检测是否安装 Xposed , 是否 root 的机制, 所以我们要针对这些做一些处理 (如果做处理的话, 你并不能找到调用点)
- 目前推荐模拟器: 逍遥安卓 (方便多开, 备份, 可以成功隐藏)
- 检测是否隐藏插件 Xposed Checker
- 用来隐藏 Xposed Hider
最终就是要在 Xposed Hider 里面看到 0/11, 只要可信度不是 0, 都能被发现, 影响 hook
寻找到调用点
注意: 不同版本的客户端, 类以及函数名称可能不相同, 这里忽略寻找过程, 直接给出 Hook 点
com.kuaishou.android.security.a.a.a
以及函数名a
构造函数 a
的第一个参数比较复杂, 这里可以选择 hook 这个函数, 将第一次的值存储下来, 之后继续使用, 第二个参数为固定值 "0335"
函数 a
的参数为 com.kuaishou.android.security.kfree.c.i
, 和一个 String, 经过 Hook 断点参数为 请求地址的PATH 和 sig 参数拼接完成
剩下要做的就是去构造整 i, 来调用这个一个函数
寻找参数
随便找了一个调用点 (去除多余部分)
这里可以看到 "0335" 参数的来源, 以及 i 的调用过程
- 先调用 a 函数写入 appkey
- 在调用 a 函数的重载传入一个 null
- 再调用 b 函数, 3
- 再调用 b 函数的重载 传入需要被签名的参数 的 bytes
- 使用
- 调用
com.kuaishou.android.security.a.a
的a
函数, 传入 i 和 "0335" - 调用 i.j() 获取签名好的值
构造调用
只要搞清楚的调用顺序, 以及 hook 点, 剩下的就很简单了, 新建个 Xposed 工程开始撸
可以构造的值就自己构造, 比较复杂的值, 或者某些特殊的实例, 可以选择 hook 相关部分, 进行保存
对外提供接口
可以选用 MQ 或者 REST 接口对外提供签名服务, 我这里选的 MQ
后~
刚写完不就就几天, __NS_sig3 签名就不需要了, 比较郁闷
参考资料
[1]: 某手sig与__NS_sig3 hook分析(二) https://blog.csdn.net/qq_34581212/article/details/107003182