目标
还原哔哩哔哩 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));
});
});
}
};
注意事项
- 哔哩哔哩有
libmsaoaidsec.so反调试,需要先 patch 掉anti_debug函数 - wbi_sign(Web 端)和 app_sign(APP 端)算法不同,不要混用