Category: Uncategorized

  • 铅酸电池修复

    https://www.bilibili.com/video/BV1CK4y1f7mV/?vd_source=6c84f6a0f6a5311aa22f162a9f4a4b19
    https://www.bilibili.com/video/BV1WZ4y1p7Ts/?spm_id_from=333.337.search-card.all.click&vd_source=6c84f6a0f6a5311aa22f162a9f4a4b19
    https://www.bilibili.com/video/BV1jr4y1S762/?spm_id_from=333.337.search-card.all.click&vd_source=6c84f6a0f6a5311aa22f162a9f4a4b19
    https://www.bilibili.com/video/BV1vz421Z7Hq/?spm_id_from=333.337.search-card.all.click&vd_source=6c84f6a0f6a5311aa22f162a9f4a4b19

    马自达
    https://www.bilibili.com/video/BV1d1421179n/?spm_id_from=333.337.search-card.all.click&vd_source=6c84f6a0f6a5311aa22f162a9f4a4b19

  • 鑫源650更换电瓶

    蓄电池容量 12V/11.2Ah.
    现在的原车铅酸电池🔋亏电了,经常虫不上电,现在想换个锂电池的电瓶。

  • Frida 17.4.0变化及问题解决

    Frida 17.4.0变化及问题解决

    Frida 最新更新了新的API。过去很多使用的脚本都没法用了。很多脚本都无法正常使用了。

    问题1:

    {'type': 'error', 'description': "ReferenceError: 'Java' is not defined", 'stack': "ReferenceError: 'Java' is not defined\n

    解决办法:

    script.js

    import Java from  "frida-java-bridge";
    
    if (Java.available) {
        Java.perform(() => {
            send({
                type: "status",
                message: "Application class-loader now available"
            });
        });
    } else {
        console.log("No Java VM in this process");
    }

    要导入

    import Java from  "frida-java-bridge";

    问题2:

    脚本需要编译然后加载

    def on_diagnostics(diag):
        print("diag", diag)
    compiler = frida.Compiler()
    compiler.on("diagnostics", on_diagnostics)
    ... # frida initialize procedure
    bundle = compiler.build("sw44.js")
    script = session.create_script(bundle)
    ...
    

    问题3:

    script:

    function hook_dlopen() {
        // Hook 所有可能的 dlopen 变体
        const dlopenFuncs = [
            'android_dlopen_ext',
            'dlopen',
            '__loader_dlopen'
        ];
         
        let interceptors = [];
         
        dlopenFuncs.forEach(funcName => {
            let funcPtr = Module.findExportByName(null, funcName);
            if (funcPtr) {
                let interceptor = Interceptor.attach(funcPtr, {
                    onEnter: function(args) {
                        var pathptr = args[0];
                        if (pathptr && !pathptr.isNull()) {
                            var path = ptr(pathptr).readCString();
                            console.log("[LOAD]", path);
                             
                            // 检查是否是可疑的检测库
                            if (path && (path.includes("libtt") || path.includes("libbili") ||
                                path.includes("security") || path.includes("protect"))) {
                                console.warn("!!! Possible Frida detection library loaded:", path);
                                // 打印调用栈可以帮助定位谁加载了这个库
                                console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
                                    .map(DebugSymbol.fromAddress).join('\n') + '\n');
                            }
                        }
                    }
                });
                interceptors.push(interceptor);
                console.log(`Hooked ${funcName} at ${funcPtr}`);
            }
        });
         
        // 返回所有拦截器以便后续管理
        return interceptors;
    }
     
    // 延迟执行以避免错过早期加载的库
    setImmediate(hook_dlopen);

    加载出现错误:

    '{'type': 'error', 'description': 'TypeError: not a function', 'stack': 'TypeError: not a function\n    at <anonymous> (sw44.js:27)\n    at forEach (native)\n    at hook_dlopen

    原因:

    最新版的Frida把全局的API变了。

    之前这些

    Module.ensureInitialized()
    Module.findBaseAddress()
    Module.getBaseAddress()
    Module.findExportByName()
    Module.getExportByName()
    Module.findSymbolByName()
    Module.getSymbolByName()

    现在是:

    Module.getGlobalExportByName('open')
    Process.getModuleByName('libc.so').getExportByName('open')
    Process.getModuleByName('libc.so').base
    const openImpl = Process.getModuleByName('libc.so').getExportByName('open');
    const libc = Process.getModuleByName('libc.so');
    const openImpl = libc.getExportByName('open');
    const readImpl = libc.getExportByName('read');
    

    更新后的脚本是:

    import Java from  "frida-java-bridge";
    
    if (Java.available) {
        Java.perform(() => {
            send({
                type: "status",
                message: "Application class-loader now available"
            });
        });
    } else {
        console.log("No Java VM in this process");
    }
    
    
    
    function hook_dlopen() {
        // Hook
        const dlopenFuncs = [
            'android_dlopen_ext',
            'dlopen',
            '__loader_dlopen'
        ];
    
        let interceptors = [];
    
        dlopenFuncs.forEach(funcName => {
            var funcPtr = Module.getGlobalExportByName(funcName);
            //var funcPtr = Module.findExportByName(null, funcName);
            if (funcPtr) {
                let interceptor = Interceptor.attach(funcPtr, {
                    onEnter: function(args) {
                        var pathptr = args[0];
                        if (pathptr && !pathptr.isNull()) {
                            var path = ptr(pathptr).readCString();
                            console.log("[LOAD]", path);
    
                            // 检查是否是可疑的检测库
                            if (path && (path.includes("libtt") || path.includes("libbili") ||
                                path.includes("security") || path.includes("protect"))) {
                                console.warn("!!! Possible Frida detection library loaded:", path);
                                // 打印调用栈可以帮助定位谁加载了这个库
                                console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
                                    .map(DebugSymbol.fromAddress).join('\n') + '\n');
                            }
                        }
                    }
                });
                interceptors.push(interceptor);
                console.log(`Hooked ${funcName} at ${funcPtr}`);
            }
        });
    
        // 返回所有拦截器以便后续管理
        return interceptors;
    }
    
    // 延迟执行以避免错过早期加载的库
    setImmediate(hook_dlopen);
    
    
    

    现在加载就没问题了。

    ref: https://frida.re/news/2025/05/17/frida-17-0-0-released/

  • python反编译

    python反编译

    1. 使用xdis反编译各种不同的字节码。
    2. tokenize lift disanbly
    3. parse token into parse tree
    4. abstract the parse tree into an abstract syntax tree
    5. parse source from the abstract syntax tree

  • CarPayHack

    CarPayHack

    芯片不是TI3352 是IMX6.