目标

还原哔哩哔哩 Android APP 视频列表接口的 sign 参数生成逻辑。

抓包定位

GET /x/v2/feed/index?...&sign=a1b2c3d4e5f6...&ts=1716900000

Frida 定位签名函数

Java.perform(function() {
    Java.enumerateLoadedClasses({
        onMatch: function(name) {
            if (name.includes('bili') || name.includes('Sign')) {
                try {
                    var cls = Java.use(name);
                    cls.class.getDeclaredMethods().forEach(function(m) {
                        if (m.getName().toLowerCase().includes('sign'))
                            console.log('[*]', name, '->', m.getName());
                    });
                } catch(e) {}
            }
        },
        onComplete: function() {}
    });
});

Hook 签名函数

Java.perform(function() {
    var SignHelper = Java.use('com.bilibili.lib.moss.protocol.sign.SignHelper');
    SignHelper.sign.overload('java.lang.String', 'java.lang.String').implementation = function(params, appkey) {
        var result = this.sign(params, appkey);
        console.log('[sign] params:', params, 'result:', result);
        return result;
    };
});

JSRPC 导出

rpc.exports = {
    sign: function(params, appkey) {
        return new Promise(function(resolve) {
            Java.perform(function() {
                var SignHelper = Java.use('com.bilibili.lib.moss.protocol.sign.SignHelper');
                resolve(SignHelper.sign(params, appkey));
            });
        });
    }
};

注意事项

  1. 哔哩哔哩有 libmsaoaidsec.so 反调试,需要先 patch 掉 anti_debug 函数
  2. wbi_sign(Web 端)和 app_sign(APP 端)算法不同,不要混用