HONGLINCHEN 发表于 2021-9-14 09:58

xhs小红书shield算法逆向分析记录 小红书新版shield逆向

​本次逆向xhs版本:7.6.0版本。
小红书的shield参数的算法计算是在libshield.so中,所以我们要从这个so文件分析。
先抓个包看看。
https://img-blog.csdnimg.cn/20210913151821699.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQW5kcm9pZC3pgIblkJE=,size_20,color_FFFFFF,t_70,g_se,x_16data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==​
用ida加载libshield.so文件,通过Jni_load 找到函数偏移1、 通过Jni_load 找到函数偏移
​ 定位到jni_load 函数,跟踪函数sub_A654。如图
https://img-blog.csdnimg.cn/img_convert/8eae0a5aae0a04b9ffd43a8e449311b7.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
其中sub_2e1f4 是对app的签名进行验证,直接nop,sub_736B0 是通过jni调用java的okhttp类的一些方法。sub_7306 是动态注册的函数。
https://img-blog.csdnimg.cn/img_convert/db1afe615be34d27b81c67f19038884c.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
找到地址off_8E0D0,各个函数地址如图所示。
https://img-blog.csdnimg.cn/img_convert/c43c8412fdf42352e5aa7303bd6af263.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==2、分析各个函数的作用
2.1 initializeNative函数
https://img-blog.csdnimg.cn/img_convert/916c4af67fbeb2d48c2c9fa73620cc46.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
initializeNative函数是对jni调用java方法的一些类进行初始化操作,建议对变量进行改名,类用c开头,方法用m开头便于后续分析。
2.2 initialize 函数
https://img-blog.csdnimg.cn/img_convert/686a41d3ce69c6f00a806474c957ef30.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
initialize 函数是从s.xml文件中读取key为main_hmac的值value。
https://img-blog.csdnimg.cn/img_convert/729d21e0e38d6d7016d49e07bc1ef59d.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
把读取的value使用sub_AAAC函数进行传参, sub_AAAC 函数的主要功能是对value和device_id 进行aes得到一个key,把key存入ptr + 0x28C 处, 如果sub_AAAC返回值为1,则使用新版的shield算法,反之则使用旧版的s1-s12算法。2.3 intercept函数
intercept 是shield算法的逻辑部分,
https://img-blog.csdnimg.cn/img_convert/15d3a02a35a3f84d853255f3e33e0b79.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
通过ptr+650的值来判断使用哪种算法,sub_ABB8为新版,sub_AD14为旧版。
https://img-blog.csdnimg.cn/img_convert/236d66163bf2fd0859eb895df8560534.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
sub_1fbb0函数对sub_AAAC 函数的key进行异或0x36和0x5c,这里大胆猜测shield使用的是hmacmd5算法,sub_1fbb0是对key进行初始化,sub_1fc52是对url进行md5,sub_1fc7e是对前面两步进行收尾工作计算出真正的shield。
https://img-blog.csdnimg.cn/img_convert/83d9434d831f8693a512c7af936c31a3.png​data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
像这种a1+12 是一个函数指针我是通过动态调试得到函数地址。使用的是魔改的md5。
3、算法还原
3.1 算法流程
1、result = md5((key ^ 0x36) + param)
2、shield = md5((key ^ 0x5c) + result)
aes部分的算法暂时没进行还原,md5的部分使用c语言进行了还原,本来想移植到python的,但是python没有无符号等数据类型,每一次操作都要进行&0xFFFFFFFF,心态有点爆炸,所以编译了一个shield.so供python调用,最终完成图如下:
md5的参数为(urlpath+xy-common-params+xy-platform-info) (ps:urlpath 需要去掉? 比如urlpath为: /api/sns/v6/homefeed?oid=homefeed_recommend,传入的为/api/sns/v6/homefeedoid=homefeed_recommend)
最后花了很大功夫 转成了python源代码。
最终结果如下图
https://img-blog.csdnimg.cn/20210913152731868.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQW5kcm9pZC3pgIblkJE=,size_20,color_FFFFFF,t_70,g_se,x_16data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==​
欢迎一起交流学习!​

rhol 发表于 2021-9-20 11:06

小红书7.6.0版本没看到libshield.so这个文件啊?

HONGLINCHEN 发表于 2021-9-22 13:18

shayu2021 发表于 2021-9-19 15:33
这个用易语言或者PHP怎么写出来啊

我这有py的 java的源码。没有转php   你可以自己转

xiongchao 发表于 2021-9-17 13:23

哈哈哈.......

shayu2021 发表于 2021-9-19 15:33

shayu2021 发表于 2021-9-27 12:11

HONGLINCHEN 发表于 2021-10-12 09:49

shayu2021 发表于 2021-9-27 12:11
谢谢,有地址吗

加q私聊我把

Design 发表于 2021-10-31 23:06

rhol 发表于 2021-9-20 11:06
小红书7.6.0版本没看到libshield.so这个文件啊?

在 xypasxx的so 里,加了壳的

Design 发表于 2021-10-31 23:07

大佬咋修复so 壳的呢

rhol 发表于 2021-11-1 01:17

Design 发表于 2021-10-31 23:06
在 xypasxx的so 里,加了壳的

蟹蟹。我找找
页: [1] 2
查看完整版本: xhs小红书shield算法逆向分析记录 小红书新版shield逆向