在前面的文章我提到过Android内存读写检测
是使用 mincore
函数进行缺页检测的,那这篇文章我们来说说,如何去绕过这个检测。
方法1
我们可以通过注入到目标程序,对 libc 中的 mincore
函数进行 hook,修改它的 返回值 和 vec
即可,但是如果目标程序采用 svc
调用,这个方式就没有用了。
方法2
我们都知道 mincore
是个系统调用,在 libc 中,mincore 函数只是封装了,所以,我们可以通过扫描程序内存中的 svc
调用,然后 nop 掉即可。
方法3
最好的方式,其实是自己写个内核调用 或者 编译个内核模块,在内核中判断是否存在物理页即可,这样的方式是最安全的,方法1 和 方法2 都是有办法检测到的,个人推荐使用这个方法。
这次也就不放代码和图了,有兴趣的研究下。方法3的方式,在GitHub上是能找到相关代码的。这里我也就不多说了。
7 条评论
有通过pagemap的方式去检测mmap申请的匿名内存,目前这部分检测效果比mincore强很多
不过检测pagemap也挺简单,用inotify就能监听到的
两个效果其实是一样的,只是说,pagemap你能知道的更多
大佬方法3应该搜索什么关键词呢|´・ω・)ノ
在github上,有一个 rwProcMem33 的项目,这个不仅可以用来硬件断点,它也有读物理内存的功能
原来是这个啊,我已经成功编译到内核中,用来测试过读植物大战僵尸,其他没尝试过|´・ω・)ノ,关于mincore,也就如果vec第三个参数返回1就表示被访问的意思吧?
是的,理解正确