某加密企业版过frida检测
好,我现在要帮用户总结这篇文章的内容,控制在100字以内。首先,我需要通读文章,抓住主要信息。 文章主要讲的是如何绕过Frida注入检测。作者提到在注入过程中遇到了进程被杀的问题,于是通过Hook技术监控库加载和线程创建,发现了几个可疑的线程。接着,通过阻止这些线程成功绕过了检测,并最终dump出了DEX文件。 接下来,我需要把这些关键点浓缩成一句话。要注意用词简洁,涵盖主要步骤和结果。 可能的结构是:Frida注入检测绕过方法,包括监控库加载、线程创建,阻止可疑线程,dump DEX文件。 最后检查字数是否在100字以内,并确保没有使用“文章内容总结”之类的开头。 </think> 文章介绍了一种绕过Frida注入检测的方法,通过监控库加载和线程创建行为,识别并阻止可疑线程以成功注入并dump DEX文件。 2026-2-22 02:59:48 Author: www.freebuf.com(查看原文) 阅读量:1 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

前言

若有任何侵权等行为,可私信作者。

参考文章:https://www.freebuf.com/articles/sectool/428181.html

这篇参考文章目前是暂停在了最后的一个检测的so,我续着把后边的检测给过掉了。

参考讲解

一般so检测的手段都会开一个或多个的额外线程,所以过检测的第一步就可以看下是谁创建了额外线程使 frida进程崩溃掉的。

确认之后将这个线程给阻止掉。

js代码参考文章链接当中都有给出,这里不再附重复的部分。

image.png

libsotweak.so检测

在过掉exec的检测后,发现最后是停在了libsotweak.so这里。

讲解下思路,这个so是不存在于app包里边的,所以大概率是动态加载的,直接hook所有so的pthread_create线程创建调用,看下它是否有创建检测线程:

function setupPthreadHook() {
    const pthread_create_addr = Module.findExportByName(null, 'pthread_create');
    
    Interceptor.replace(pthread_create_addr, new NativeCallback(
        function(parg0, parg1, parg2, parg3) {
            // parg2 是线程函数指针
            const module = Process.findModuleByAddress(parg2) || {name: "unknown", base: 0};
            const offset = ptr(parg2).sub(module.base);
            
            console.log("pthread_create:", module.name, "offset:", offset);
            
            // 调用原始 pthread_create
            return pthread_create(parg0, parg1, parg2, parg3);
        }, "int", ["pointer", "pointer", "pointer", "pointer"]));
}

注入后输出信息:

pthread_create: libexec.so offset: 0x45f44 ← 可疑!libsotweak.so加载后立即创建
pthread_create: libexec.so offset: 0x469e8 ← 可疑!
pthread_create: libexec.so offset: 0x497c4 ← 可疑!
pthread_create: libexec.so offset: 0x49e8c ← 可疑!
Process terminated                          ← 进程被杀

接下来阻断这几个线程即可成功attach住,详细代码可加星球获取,链接在最下方。

dump出dex文件

成功attach住之后,将此段代码注入,随后调用dumpDex方法,操作下app

function dumpDex() {
    console.log("\n[+] Starting DEX dump...");
    
    const dexMagic = "6465780a30333500";
    const outputDir = "/data/data/com.***.***/";  // 改为应用自己的目录
    
    Process.enumerateRanges('r--').forEach(function(range) {
        try {
            Memory.scan(range.base, range.size, dexMagic, {
                onMatch: function(address, size) {
                    console.log("[*] Found DEX magic at:", address);
                    
                    try {
                        const dexSize = address.add(0x20).readU32();
                        console.log("[*] DEX size:", dexSize, "bytes");
                        
                        if (dexSize > 0 && dexSize < 100 * 1024 * 1024) {
                            const dexData = address.readByteArray(dexSize);
                            const fileName = "classes_" + address.toString().replace("0x", "") + ".dex";
                            
                            // 使用应用目录
                            const file = new File(outputDir + fileName, "wb");
                            file.write(dexData);
                            file.close();
                            
                            console.log("[+] Dumped:", fileName);
                        }
                    } catch (e) {
                        console.log("[-] Error dumping DEX:", e);
                    }
                },
                onComplete: function() {}
            });
        } catch (e) {}
    });
    
    console.log("[+] DEX dump completed!");
    console.log("[*] Pull files: adb pull /data/data/com.***.***/classes_*.dex");
}

看到此类信息即dump成功,到app目录里边(/data/data/com.*****.****)可以看到最后的dex文件。

[MI 8::com.***.*** ]-> [*] Found DEX magic at: 0x90000
[*] DEX size: 1991792 bytes
[+] Dumped: classes_76f2.dex
[*] Found DEX magic at: 0x729800
[*] DEX size: 13664 bytes
[+] Dumped: classes_76f1.dex
[*] Found DEX magic at: 0x76f0
[*] DEX size: 5263392 bytes
[+] Dumped: classes_7600.dex
[*] Found DEX magic at: 0x76d000
[*] DEX size: 4124928 bytes
[+] Dumped: classes_760.dex
[*] Found DEX magic at: 0x76f000
[*] DEX size: 4007572 bytes
[+] Dumped: classes_76f00.dex
[*] Found DEX magic at: 0x700
[*] DEX size: 4454040 bytes
[+] Dumped: classes_76f30.dex
[*] Found DEX magic at: 0x7600
[*] DEX size: 10898288 bytes
[+] Dumped: classes_76f00.dex

流程梳理

A[发现问题:Frida注入后进程被杀] --> B[Hook dlopen监控库加载]
B --> C[发现 libexec.so + libsotweak.so]
C --> D[Hook pthread_create监控线程创建]
D --> E[发现4个可疑线程: 0x45f44等]
E --> F[IDA分析失败:显示为数据段]
F --> G[运行时内存dump:确认是代码]
G --> H[逐个测试阻止线程创建]
H --> I[成功:阻止4个线程后绕过检测]

免责声明

1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。

2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。

3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。

已在FreeBuf发表 0 篇文章

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/web/471196.html
如有侵权请联系:admin#unsafe.sh