0%

Android内存读写检测--inotify

关于安卓的内存读写检测,网上少之又少,我仅仅找到两篇我觉得比较可靠的.

关于某蛇内核项目原理
安卓手游安全 - 反外挂基础

特此记录一下.

原理

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", getpid());

//用于监控/proc/pid/mem的数据
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]);

//__asm __volatile(".int 0x8c89fa98");
}

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 两位大佬