通过inotify实现反调试

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);

}

时间: 2024-11-09 00:11:44

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

修改Android手机内核,绕过反调试

0x1.手机设备环境 Model number: Nexus 5 OS Version: Android 4.4.4 KTU84P Kernel Version: 3.4.0-gd59db4e 0x2.Android内核提取 查找Android设备的boot分区文件.高通芯片的设备可以通过下面的命令进行查找. cd /home/androidcode/AndroidDevlop/modifyNexus5Boot adb shell ls -al /dev/block/platform/msm_s

Windows 下常见的反调试方法

稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的BeingDebugged标志来判断是否处于调试状态. if (IsDebuggerPresent()) //API接口 { AfxMessageBox(L"检测到调试器"); } else { AfxMessageBox(L&qu

反调试技术

反调试技术在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术,首先我们来看看反调试技术. 一.Windows API方法 Win32提供了两个API, IsDebuggerPresent和CheckRemoteDebuggerPresent可以用来检测当前进程是否正在被调试,以IsDebuggerPresent函数为例,例子如下: BOOL ret

源码编译绕过反调试

参考师弟的贴子修改的, 基本我一次就弄好了, 没有遇到啥问题, 下面我主要是补充下他的帖子 http://bbs.pediy.com/showthread.php?t=213481 一. 环境搭建 (1). 环境介绍: 手机:nexus 5 ubuntu版本:15.10 android版本:4.4.4 android源码官网(这里有很多相关的资料,基本上按照官网的来就可以编译想编译的任何版本了) http://source.android.com/source/ (2). 环境配置 配置环境得好

SEH反调试的实现与调试

SEH用于反调试或者用于注册码的隐藏时.在没有异常时永远都是错误的注册码,只有当触发异常时,程序才走到注册成功的地方-- 代码如下: void CSehDlg::RegSuc() { HWND hWnd = ::GetDlgItem(NULL, IDC_STC_TIP); ::SetWindowText(hWnd, "Success!!"); } void CSehDlg::RegFail() { HWND hDlgWnd = AfxGetApp()->GetMainWnd()-

浅谈Android反调试 之 PTRACE_TRACEME

反调试原理: 关于Ptrace:  http://www.cnblogs.com/tangr206/articles/3094358.html ptrace函数 原型为: #include <sys/ptrace.h>long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);ptrace有四个参数:  1). enum __ptrace_request request:指示了ptrace要执行的命

Android逆向之旅---应用的&quot;反调试&quot;方案解析(附加修改IDA调试端口和修改内核信息)

一.前言 在前一篇文章中详细介绍了Android现阶段可以采用的几种反调试方案策略,我们在破解逆向应用的时候,一般现在第一步都回去解决反调试,不然后续步骤无法进行,当然如果你是静态分析的话获取就没必要了.但是有时候必须要借助动态调试方可破解,就需要进行操作了.现阶段反调试策略主要包括以下几种方式: 第一.自己附加进程,先占坑,ptrace(PTRACE_TRACEME, 0, 0, 0)!第二.签名校验不可或缺的一个选择,本地校验和服务端校验双管齐下!第三.借助系统api判断应用调试状态和调试属

强大反调试cm的奇葩破解

系统 : Windows xp 程序 : Crackme-xp 程序下载地址 :http://pan.baidu.com/s/1slUwmVr 要求 : 编写注册机 使用工具 : OD & IDA 可在看雪论坛中查找关于此程序的破文:传送门 这是一个拥有强大反调试机制的cm,无法查询到关键子串.下获取窗口文本的断点没用,设置对按钮下消息断点都没用. 然后用IDA打开后却发现了函数表里有: .................. 这个懂点英文的人都能看出来是 注册按钮的处理函数吧?所以前面那么多防护

Linux下的反调试技术

Linux下的反调试技术 2014年01月30日 ⁄ 综合 ⁄ 共 2669字 ⁄ 字号 小 中 大 ⁄ 评论关闭 转自  http://wangcong.org/blog/archives/310 如何防止自己的程序被调试器跟踪,这是一个很有趣的话题,也是反逆向工程中的一个重要话题.这里简单介绍一下Linux平台上的反调试技术. (本文主要参考:http://blog.txipinet.com/2006/10/05/37-tecnicas-anti-debugging-sencillas-pa