在QQ浏览器的崩溃报告中,会发送大量当前设备的状态,设备的信息.硬件的信息.等等.
其中就包含了Hook检测,Root检测,模拟器检测,DexFile检测,Debug检测.这些信息.
由于这部分代码使用了名称混淆.所以我自己手工把代码还原了一遍.替换为有意义的名称.
部分逻辑修改了一下下.下面我们就依次来看.
说是Hook检测,不如说是对目前比较流行的框架xposed,substrate的检测.
这部分代码比较简单,就是检测是否安装了xposed或者substrate.
这里我对Linux的proc文件系统没有研究过的童鞋非常简单的搜一下盲.
首先proc文件系统的设计目的之一就是允许更方便的对进程信息进行访问.
每当一个进程创建的时候,/proc目录下就会有和该进程id对应的目录产生.
目录名称就是进程id.里面记录该进程的各种信息.其中maps记录了进程的
内存信息,更具体的说内存分段信息.具体什么含义我就不说了,反正我们可以知道它可以记录加载了那些模块就OK了.如下图
对Xposed有研究过的人应该都知道,xposed会对进程注入这些模块:
所以我们检测这些模块是否存在也是可以检测出xposed和substrate的.
代码逻辑就是一行一行的读/proc/mypid/mpas.看是否包含xposed或com.saurik.substrate.
先看图.
啊啊,我们只要检测堆栈是否包含红色圈圈de.robv.android.xposed.XposedBridge就可以了.
看代码
其实我们可以依据该方法检测自己的方法是否被Hook了.道理是一样的.就是检测堆栈是否包含有afterHookedMethod,beforeHookedMethod.
话说这个我不清楚啥原理.有懂得留言告诉我一下呗.
模拟器都具有一些特殊的属性.查找这个特殊的属性就可以判断是否是模拟器.
其中AdbShell.getprop 等效于 Systemproperties.get(name).
一个是检测debuggable标志.一个是检测TracerPid.
一个是检测是否有su文件.一个是检测属性.
据说对一些比较难Root的手机厂商,修改rom里面的default.prop文件里的ro.secure为0,然后重签名再刷进去可以获得永久root.不过我没试过...,比较懒.
根据ClassLoad检测加载了那些Dex文件
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!