一、模拟器检测
- 基于模拟器的IMSI、IDS、默认文件等几个方面特征进行检测
- 基于CPU的检测(如是否包含inter、amd等字段)
- 电池信息、温度、电量变化等
代码示例:
1 | //需要添加android.permission.READ_PHONE_STATE权限 |
二、签名监测(native)
签名检测在一般在java层实现,通过与远程服务器交互完成校验。如果没有本地校验,则尽可能在native层实现,这里利用反射的方式。
代码示例:
1 | void SignatureCheck(JNIEnv *env, jobject context) |
三、反调试
1. ptrace
ida、gdb等调试工具其实都是使用ptrace进行的, ptrace有一个很重要的特定,一个进程只能被其它一个进程调试。当没有被调试时,/proc/(pid)/status文件中TracePid为0,即
(1) 如果TracePid不为0时,说明进程正在被调试。
1 |
|
(2) 进程自己prace自己,就不会被第三方调试了。在jni_OnLoad函数中ptrace自身,代码如下:
1 | JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* pVm, void* reserved) |
2. 暗桩
ptrace容易被逆向搞掉,暗桩是在多个地方插入检测代码,增加逆向难度,例如,新建一个进程每隔几秒检测一次:
1 | void thread_task(int n) |