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(自定义端口)
未完