0%

Android内存读写检测--mincore

Android 另一种检测内存读写的方式–mincore

参考了这篇文章
安卓手游安全 - 反外挂基础

原理

引用上面文章的一句话

回归主题,上面所述有个关键词叫缺页异常比如我们调用 mmap 来映射内存,为了防止内存无效分配,该内存空间在未访问时是不会创建物理内存页的。当程序需要使用这块内存区域时,会触发缺页中断,然后系统才会创建物理内存页。

简而言之,就是先用 mmap 申请一段内存,如果 ce, 或 GG 读取这段内存后,那么这段内存就会由缺页变成非缺页.
而内存的缺页与否可以通过调用 mincore 判断.

使用

1.mmap 申请内存

1
2
char * memory= nullptr;
memory= (char*)mmap(nullptr,0x4000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);

如果不对 memory 进行读写,那么 memory 默认为缺页状态

2.mincore 判断

1
2
3
4
5
6
7
8
9
10
11
12
int pageSize = getpagesize();
unsigned char vec = 0;
//memory[0]=1; 这个操作会把memory改为非缺页状态
unsigned long addr= reinterpret_cast<unsigned long>(memory);
unsigned long start = addr & (~(pageSize - 1));
mincore((void *)start, pageSize, &vec);
if (vec == 1)
{
LOGD("内存页:%p 存在于物理内存空间",addr);
}else{
LOGD("内存页:%p 不存在于物理内存空间",addr);
}

效果

当 ce 指定读取该内存时,会发现该内存已经处于非缺页状态.

但是使用 ce 全局搜索内存时,并没有检测到这段内存.

本文所用代码:
https://github.com/PShocker/Android_Mincore