【摸鱼24/9/25】bili app sign算法分析

bili sign算法分析

选择一个老版本的bili练手,本文选择的是8.14.0 。还是走unidbg模拟执行分析算法的流程。

粗略分析

  1. 抓包发现参数
    在这里插入图片描述2. 参数位置定位
    在这里插入图片描述3. frida hook 确定。
    在这里插入图片描述上面是随意一个hook记录可以看出输入的是一个map,返回一个对象类型,也可以直接hook返回类型的构造函数,能验证结果即可。
    哔哩哔哩app一直有frida检测,这里也尝试了不少网上的内容但是这个版本不知道为何都跳不过检测。最后总结所有网上的线索很粗略的绕过了。线索如下:
    • 检测在libmsaoaidsec.so文件的.init_proc()函数中。
    • 使用pthread_create函数创建检测进程,不管是通过地址还是通过dlsym函数调用

所以结论就是在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值