首页
社区
课程
招聘
[原创]unidbg直接调用tiktok so生成签名
发表于: 2025-2-18 17:58 8848

[原创]unidbg直接调用tiktok so生成签名

2025-2-18 17:58
8848

Tiktok版本: 33.2.5 (24年1月25日)
1、前言
通过对Tiktok抓包发现TikTok的所有http请求的头部增加了参数签名(x-argus、x-goron、x-khronos、x-ladon):

图片描述

2、获取关键函数
直接将apk文件用jadx工具反编译,搜索关键字x-argus等,未搜索到任何关键字:
图片描述

使用frida hook java层 Header对象的构造方法,发现有监控到https请求头设置,但是始终没有发现签名字段

1
2
3
4
5
var Header = Java.use("X.2jn");
Header.$init.implementation = function(key, val) {
    console.log(key + " : " + val);
    this.$init(key, val);
}

接着尝试hook interceptor拦截器,打印出请求头部,结果输出的请求头部中还是没有签名字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    //添加intercept
    var Request = Java.use("X.LGn");
    Request.LIZJ.implementation = function(intercept){
        var newObj = Java.cast(intercept, Java.use("java.lang.Object"));
        //console.log(newObj.getClass());
        var new_cls = newObj.getClass();
        var class_name = new_cls.getName();
  
        if(!mmp[class_name]) {
            mmp[class_name] = 1;
            var hook_class = Java.use(class_name);
            hook_class.intercept.implementation = function(tt){
                var res = this.intercept(tt);
/*              var rq = tt.request();
                console.log(rq.getUrl()); */
  
                var request = getFieldVal(res, "LIZ");
                //console.log(getFieldVal(request, "LIZ"));
                //console.log(getFieldVal(request, "LIZJ"));
                //console.log(getFieldVal(request, "LJI"));
                  
                var headers = getFieldVal(request, "LIZLLL");
                //console.log(headers);
                //console.log("----------------------------------------------------");
                return res;
            }
        }
  
        this.LIZJ(intercept);
    }

Java层找了一遍始终找不到签名关键字符串,那很大可能是在native层设置,在native层在 https请求发出时进行设置。TikTok使用 cronet网络库 。将libsscronet拖IDA反编译,搜索 x-gorfon 关键字,确实找到了:
图片描述

结合 cronet源码,找到Native层设置请求Header函数:

1
2
3
4
5
6
7
8
9
10
11
void HttpRequestHeaders::SetHeader(const base::StringPiece& key,
                                   const base::StringPiece& value) {
  DCHECK(HttpUtil::IsValidHeaderName(key.as_string()));
  // TODO(ricea): Revert this. See crbug.com/627398.
  CHECK(HttpUtil::IsValidHeaderValue(value.as_string()));
  HeaderVector::iterator it = FindHeader(key);
  if (it != headers_.end())
    it->value.assign(value.data(), value.size());
  else
    headers_.push_back(HeaderKeyValuePair(key, value));
}

定位到该libsscronet中偏移为:0x2C44BC,HOOK该地址并打印出参数:

1
2
3
4
5
6
7
8
9
10
11
var SetHeaders = lib.base.add(0x2C44BC);
Interceptor.attach(SetHeaders, {
    onEnter: function (args) {
        var key = args[1].readPointer().readUtf8String();  //第一个属性是字符串的地址, 第二个属性长度
        var val = args[2].readPointer().readUtf8String();
        console.log(key + " : " + val);
    },
    onLeave: function (retval) {
          
    }
});

这次全部头部都可以看到了,完美!
图片描述

然后打印设置参数签名字段时的调用栈:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var SetHeaders = lib.base.add(0x2C44BC);
Interceptor.attach(SetHeaders, {
    onEnter: function (args) {
  
        var key = args[1].readPointer().readUtf8String();  //第一个属性是字符串的地址, 第二个属性长度
        var val = args[2].readPointer().readUtf8String();
        if(key.indexOf("X-Gorgon") !== -1) {
            console.log(key + " : " + val);
            console.log('SetHeaders called from:\n' + Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');
            console.log("---------------------------end----------------------------------");
        }
    },
    onLeave: function (retval) {
          
    }
});

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 232
支持
分享
最新回复 (194)
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2025-2-18 18:05
0
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢楼主
2025-2-18 18:19
0
雪    币: 204
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2025-2-18 18:20
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
感谢楼主
2025-2-18 18:21
0
雪    币: 230
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2025-2-18 18:21
0
雪    币: 253
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2025-2-18 18:21
0
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
666
2025-2-18 18:23
1
雪    币: 6529
活跃值: (7017)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
牛逼
2025-2-18 18:41
0
雪    币: 373
活跃值: (2318)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
666
2025-2-18 19:41
0
雪    币: 204
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11

最后于 2025-2-18 21:20 被mb_tkrgetye编辑 ,原因: 已经解决
2025-2-18 20:16
0
雪    币: 48
活跃值: (2253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
膜拜大佬
2025-2-18 20:33
0
雪    币: 482
活跃值: (1122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
111
2025-2-18 20:38
0
雪    币: 370
活跃值: (5353)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
1
2025-2-18 20:42
0
雪    币: 87
活跃值: (642)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
1
2025-2-18 20:48
0
雪    币: 686
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
1
2025-2-18 22:13
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
1
2025-2-18 22:15
0
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
牛逼
2025-2-18 22:15
0
雪    币: 2691
活跃值: (3767)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
火钳刘明
2025-2-18 22:18
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
牛逼
2025-2-18 22:18
0
雪    币: 841
活跃值: (1413)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习学习
2025-2-18 22:22
0
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
非常好
2025-2-18 22:27
0
雪    币: 1643
活跃值: (3296)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
666
2025-2-18 22:34
0
雪    币: 544
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
666
2025-2-18 22:36
0
雪    币: 75
活跃值: (364)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
666
2025-2-18 22:47
3
游客
登录 | 注册 方可回帖
返回