信号量检测原理
在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 ,造成的崩溃)。