bili sign算法分析
选择一个老版本的bili练手,本文选择的是8.14.0 。还是走unidbg模拟执行分析算法的流程。
粗略分析
- 抓包发现参数
2. 参数位置定位
3. frida hook 确定。
上面是随意一个hook记录可以看出输入的是一个map,返回一个对象类型,也可以直接hook返回类型的构造函数,能验证结果即可。
哔哩哔哩app一直有frida检测,这里也尝试了不少网上的内容但是这个版本不知道为何都跳不过检测。最后总结所有网上的线索很粗略的绕过了。线索如下:- 检测在libmsaoaidsec.so文件的
.init_proc()
函数中。 - 使用
pthread_create
函数创建检测进程,不管是通过地址还是通过dlsym
函数调用
- 检测在libmsaoaidsec.so文件的
所以结论就是在libmsaoaidsec.so .init_proc()
函数中调用dlsym
的函数大概率就是检测函数,直接给检测函数置空就能跳过frida检测。
所以在如上所示的伪代码中瞎翻翻,练手时候运气不错直接就碰到了。当然这是运气,实际可以去看看关于此文件的检测手段,然后看交叉引用啥的也可以判断出检测函数位置。本文这里直接替换的函数是
sub_1B924()
。
let skip_functions = [];
function hook_dlopen(soName='') {
Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"),
{
onEnter: function (args) {
var pathptr = args[0];
if (pathptr !== undefined && pathptr != null) {
var path = ptr(pathptr).readCString();
console.log("load " + path);
if (path.indexOf(soName) !== -1) {
console.log("locate init.")
locate_init(soName);
this.canHook = true;
}
// if (path.indexOf("libbili.so") !== -1) {
// this.canHook = true;
// }
}
},
onLeave: function (retval) {
if (this.canHook) {
// hook_sign();
hook_libbili();
}
}
}
);
}
function locate_init(soName) {
let secmodule = null
Interceptor.attach(Module.findExportByName(null, "__system_property_get"),
{
// _system_property_get("ro.build.version.sdk", v1);
onEnter: function (args) {
secmodule = Process.findModuleByName(soName)
var name = args[0];
if (name !== undefined && name != null) {
name = ptr(name).readCString();
if (name.indexOf("ro.build.version.sdk") >= 0) {
hook_detect(soName);
}
}
}
}
);
}
function hook_detect(soName) {
var mo = Process.findModuleByName(soName);
console.log("libmsaoaidsec.so --- " + mo.base)
hook_anti_frida_replace(mo.base.add(0x1b924));
}
function hook_anti_frida_replace(addr){
console.log('replace anti_addr :',addr);
if (addr !== undefined && addr != null && !skip_functions.includes(addr) ) {
Interceptor.replace(addr,new NativeCallback(function(a1){
console.log('replace success');
return;
},'pointer',[]));
skip_functions.push(addr);
}
}
function hook_libbili() {
var LibBili = Java.use("com.bilibili.nativelibrary.LibBili");
LibBili["so"].overload('java.util.SortedMap', 'int', 'int').implementation = function (sortedMap, i14, i15) {
var Map = Java.use('java.util.TreeMap');
var args_x = Java.cast(sortedMap, Map);
console.log(`LibBili.m159700so is called: sortedMap=${
args_x.toString()}, i14=${
i14}, i15=${
i15}`);
v