本文继续某red书参数逆向,接下来是x-s-common,x-s的逆向过程请转战某red书最新版x-s、x-s-common(上)
x-s-common就比较好找了,直接搜索就可以了
成功断住:
这里要注意了,断点是断在第二个x-s-common,上面的那个以及什么v.x8啊v.x9啊,那都不是我们要的代码,不要被误导了。我们需要的是上面的对象v。
{
"s0": 5,
"s1": "",
"x0": "1",
"x1": "3.7.8-2",
"x2": "Windows",
"x3": "xhs-pc-web",
"x4": "4.33.2",
"x5": "191db22440ad0nui1yqe2g8cb1pwchzthrlidt2z65000034",
"x6": 1725958356205,
"x7": "XYW_eyJzaWduU3ZuIjoiNTUiLCJzaWduVHlwZSI6IngyIiwiYXBwSWQiOiJ4aHMtcGMtd2ViIiwic2lnblZlcnNpb24iOiIxIiwicGF5bG9hZCI6IjJlNmJmNGQyZmU4ZmU1YjQzMzYwNTc4ZTU3MDE5YWEzY2FmM2NhNzBiYTg2NTEzMDgwZTg2ZDFkMDQ4YzNkNDhiNzQ0ODE1ZWQ5NTRhNjE5ZTMzZDU1OWQ4Yzk1YTRlYzI4NGVjZTg0OGIwZjRiOGY5MWU5M2M3MjhiYmY2NzFhODk0YzYzZmNmNDhhYWUwZTQ0YWEwNmZjNzZlOGYzNmM4OTMwODM1MGQ4MjMxOWRjYWFkNzljNmJjMjgyOGNmMDMxMWMxZTdmMGM0OGUxNDQwMTk4NzQ5MDE5ZDkyOWNjZjFjZjZkN2VmOTBjZGVkYzA4ODQ4Y2YxZTY0MzU1OTY4NjIyOWU0NTFlZGU5ZjY5MzdkNzVlOWUwN2EzYWQwZmZjN2U0MWVlYjdkZjg5MDFmODAyY2I4MTI3MTNlZDc0MGY5M2FiN2ZlY2M4MjYzYWFmN2UyNGQxZmE2ZDA1YWRlYjdhNGY4NjQxMjA4NWI1NGNlZDRhM2M2MTcyOWYyNTM2NWQzMDAxOGFmZmE0Zjg5YjMwYWU3NGRjNDA0Y2MyIn0=",
"x8": "I38rHdgsjopgIvesdVwgIC+oIELmBZ5e3VwXLgFTIxS3bqwErFeexd0ekncAzMFYnqthIhJeSnMDKutRI3KsYorWHPtGrbV0P9WfIi/eWc6eYqtyQApPI37ekmR1QL+5Ii6sdnoeSfqYHqwl2qt5B0DoIx+PGDi/sVtkIxdsxuwr4qtiIkrwIi/skcc3I3VvIC7sYuwXq9qtpFveDSJsSPwXIEvsiVtJOPw8BuwfPpdeTDWOIx4VIiu1ZPwbPutXIvlaLb/s3qtxIxes1VwHIkumIkIyejgsY/WTge7eSqte/D7sDcpipedeYrDtIC6eDVw2IENsSqtlnlSuNjVtIvoekqwMgbOe1eY2IESPIhhgQdIUI38P4Z88IizuBVwMIvGF4B6sdcNskVwVIC7eWo7sYeSqIk5eTDmjtuwjIhJs6Ads3SgeiVt/c9deYqwCICMyL/0efPwELfAsSqw+I3M/I3biBPwNgVwesBZ/yLOsYeOeVPwyIh7sjg6exmSuIENejlOe3dhkIiJsTVt0IkLdPuwJ2qw0ICvs6qwAIiNs3uw5Ikvsdqt5wuwLoVwDICikICGaJdI3JL7sTqwkIiYqIies6VtheSHzr75sjBMuIkWLwqtHZqw3Ivoe6VtUtsTutPcPtBIvoejVwiIi7ekb83ICKsfI==",
"x9": 897049888,
"x10": 11
}
首先解读一下v,s0到x4直接写死即可。
x5是从cookie中取的a1
x6是从headers中取的X-t,也就是时间戳,这个要注意,请求的时候要统一一下,
x7是x-s参数,上一篇文章已经生成
x8是从localStorage中取的,测试了会变,但是可以固定不影响请求
x9是 时间戳 + x-s + x8 拼接,然后传到encrypt_mcr函数生成返回的
x10则是 时间戳 + x-s,然后传到getSigCount函数生成返回的
所以我们需要先解决x9跟x10的生成逻辑
首先x9,断点断在encrypt_mcr,然后跳进去,单步执行。里面有一个
对象包含多个函数,进行了多次调用。而
对象包含多个函数,进行了多次调用。而
对象包含多个函数,进行了多次调用。而是J赋值的,J则在上面进行了赋值,所以这里不能单抠我们需要的函数,需要把外面这整个抠出
也就是这个:
然后encrypt_mcr依赖的其它函数如下图。就不一个一个解析了,反正就是缺少抠啥。
提示:iiiii函数就是i函数,不改名会冲突,望周知
前面说过了需要传时间戳 xs 跟x8的拼接值进来,上面只是做个演示,大家知道要传xs跟x8就行了,如上图就能拿到x9的结果。
然后是x10
x10比较简单,几行代码搞定。
最后就是x-s-common的生成逻辑了
encrypt_b64Encode(encrypt_encodeUtf8(stringify_default()(v)))
先把v对象转字符串,先传给encrypt_encodeUtf8,再传给encrypt_b64Encode就能拿到最终结果。
所以接下来就抠encrypt_encodeUtf8跟encrypt_b64Encode函数
首先是encrypt_encodeUtf8,其函数与所依赖函数如下图:
还是缺啥抠啥的逻辑,需要注意的是a0_0x4562函数中有个大数组,这个数组会在其它函数中做处理,位置会调换。所以如果你直接拿了原来的大数组是出不来结果的。
这里要么你去抠调换函数,要么去取最终生成的数组。我比较懒,就拿到了调换后的数组替换进去了,其它就没什么了,到这里就能拿到encrypt_encodeUtf8返回的大数组。
最后是encrypt_b64Encode,如下
到此x-s,x-s-common参数就全部拿到了。
测试可用性也没问题。
某红书over~
个人逆向gongzhong号,感兴趣的朋友可以关注下,不定期更新大厂逆向干货!!!vx搜索:当爬虫遇到逆向