一文基于IDA进行android反调试检测

1,731 阅读1分钟

信号量检测原理

在android的调试工具中,以IDA动态调试最为强大。IDA会首先截获信号,导致进程无法接收到信号,导致不会执行信号处理函数。将关键流程放在信号处理函数中,如果没有执行,就是被调试状态。

代码实现


#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void Getsigna(int sig)

{

//signal(5, myhandler);

printf("myhandler.\n");

return;

}

int g_ret = 0;

//函数接口调用
int main(int argc, char **argv)
{

// 设置SIGTRAP信号的处理函数为myhandler()
g_ret = (int)signal(SIGTRAP, Getsigna);

if ( (int)SIG_ERR == g_ret )
printf("signal ret value is SIG_ERR.\n");

// 打印signal的返回值(原处理函数地址)
printf("signal ret value is %x\n",(unsigned char*)g_ret);

// 主动给自己进程发送SIGTRAP信号
raise(SIGTRAP);

raise(SIGTRAP);

raise(SIGTRAP);

kill(getpid(), SIGTRAP);

printf("main.\n");

return 0;

}

基于IDA缺陷反调试检测原理

IDA采用递归下降算法来反汇编指令,而该算法最大的缺点在于它无法处理间接代码路径, 无法识别动态算出来的跳转。而arm架构下由于存在arm和thumb指令集,就涉及到指令集 切换,IDA在某些情况下无法智能识别arm和thumb指令,进一步导致无法进行伪代码还原。 在IDA动态调试时,仍然存在该问题,若在指令识别错误的地点写入断点,有可能使得调试 器崩溃。( 可能写断点 ,不知道写ARM还是THUMB ,造成的崩溃)。