IDA反调试和反反调试

IDA在动态调试os文件的时候经常遇到在步进的时候或者是在启动的时候直接崩掉

一,端口检测:
IDA调试端口检测
原理:
调试器远程调试时,会占用一些固定的端口号。

做法:
读取/proc/net/tcp,查找IDA远程调试所用的23946端口,若发现说明进程正在被IDA调试。
(也可以运行netstat -apn结果中搜索23946端口)

更改IDA调式默认端口
root@generic:/data/local/tmp # ./as -p31928
IDA Android 32-bit remote debug server(ST) v1.19. Hex-Rays © 2004-2015
Listening on port #31928…

二,关键文件检测:
mv android_server 修改名称

三, 进程id的检测:
在没有调试的时候TraceerPid为0 只要运行调试id会变为你的进程id。只有静态分析os的调用函数的伪代码把判断TraceerPid的函数修改为0

四,java层反调试:
1、在AndroidMainfest.xml文件中,application标签下,
Android:debuggable=true。
2、系统默认调式,在build.prop(boot.img),ro.debugable=1。Android SDK中有android.os.debug类提供了一个isDebuggerConnected方法,用于判断JDWP调式器是否正在工作(以百度加固实例演示java层反调试:会调用这个Debug.isDebuggerConnected函数来检测程序是否被调试反调。使用androidkiller进行反编译,然后搜索isDebuggerConnected ,
修改此处判断条件的samil代码即可。

五,self-debugging反调试:
1.原理:父进程创建一个子进程,通过子进程调试父进程
特点
非常实用、高效的实时反调式技术

优点(可以作为受保护进程的主流反调试方案)
	消耗的系统资源比较少
	几乎不影响受保护进程性能
	可以轻易地阻止其他进程调式受保护的进程
	
缺点
	实现比较复杂

2.实现
1.1 核心ptrace函数
1.2 进程的信号机制

3.注意
进程暂停状态比较多

4.暂停状态
4.1 signal-delivery-stop状态
调试器和被调试进程之间的关系
4.2 group-stop状态(难) sigcont信号
同时满足两个条件:
进程/线程处于被调式状态
被调式进程/线程收到了暂停信号–>重置为0
sigstop
sigtstp
sigttin
sigttou
4.3 syscall-stop状态
4.4 ptrace-event-stop状态

5.反-反调式
1.让父进程不fork
2.把while函数循环去掉
3.不能调试父进程,但可以调式子进程,配合双IDA调式,挂起子进程
IDA反调试和反反调试_第1张图片

六,轮循检测技术:
safe_attach函数
handle_events函数

轮询检测反调试技术基于循环检测进程的状态
目的
判断当前进程是否正在被调试

优点
实现比较简单

缺点
系统资源消耗大

原理
读取进程的/proc/[pid]/status文件,通过该文件得到调式
当前进程的调式器(检测调式器的[pid])

实现:
通过status文件内的TracerPid字段的值判断当前进程或
线程是否正在被调式

status文件信息
Name:进程名称
State:进程的状态
Tgid:一般指进程的名称
Pid:一般指进程Id,他的值与getting函数的返回值相等
PPid:父进程的Id
TraceerPid:实现调试功能的进程Id,值为0表示当前进程未被调试

反-反调试方案:
动态调试时修改TraceerPid字段值为0
修改内核,让TraceerPid字段值为负值

你可能感兴趣的:(逆向)