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. BZOJ.3676.[APIO2014]回文串(回文树)

    BZOJ 洛谷 很久之前写(抄)过一个Hash+Manacher的做法,当时十分懵逼=-= 然而是道回文树模板题. 回文树教程可以看这里(真的挺妙的). 顺便再放上MilkyWay的笔记~ //351 ...

  2. Django——ModuleNotFoundError: No module named 'asgiref.sync'

    Django+channels运行时报错 Unhandled exception in thread started by <function check_errors.<locals&g ...

  3. Android 指定 Theme

    在 application 标签中添加 android:theme="@android:style/Theme.Holo.Light.NoActionBar"

  4. 网络吞吐量 [CQOI2015] [网络流]

    Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择 ...

  5. Python 调用图像融合API

    Python 调用图像融合API 本文记录使用Python,调用腾讯AI开放平台的图像融合API.官网给出的Demo用的是PHP,博主作为Python的粉丝,自然想用它来和『最好的』的语言一较高下,顺 ...

  6. jmeter接口测试实例4-学生金币充值

    Jmeter实例4:学生金币充值 添加http协议—添加IP.路径.方法,添加cookie管理器,察看结果树如下图所示 输入管理员名称:niuhanyang,输入值,域,如下图所示: 输入必填参数,运 ...

  7. gravity 和 layout_gravity

    gravity : 是控件内部的内容的对齐方式. layout_gravity: 是控件相对于其容器的对齐方式. 如果 LinearLayout  的  android:orientation=&qu ...

  8. Vue(八)发送跨域请求

    使用vue-resource发送跨域请求 axios不支持跨域 1 安装vue-resource并引入 cnpm install vue-resource -S 2 基本用法 使用this.$http ...

  9. 使用 OpenSessionInViewFilter 配置加载

    1.使用 OpenSessionInViewFilter

  10. poj2376 Cleaning Shifts(区间贪心,理解题意)

    https://vjudge.net/problem/POJ-2376 题意理解错了!!真是要仔细看题啊!! 看了poj的discuss才发现,如果前一头牛截止到3,那么下一头牛可以从4开始!!! # ...