app shield 参数加密破解|unidbg

app shield 算法分析 1 / 13

仅供学习研究 。请勿用于非法用途,本人将不承担任何法律责任。

前言

xhs 的 shield 参数加密逻辑分析的文章已经有很多了,但是少有人哪位大佬把源码放出来,刚好前两天发现个博主使用 unidbg 跑 shield 本次就来简单说一下踩的一些坑

原文

大佬原文,点击查看
这位大佬写了个 unidbg 系列教程文章,我也是跟着一起学习的,不知道如何搭建环境的跟着大佬学就对了

环境

ida, jeb, jadx-gui, unidbg, apk 版本 6.87.0

调试脚本

1-csdn-01

先在本地创建个 xhs.java 把大佬的代码直接复制过来

2-idea-01

这里需要改写 so apk 文件的路径,改好后直接跑起来

3-idea-02

这里发现报错了,俺不知道为啥报错,就猜测可能是版本的问题

4-idea-03

阅读代码看到,这里是使用偏移地址调用 so 函数的,apk 版本不同的 so 文件偏移地址也不同

5-jeb-01

通过 java 代码,跟上图的 jeb 都可以看到,函数的调用顺序是 initializeNative > initialize > intercept 下面反编译 so 文件查看偏移地址

6-ida-01

反编译之后在 exports 窗口里没看到相关函数,只有 JNI_OnLoad 函数,可以确定是动态注册函数,点进去看看逻辑

7-ida-02

点进之后只有一个 sub_1027C 函数,再点进去就可以看到上图的函数逻辑,里面有很多函数需要一个一个去看,我分析到注册逻辑是在 sub_9342C 函数里

8-ida-03

进来之后看到先是查找反射获取 java 类 在 RegisterNatives,按 tab 键查看汇编代码

9-ida-04

注册的函数定义在 off_B4004 偏移地址

10-ida-05

点过去就可以看到了,然后复制每个函数的 偏移地址,我这个版本的分别是
initializeNative = 0x94289, initialize = 0x937b1, intercept = 0x939d9
修改好之后在跑起来

11-idea-04

又报错了,没看出来是啥问题,网上翻一番

12-idea-05

发现是有个环境没补,那我们加上

13-idea-06

@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);
}

在最下面加上这段代码

14-idea-07

在跑起来,发现运行成功,shield 已经成功获取到了,只是用 unidbg 跑起来还不行,要在生产环境用起来,下面说下如何使用 unidbg-server 搭建服务,通过 http 请求获取加密参数

unidbg-server

unidbg-server 的代码,在之前的一篇文章中有说的
某kucun sig 参数加密分析 unidbg 模拟黑盒调用
拉到最下面有 github 地址的,大家如果不想自己搭建,参照这个模版也是可以的,代码写的比较丑。
经过在本地的测试,有些参数是可以写死的
deviceId, mainHmac 每台设备是固定的
url, commonParams 是动态的,其余的参数可填空
那我们在写接口的时候定义这两个参数即可

15-idea-08

这里先定义 postBody 对象

16-idea-09

这里定义个接口

17-python-01

18-python-02

下面是 python 测试结果,可以正常拿到数据


想学习 unidbg 的伙伴,可点击加入星球,星主是一位全能的傻宝,每天都会分享各种姿势骚操作

22 条评论
本文作者:
本文链接: https://www.qinless.com/?p=100
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 qinless 的博客!
100

22 条评论

codewj

猛男,我按照同样的方式,shield不生效,vx已经申请望通过

回复

44soul

佬,post数据要怎么传?

回复

会爬山的小脑虎

@44soul 构造 request post 请求即可

回复

44soul

@会爬山的小脑虎 data数据以什么形式传?大佬能写个demo看看么?

44soul

@会爬山的小脑虎 post数据搞了好久加密出来的shield都对不上

会爬山的小脑虎

@44soul 你搜索 okhttp 构建 post 请求就好,shield 会自动去获取 request 对象里的参数

44soul

@会爬山的小脑虎 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

@会爬山的小脑虎 我是这样构造的,但生成的shield是不对的

会爬山的小脑虎

@44soul 方便的话加 vx 讨论吧,2027762055

haiy

@44soul 大佬,post 问题解决了没

回复

abc

请问按照上述调用成功获得shield,但是和抓包的shield,末尾22位开始不一致,也无法使用。能指点一下吗?谢谢
mian_hmac是从s.xml获取。deviceid是抓包得来的。versionCode用的6.67.0版本的6870213。sAppId是-319115519

回复

会爬山的小脑虎

@abc 这个问题不好说,也许是入参的问题,可以仔细排查一下,如果还有疑问可以到关于页面,加 vx 讨论

回复

king

@会爬山的小脑虎 楼主联系方式多少

会爬山的小脑虎

@king 关于页面有的

Sirius

shield用unidbg 模拟在callObjectMethodV方法中 怎么调用的呢?

回复

会爬山的小脑虎

@Sirius 直接重写父类的方法即可

回复

Sirius

@会爬山的小脑虎 谢谢 搞定了

会爬山的小脑虎

@Sirius :mrgreen: 666 老哥

回复

bb

大佬,我现在遇到一个问题:我在Fiddler中发请求可以获得数据,但是把这个请求的url和headers放在Python的requests.request()中,就一直返回状态码406。所以想请问下大佬有没有遇到过这种情况?

回复

会爬山的小脑虎

@bb 触发风控了

回复

Sirius

@会爬山的小脑虎 这个风控有方法能过么

会爬山的小脑虎

@Sirius 数美难搞,sid 俺搞不定

发表评论

返回顶部