app shield 算法分析 1 / 13
- app shield 参数加密破解|unidbg
- shield 参数加密破解 - python 执行 c++
- app sessionid searchid|算法分析
- app sessionid searchid|算法还原
- pc timestamp2 加密参数分析破解
- app shield so 加密算法分析破解还原|前言
- app shield so 加密算法分析破解还原|so 算法简单分析
- app shield so 加密算法分析破解还原|aes 算法分析破解
- app shield so 加密算法分析破解还原|md5 算法分析破解
- app shield so 加密算法分析破解还原|xydata 算法分析破解
- app shield so 加密算法分析破解还原|总结
- app hmac 参数分析
- 7261 版 shield 算法分析破解
仅供学习研究 。请勿用于非法用途,本人将不承担任何法律责任。
前言
xhs 的 shield 参数加密逻辑分析的文章已经有很多了,但是少有人哪位大佬把源码放出来,刚好前两天发现个博主使用 unidbg 跑 shield 本次就来简单说一下踩的一些坑
原文
大佬原文,点击查看
这位大佬写了个 unidbg 系列教程文章,我也是跟着一起学习的,不知道如何搭建环境的跟着大佬学就对了
环境
ida, jeb, jadx-gui, unidbg, apk 版本 6.87.0
调试脚本
先在本地创建个 xhs.java
把大佬的代码直接复制过来
这里需要改写 so apk
文件的路径,改好后直接跑起来
这里发现报错了,俺不知道为啥报错,就猜测可能是版本的问题
阅读代码看到,这里是使用偏移地址调用 so
函数的,apk
版本不同的 so
文件偏移地址也不同
通过 java
代码,跟上图的 jeb
都可以看到,函数的调用顺序是 initializeNative > initialize > intercept
下面反编译 so
文件查看偏移地址
反编译之后在 exports
窗口里没看到相关函数,只有 JNI_OnLoad
函数,可以确定是动态注册函数,点进去看看逻辑
点进之后只有一个 sub_1027C
函数,再点进去就可以看到上图的函数逻辑,里面有很多函数需要一个一个去看,我分析到注册逻辑是在 sub_9342C
函数里
进来之后看到先是查找反射获取 java
类 在 RegisterNatives
,按 tab
键查看汇编代码
注册的函数定义在 off_B4004
偏移地址
点过去就可以看到了,然后复制每个函数的 偏移地址,我这个版本的分别是
initializeNative = 0x94289, initialize = 0x937b1, intercept = 0x939d9
修改好之后在跑起来
又报错了,没看出来是啥问题,网上翻一番
发现是有个环境没补,那我们加上
@Override
public boolean getStaticBooleanField(BaseVM vm, DvmClass dvmClass, String signature) {
switch (signature) {
case "com/xingin/shield/http/ContextHolder->sExperiment:Z":
return true;
}
return super.getStaticBooleanField(vm, dvmClass, signature);
}
在最下面加上这段代码
在跑起来,发现运行成功,shield
已经成功获取到了,只是用 unidbg
跑起来还不行,要在生产环境用起来,下面说下如何使用 unidbg-server
搭建服务,通过 http
请求获取加密参数
unidbg-server
unidbg-server
的代码,在之前的一篇文章中有说的
某kucun sig 参数加密分析 unidbg 模拟黑盒调用
拉到最下面有 github
地址的,大家如果不想自己搭建,参照这个模版也是可以的,代码写的比较丑。
经过在本地的测试,有些参数是可以写死的
deviceId, mainHmac
每台设备是固定的
url, commonParams
是动态的,其余的参数可填空
那我们在写接口的时候定义这两个参数即可
这里先定义 postBody
对象
这里定义个接口
下面是 python
测试结果,可以正常拿到数据
想学习
unidbg
的伙伴,可点击加入星球,星主是一位全能的傻宝,每天都会分享各种姿势骚操作
codewj
2022-02-25猛男,我按照同样的方式,shield不生效,vx已经申请望通过
44soul
2022-02-18佬,post数据要怎么传?
会爬山的小脑虎
2022-02-19@44soul 构造 request post 请求即可
44soul
2022-02-21@会爬山的小脑虎 data数据以什么形式传?大佬能写个demo看看么?
44soul
2022-02-21@会爬山的小脑虎 post数据搞了好久加密出来的shield都对不上
会爬山的小脑虎
2022-02-21@44soul 你搜索 okhttp 构建 post 请求就好,shield 会自动去获取 request 对象里的参数
44soul
2022-02-21@会爬山的小脑虎 RequestBody formBody = new FormBody.Builder()
.add("key", "gender")
.add("value", "1")
.add("visible", "1")
.build();
// System.out.println("formBody:"+formBody);
url = "https://edith.xiaohongshu.com/api/sns/v2/user/info";
// 'XYAAAAAQAAAAEAAABTAAAAUzUWEe0xG1IbD9/c+qCLOlKGmTtFa+lG43EOeeBWRK9EkYewy+cxRJ3+/LVcz8Mq2ch+2aM2EgwaQ2KBbb2l2X4z1LVQ3VLvgS/PsLte6iCvJ9GG'
request = new Request.Builder()
.url(url)
.addHeader("X-B3-TraceId", "6d6d8f88cd120000")
.addHeader("xy-common-params", "deviceId=6d30eaf8-63e3-3055-8142-db7996a5ecba&identifier_flag=0&tz=Asia%2FShanghai&fid=164446130010cc701809de1e436d2ac9061e830e8ae2&app_id=ECFAAF01&device_fingerprint1=20210718104554a4b47795991a6fac9b56868fe89994b501900a04e788eda7&uis=light&launch_id=1645184655&project_id=ECFAAF&device_fingerprint=20210718104554a4b47795991a6fac9b56868fe89994b501900a04e788eda7&versionName=7.5.1&platform=android&sid=session.1644461401531242501044&t=1645185629&build=7051002&x_trace_page_current=edit_profile_page&lang=zh-Hans&channel=YingYongBao")
.addHeader("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 7.1.2; Nexus 5 Build/NJH47F) Resolution/1080*1920 Version/7.5.1 Build/7051002 Device/(LGE;Nexus 5) discover/7.5.1 NetType/WiFi")
.post(formBody)
.build();
44soul
2022-02-21@会爬山的小脑虎 我是这样构造的,但生成的shield是不对的
会爬山的小脑虎
2022-02-21@44soul 方便的话加 vx 讨论吧,2027762055
haiy
2022-05-06@44soul 大佬,post 问题解决了没
abc
2021-12-24请问按照上述调用成功获得shield,但是和抓包的shield,末尾22位开始不一致,也无法使用。能指点一下吗?谢谢
mian_hmac是从s.xml获取。deviceid是抓包得来的。versionCode用的6.67.0版本的6870213。sAppId是-319115519
会爬山的小脑虎
2021-12-24@abc 这个问题不好说,也许是入参的问题,可以仔细排查一下,如果还有疑问可以到关于页面,加 vx 讨论
king
2022-01-03@会爬山的小脑虎 楼主联系方式多少
会爬山的小脑虎
2022-01-03@king 关于页面有的
Sirius
2021-12-06shield用unidbg 模拟在callObjectMethodV方法中 怎么调用的呢?
会爬山的小脑虎
2021-12-06@Sirius 直接重写父类的方法即可
Sirius
2021-12-07@会爬山的小脑虎 谢谢 搞定了
会爬山的小脑虎
2021-12-07@Sirius
666 老哥
bb
2021-11-21大佬,我现在遇到一个问题:我在Fiddler中发请求可以获得数据,但是把这个请求的url和headers放在Python的requests.request()中,就一直返回状态码406。所以想请问下大佬有没有遇到过这种情况?
会爬山的小脑虎
2021-11-21@bb 触发风控了
Sirius
2021-12-03@会爬山的小脑虎 这个风控有方法能过么
会爬山的小脑虎
2021-12-03@Sirius 数美难搞,sid 俺搞不定