关于安卓的内存读写检测,网上少之又少,我仅仅找到两篇我觉得比较可靠的.
关于某蛇内核项目原理
安卓手游安全 - 反外挂基础
特此记录一下.
原理
app 里使用 inotify 机制监控对内存的读写操作,引用百度百科的一句话.
Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。
使用
1. 新建一个监控线程.
1 2 3
| pthread_t ptMem, t, ptPageMap; int iRet = 0; iRet = pthread_create(&ptPageMap, NULL, thread_watchInotifyDump, NULL);
|
2. 初始化监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| char dirName[NAME_MAX] = {0};
snprintf(dirName, NAME_MAX, "/proc/%d/mem", getpid());
LOGD("监控位置 : %s\n", dirName);
int fd = inotify_init(); if (fd < 0) { LOGE("inotify_init err.\n"); return 0; } int wd = inotify_add_watch(fd, dirName, IN_ALL_EVENTS); if (wd < 0) {
LOGE("inotify_add_watch err.\n"); close(fd); return 0; }
|
3.select 读取监控消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| const int buflen = sizeof(struct inotify_event) * 0x100; char buf[buflen] = {0}; fd_set readfds;
int count[5] = {0};
while (1) {
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
int iRet = select(fd + 1, &readfds, 0, 0, 0);
LOGD("iRet的返回值:%d\n", iRet); if (-1 == iRet) break;
if (iRet) {
memset(buf, 0, buflen); int len = read(fd, buf, buflen);
int i = 0;
while (i < len) {
struct inotify_event *event = (struct inotify_event *)&buf[i];
LOGD("event mask:%d\n", event->mask);
if ((event->mask & IN_ACCESS)) {
++count[0]; LOGD("1.IN_ACCESS,第%d次.\n\n", count[0]);
}
if ((event->mask & IN_OPEN)) { ++count[1]; LOGD("2.IN_OPEN,第%d次.\n\n", count[1]); }
if ((event->mask & IN_CLOSE)) { ++count[2]; LOGD("3.IN_CLOSE,第%d次.\n\n", count[2]); }
i += sizeof(struct inotify_event) + event->len; } } }
|
效果
当用 ceserver 读取内存时,发现会被检测到,GG 和 vm_read 我懒得测了,理论上是有效果的.
本文所用示例代码来自:
https://github.com/Reverse-Kindergarten/Android_Anti-Hcak_Inotify
谢谢 isBaibai 和 SsageParuders 两位大佬