1.inotify

linux下inotify可以实现监控文件系统事件(打开,读写删除等),inotify最常见的api有以下几个:

  • inotify_init:用于创建一个 inotify 实例的系统调用,并返回一个指向该实例的文件描述符。
  • inotify_add_watch:增加对文件或者目录的监控,并指定需要监控哪些事件。
  • read:读取包含一个或者多个事件信息的缓存。
  • inotify_rm_watch:从监控列表中移出监控项目。

inotify_add_watch原型如下:

 int inotify_add_watch(int fd, const char* pathname, int mask)
  • 第一个参数fd是inotify_init的返回值。
  • 第二个参数是要监控的文件目录。
  • 第三个参数表示要监控哪些事件。

inotify的mask类型具体定义见:linux-3.18.6/include/uapi/linux/inotify.h#29

 
1
2
3
4
5
6
7
8
9
10
11
12
#define IN_ACCESS 0x00000001 /* File was accessed */
#define IN_MODIFY 0x00000002 /* File was modified */
#define IN_ATTRIB 0x00000004 /* Metadata changed */
#define IN_CLOSE_WRITE 0x00000008 /* Writtable file was closed */
#define IN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed */
#define IN_OPEN 0x00000020 /* File was opened */
#define IN_MOVED_FROM 0x00000040 /* File was moved from X */
#define IN_MOVED_TO 0x00000080 /* File was moved to Y */
#define IN_CREATE 0x00000100 /* Subfile was created */
#define IN_DELETE 0x00000200 /* Subfile was deleted */
#define IN_DELETE_SELF 0x00000400 /* Self was deleted */
#define IN_MOVE_SELF 0x00000800 /* Self was moved */

从read函数读出的内容是多个 inotify_event 结构体,该结构体定义如下:

 
1
2
3
4
5
6
7
8
structinotify_event{
       int      wd;       /* Watch descriptor */
       uint32_t mask;     /* Mask of events */
       uint32_t cookie;   /* Unique cookie associating related
                                     events (for rename(2)) */
       uint32_t len;      /* Size of name field */
       char     name[];   /* Optional null-terminated name */
};

每个触发的事件都对应了一个inotify_event结构体,只要判断这个结构体中的mask是否为指定的事件(open,read等)即可判断这个发生的事件是否对我们有用。

2.select函数

select系统调用是用来让我们的程序监视多个文件句柄的状态变化,select函数原型及参数说明如下:

 
1
2
intselect(intmaxfd,fd_set *rdset,fd_set *wrset,\  
           fd_set *exset,structtimeval *timeout);
  • 参数maxfd是需要监视的最大的文件描述符值+1;
  • rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。
  • struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。

3.通过inotify实现反调试

通过inotify监控/proc/pid文件夹下的关键文件变化(maps的读,mem的读等),若想查看某进程的的虚拟地址空间或者想dump内存,则会触发打开或读取的事件,只要接收到这些事件,则说明进程正在被调试,直接kill主进程。主要代码如下:

//fork子进程调用该函数,并且传入父进程pid
voidAntiDebug(intppid){
 
charbuf[1024],readbuf[MAXLEN];
intpid,wd,ret,len,i;
intfd;
fd_set readfds;
//防止调试子进程
ptrace(PTRACE_TRACEME,0,0,0);
fd=  inotify_init();
sprintf(buf,"/proc/%d/maps",ppid);
 
//wd = inotify_add_watch(fd, "/proc/self/mem", IN_ALL_EVENTS);
wd=inotify_add_watch(fd,buf,IN_ALL_EVENTS);
if(wd<0){
LOGD("can't watch %s",buf);
return;
}
while(1){
i=0;
                //注意要对fd_set进行初始化
FD_ZERO(&readfds);
FD_SET(fd,&readfds);
                //第一个参数固定要+1,第二个参数是读的fdset,第三个是写的fdset,最后一个是等待的时间
                //最后一个为NULL则为阻塞
ret=select(fd+1,&readfds,0,0,0);
if(ret==-1)
break;
if(ret){
len=read(fd,readbuf,MAXLEN);
while(i<len){
                                //返回的buf中可能存了多个inotify_event
structinotify_event *event=(structinotify_event*)&readbuf[i];
LOGD("event mask %d\n",(event->mask&IN_ACCESS)||(event->mask&IN_OPEN));
                                //这里监控读和打开事件
if((event->mask&IN_ACCESS)||(event->mask&IN_OPEN)){
LOGD("kill!!!!!\n");
                                                //事件出现则杀死父进程
intret=kill(ppid,SIGKILL);
LOGD("ret = %d",ret);
return;
}
i+=sizeof(structinotify_event)+event->len;
}
}
}
inotify_rm_watch(fd,wd);
close(fd);
}

通过inotify实现反调试的更多相关文章

  1. Android反调试笔记

    1)代码执行时间检测 通过取系统时间,检测关键代码执行耗时,检测单步调试,类似函数有:time,gettimeofday,clock_gettime. 也可以直接使用汇编指令RDTSC读取,但测试AR ...

  2. APP加固反调试(Anti-debugging)技术点汇总

    0x00 时间相关反调试 通过计算某部分代码的执行时间差来判断是否被调试,在Linux内核下可以通过time.gettimeofday,或者直接通过sys call来获取当前时间.另外,还可以通过自定 ...

  3. 解决Android加固多进程ptrace反调试的思路整理

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53613481 一.Android多进程反调试的原理代码 当ptrace附加目标进程 ...

  4. 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  5. 反调试技术常用API,用来对付检测od和自动退出程序

    在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术 ...

  6. 强大反调试cm的奇葩破解

    系统 : Windows xp 程序 : Crackme-xp 程序下载地址 :http://pan.baidu.com/s/1slUwmVr 要求 : 编写注册机 使用工具 : OD & I ...

  7. WinDbg调试流程的学习及对TP反调试的探索

    基础知识推荐阅读<软件调试>的第十八章 内核调试引擎 我在里直接总结一下内核调试引擎的几个关键标志位,也是TP进行反调试检测的关键位. KdPitchDebugger : Boolean ...

  8. 基于TLS的反调试技术

    TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...

  9. 去除ios反调试

    在逆向过程中经常会遇到反调试,如下段代码: 0008bd8e movs r1, #0xa ; argument #2 for method imp___symbolstub1__dlopen 0008 ...

随机推荐

  1. Spring cloud Eureka错误锦集(一)

    初学Spring cloud的时候,启动Eureka的时候报了下面的错误: com.sun.jersey.api.client.ClientHandlerException: java.net.Con ...

  2. Java笔记(七)HashMap和HashSet

    HashMap和HashSet 一)HashMap 1.Map接口 interface Map<K,V> { int size();//查看Map中的键值对个数 boolean isEmp ...

  3. BZOJ4077 : [Wf2014]Messenger

    二分答案,让$A$推迟出发$mid$的时间. 对于每个相邻的时间区间,两个点都是做匀速直线运动. 以$A$为参照物,那么$A$不动,$B$作匀速直线运动. 若线段$B$到$A$的距离不超过$mid$, ...

  4. 考前停课集训 Day5 累

    Day 5 今天不考试 因此自己订正+刷题 我就当日记来写吧 昨天棕名了…… 所以借了同学的号打题 NOIP前的崩心态啊QAQ 希望一切安好

  5. Android @id和@+id区别

    Android中的组件需要用一个int类型的id属性值来表示.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等.如果在@后面使用“+”,表示当修改完某个布 ...

  6. jquery 学习 总结

    OM = Document Object Model(文档对象模型) 一.基础 1.    <script src="http://cdn.static.runoob.com/libs ...

  7. git clone 报错

    1,问题 Cloning into 'project-name'... ssh: Could not resolve hostname gerrit.firewinggames.com: nodena ...

  8. flask内容

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  9. C/JS_实现冒泡排序

    冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所 ...

  10. C# Winform使用Windows Media Player播放多媒体整理

    一.简单使用示例步骤 1.添加Windows Media Player 组件当前是系统的 Com组件 工具箱>右键“选择项”>选择Com组件 2.控件拖拽到桌面,使用 private vo ...