共计 1537 个字符,预计需要花费 4 分钟才能阅读完成。
小红书的 shield 参数的算法计算是在 libshield.so 中,所以咱们要从这个 so 文件剖析。
先抓个包看看。
算法源码截图在最下方 … 能够作为参考!
用 ida 加载 libshield.so 文件,通过 Jni_load 找到函数偏移
image.png
其中 sub_2e1f4 是对 app 的签名进行验证,间接 nop,sub_736B0 是通过 jni 调用 java 的 okhttp 类的一些办法。sub_7306 是动静注册的函数。
!
image.png
找到地址 off_8E0D0,各个函数地址如图所示。
!
image.png
剖析各个函数的作用
initializeNative 函数
![上传中 …]
image.png
image.png
initializeNative 函数是对 jni 调用 java 办法的一些类进行初始化操作,倡议对变量进行改名,类用 c_结尾,办法用 m_结尾便于后续剖析。
initialize 函数
image.png
initialize 函数是从 s.xml 文件中读取 key 为 main_hmac 的值 value。
image.png
把读取的 value 应用 sub_AAAC 函数进行传参,sub_AAAC 函数的次要性能是对 value 和 device_id 进行 aes 失去一个 key,把 key 存入 ptr + 0x28C 处,如果 sub_AAAC 返回值为 1,则应用新版的 shield 算法,反之则应用旧版的 s1-s12 算法。
intercept 函数
intercept 是 shield 算法的逻辑局部,
image.png
通过 ptr+650 的值来判断应用哪种算法,sub_ABB8 为新版,sub_AD14 为旧版
!
image.png
sub_1fbb0 函数对 sub_AAAC 函数的 key 进行异或 0x36 和 0x5c,这里大胆猜想 shield 应用的是 hmacmd5 算法,sub_1fbb0 是对 key 进行初始化,sub_1fc52 是对 url 进行 md5,sub_1fc7e 是对后面两步进行收尾工作计算出真正的 shield。
image.png
像这种 a1+12 是一个函数指针我是通过动静调试失去函数地址。应用的是魔改的 md5。
AES Decrypt 办法
![image.png
AES Encrypt 办法
image.png
在加解密过程中,加密用 Tbox1-4,解密用 Tbox5-8,前 9 轮用 T,最初一轮用 Sbox。
至此 initialize 函数剖析实现。
接下来看看 intercept 函数,通过调试得悉程序走这个分支
image.png
首先看 105B0 这个函数,该函数次要对申请数据进行 MD5 运算。
image.png
MD5 Update 函数
image.png
进入 sub_404E8 函数,初始化构造,保存信息,这里动态没看出什么来,动静调调看吧
image.png
持续对数据进行解决,看字符串相干信息猜了个大略函数性能
image.png
对解决实现后的数据进行加密。
初始化加密表
image.png
加密函数,就简略的异或操作
![image.png
对加密后的数据进行解决,依据相干字符串猜想,具体数据调试看。
image.png
最初对解决实现的数据 base64 编码并拼接 XY 就是 shield 的值了。
image.png
image.png
最终取得新版的 shield,算法还原如下,局部代码比拟敏感,未放进去
image.png
接触过 shield 算法的大略都晓得,它分为 s1-s12,这里就呈现了很显著的特色
对于 shield 的剖析到此为止,心愿各位朋友把这篇帖子能当做一个参考吧,算法源码欢送私信交换或者在评论区留下你的疑难!
花了很大精力和工夫,把小红书最新版 7.6 版本 shield 转成了 python 源代码。
image.png
image.png
欢送一起交流学习;ping0206guo