安卓逆向 某痛单词过frida检测

admin 2025年2月28日23:20:07评论15 views字数 3355阅读11分11秒阅读模式

今天来给大家分享一个案例,某某单词app,由于该app有反调试,本文就介绍一下如何绕过他的反调试

开始

检测Frida的机制一般在Native层实现,通常会创建几个线程轮询检测。首先要知道检测机制是由哪个so实现的,通过hook android_dlopen_ext函数,观察加载到哪个so的时候,触发反调试进程终止即可。下面我们来试一下

 复制代码 隐藏代码
Interceptor.attach(Module.findExportByName(null"android_dlopen_ext"),
{
onEnterfunction (args) {
var pathptr = args[0];
if (pathptr !== undefined && pathptr != null) {
var path = ptr(pathptr).readCString();
console.log("load " + path);
        }
    }
}
);
安卓逆向  某痛单词过frida检测

可以看到,在加载libmsaoaidsec.so后,frida挂掉了

现在直接注入我们的线程替换脚本,看看这个so加载的线程

 复制代码 隐藏代码
functioncheck_pthread_create(name = null) {
var pthread_create_addr = Module.findExportByName(null'pthread_create');

var pthread_create = newNativeFunction(pthread_create_addr, "int", ["pointer""pointer""pointer""pointer"]);
Interceptor.replace(pthread_create_addr, newNativeCallback(function (parg0, parg1, parg2, parg3) {
varmodule = Process.findModuleByAddress(parg2)
var so_base = module.base;
var off = "0x" + parg2.sub(so_base).toString(16)
var so_name = module.name;
console.log(so_name, off, parg3)

returnpthread_create(parg0, parg1, parg2, parg3);

    }, "int", ["pointer""pointer""pointer""pointer"]))
}
setImmediate(check_pthread_create)
安卓逆向  某痛单词过frida检测

这里创建了三个线程,内存偏移量为0x1c5440x1b8d40x26e5c注:画线的地方不是检测线程,请看清楚so名字

现在回去改dlopen,如果这个so一加载就nop线程

安卓逆向  某痛单词过frida检测

结果不尽人意,这里获取不了libmsaoaidsec.so的基址

因为安卓加载so整个流程如下

 复制代码 隐藏代码
linker->init_proc ->JNI_OnLoad 

dlopen获取基址,是要等jni加载后的,但是现在jni还没加载我们的frida就被杀掉了,说明检测在init_proc里,我们需要寻找一个合适的hook时机

现在我们打开ida,把so拖进去,静态分析

安卓逆向  某痛单词过frida检测

这里我尝试过寻找发起线程的地方,但从导入函数并没有看到,pthread_create相关字样,他应该是间接调用的,但是我们已经知道了线程的偏移量,所以这里不太重要了

安卓逆向  某痛单词过frida检测

接下来我们继续看init_proc ,这里被ollvm混淆了,转成伪c代码,通过交叉引用,可以得到他是先执行sub_123f0

安卓逆向  某痛单词过frida检测

可以看到sub_123f0_system_property_get调用了一个ro.build.version.sdk,这里我们从注入system_property_get是个不错的选择,因为他是在init.proc阶段执行的

安卓逆向  某痛单词过frida检测

现在我们去hook_system_property_get

 复制代码 隐藏代码
functionlocate_init() {
let r = null
Interceptor.attach(Module.findExportByName(null"__system_property_get"),
        {
onEnterfunction (args) {
var name = args[0];
if (name !== undefined && name != null) {
                    name = ptr(name).readCString();
console.log(name)
if (name.indexOf("ro.build.version.sdk") >= 0) {
console.log(Process.findModuleByName("libmsaoaidsec.so").base)
                    }
                }
            }
        }
    );
}

Interceptor.attach(Module.findExportByName(null"android_dlopen_ext"),
{
onEnterfunction (args) {
var pathptr = args[0];
if (pathptr !== undefined && pathptr != null) {
var path = ptr(pathptr).readCString();
if(path.search("libmsaoaidsec.so") != -1){
this.hook = true
locate_init()
            }
        }
    }
}
);

输出如下,我们成功获取到了基址

安卓逆向  某痛单词过frida检测

那我们就nop上面提到的偏移量吧

安卓逆向  某痛单词过frida检测

完美绕过frida检测

完整代码

 复制代码 隐藏代码
functionlocate_init() {
let r = null
Interceptor.attach(Module.findExportByName(null"__system_property_get"),
        {
onEnterfunction (args) {
var name = args[0];
if (name !== undefined && name != null) {
                    name = ptr(name).readCString();
//console.log(name)
if (name.indexOf("ro.build.version.sdk") >= 0) {
var  r = Process.findModuleByName("libmsaoaidsec.so")
nop_64(r.base.add("0x1c544"))
nop_64(r.base.add("0x1b8d4"))
nop_64(r.base.add("0x26e5c"))
                    }
                }
            }
        }
    );
}

Interceptor.attach(Module.findExportByName(null"android_dlopen_ext"),
{
onEnterfunction (args) {
var pathptr = args[0];
if (pathptr !== undefined && pathptr != null) {
var path = ptr(pathptr).readCString();
if(path.search("libmsaoaidsec.so") != -1){
this.hook = true
locate_init()
            }
        }
    }
}
);

functionnop_64(addr) {
Memory.protect(addr, 4 , 'rwx');
var w = newArm64Writer(addr);
    w.putRet();
    w.flush();
    w.dispose();
}

· 今 日 推 荐 ·

安卓逆向  某痛单词过frida检测

本文内容来自网络,如有侵权请联系删除

原文始发于微信公众号(逆向有你):安卓逆向 -- 某痛单词过frida检测

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月28日23:20:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓逆向 某痛单词过frida检测https://cn-sec.com/archives/3779583.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息