对Android Hook检测技术的一些浅谈

大部分对hook的检测还是比较依赖系统 api 或者改动hook框架很容易就失效。

比如检测libxxx.so,命名空间,指定类等等。

我在这里提出一种检测思路:

对比内存中的.text段和文件中的.text的crc是否相等。

大致流程:

1.解析/proc/self/maps。

2.匹配到你需要检测的so文件,获取其的加载基地址和文件路径。

3.通过mmap将文件映射到内存,然后把内容传给ELF解析工具,获取其.text段的偏移和大小 。

4.通过偏移+加载基地址 和 偏移+mmap返回值 以及.text段大小来计算crc,并比对。

这种方式最好放到线程里面去做,缺陷是app自身不能使用inline hook,否则也会被检测到。

针对xposed hook、frida hook的检测话,还有一种方法,就是被xposed hook的Java方法修饰符都会变成native,

以getPackageInfo的检测代码示例:

void check_native_modifier_task(__int64 addr){
    int check_time = 10;
    while (1) {
        if((~*(_DWORD *)(addr + 4) & 0x80000) !=0){
            // find xposed, frida hook.
            break;
        }else if(check_time < 0){
            break;
        }
        std::this_thread::sleep_for(std::chrono::seconds(1));
        check_time = check_time - 1;

    }

}

JNICALL void check_native_modifier(JNIEnv *env){
    jclass packageManagerClass = env->FindClass("android/content/pm/PackageManager");
    jmethodID getPackageInfoMethodID = env->GetMethodID(packageManagerClass,"getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
    thread checkThread = std::thread(check_native_modifier_task, getPackageInfoMethodID);
    checkThread.detach();
    env->DeleteLocalRef(packageManagerClass);

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦哆啦S梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值