fuqiuluo’s blog

记录美好生活

技术分享

安卓对抗之Unidbg检测(进阶)

#unidbg#unicorn#安全
type
Post
status
Published
date
Jun 10, 2024
slug
unidbg-detect-v2
summary
本文系统梳理了 6 种检测 Unidbg 模拟器环境的技术手段,覆盖环境变量、进程信息、JNI 行为、栈空间特征等多个维度
tags
unidbg
unicorn
安全
category
技术分享
icon
password

环境Env检测

因为env_set被unidbg偷偷实现了,如果不去改他的源代码或者实现自定义syscall_handler ,是没办法做到java层env的设置和他native的同步的哦!

子进程pidppid

尝试fork出来一个子进程继续运行,然后获取pidppid,unidbg默认并没有实现get_ppid() ,如果出现pid和ppid一致,则可能还有另外的问题?

Jni行为异常检测

unidbg的Jni行为不是非常合理,就像上文的libc堆区检测一样。
  • 有部分不常用的JNI操作没有实现
  • 不能通过native调用native jni函数(出现running错误)
  • 错误的method_id调用
1,继承关系异常
(1)本质体现为,使用Object对象的toString方法对context进行call,会出现该方法不是android.os.Context 的方法相关的错误。
其实逻辑上来说,Context继承了Object(unidbg里面可以在new Context的时候指定一下父类)。
(2)上面的方法有一个进阶操作,从java.io.File (使用这个不引起怀疑)获取toStringmethod_id ,然后拿去给contexttoString操作,你不能说Context继承File吧?如果你敢指定继承关系,直接拿context跑一下getAbsolutePath 跑过了直接非法环境。

method_idclass_id可特征

这个检测方法我都懒得说,因为很容易过掉,但是还是说一下,Unidbg的mthod_id什么的是通过java.lang.Object.hashCode(): int 算出来的。

栈空间地址内容检测

该检测可能误判!(但是概率几乎没有)
https://github.com/fuqiuluo/rnidbg/blob/main/dynarmic/src/dynarmic/dynarmic.cpp#L488
看这里的代码,你要知道unidbg中所有的栈空间的代码都是由这个mmap进行分配的,其中有一个flag叫MAP_ANONYMOUS 这个flag会导致映射的内存全被写为0,那么检测栈地址空间的内容是否往上全是0即可。
Loading...