so层反调试的17种反调试方法以及反反调试的方法

1.检测ida远程调试所占的常用端口23946,是否被占用

//检测idaserver是否占用了23946端口
void CheckPort23946ByTcp() {
    FILE* pfile=NULL;
    char buf[0x1000]={0};
    //执行命令
    char* strCatTcp="cat /proc/net/tcp | grep :5D8A";
    //char* strNetstat="netstat -apn | grep :23946"
    pfile=popen(strCatTcp,"r");
    //说明是没有被调试
    if(NULL==pfile)
    {
        return;
    }
    //获取执行命令后的结果,并存入buf字符数组中
    while(fgets(buf,sizeof(buf),pfile))
    {
        printf("执行 cat /proc/net/tcp | grep :5D8A的结果:\n");
        printf("%s",buf);
    }
    pclose(pfile);
}

上面的netstat -apn | grep 23946 那个-apn是必须加的,之前看大佬的pdf好像漏了

反反调试方法:

1.直接nop掉

2.汇编级直接改寄存器值绕过

3. 既然是检测23946端口,那我就不运行在23946端口了,换一个端口运行

二.调试器进程名检测

原理: android调试时需要运行androidserver,androidserver64,gdb,gdbserver等进程

反调试代码:

void SerachObjectProcess()
{
    FILE* pfile=NULL;
    char buf[0x1000]={0};
    //执行命令
    //pfile=popen("ps | awk'{print $9}'","r");
    pfile=popen("ps","r");
    if(pfile==NULL) {
        printf("命令打开失败");
        return;
    }
    //获取查询结果
    while(fgets(buf,sizeof(buf),pfile))
    {
        //打印进程
        printf("遍历进程:%s\n",buf);
        //查找子串
        char* strA=NULL;
        char *strB = NULL;
        char *strC=NULL;
        char *strD=NULL;
        //IDA检测
        strA=strstr(buf,"android_server");
        //gdb检测
        strB=strstr(buf,"gdbserver");
        strC=strstr(buf,"gdb");
        strD=strstr(buf,"fuwu");
        if(strA||strB||strC||strD) {
            printf("被调试了,%s\n", buf);
            return;
        }
    }
    pclose(pfile);

}

反反调试:

直接修改调试器server的名字,运行的话./and -p xxxx(自定义端口) 

未完

上一篇:在两台电脑安装Simphony


下一篇:Oracle参数文件—pfile与spfile