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

环境Env检测

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

Os.setenv("key", "value", true)
auto value = getenv("key")

子进程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 算出来的。

尝试使用bpf检测

维度

cBPF

eBPF

内核版本

Linux 2.1.75(1997 年)

Linux 3.18(2014 年)[4.x for kprobe/uprobe/tracepoint/perf-event]

寄存器数目

2 个:A, X

10 个:R0–R9, 另外 R10 是一个只读的帧指针

寄存器宽度

32 位

64 位

存储

16 个内存位:M[0–15]

512 字节堆栈,无限制大小的“map”存储

限制的内核调用

非常有限,仅限于 JIT 特定

有限,通过 bpf_call 指令调用

目标事件

数据包、seccomp-BPF

数据包、内核函数、用户函数、跟踪点 PMCs 等

unidbg默认版本是android 7.0(内核4.4),这个版本理应可以使用bpf了吧?特性支持表

ebpf需要安卓9.0开始全面支持

随便加个bpf filter ,直接干死,嘻嘻!点我查看