|
|
本帖最后由 ggggmllll 于 2023-7-5 14:13 编辑
对网上常用的反调试方案进行了实践,发现不都能用,以下内容是实践总结(测试机:未root的蓝叠模拟器),大佬勿喷
1,调试进程名检测
方案:遍历所有进程,将获取到的进程名与某些固定进程名对比
实现:
- int compareProcess()
- {
- FILE* pfile=NULL;
- char buf[0x1000]={0};
-
- pfile=popen("ps","r");
- if(NULL==pfile)
- {
- //LOGA("SearchObjProcess popen打开命令失败!\n");
- return -1;
- }
- // 获取结果
- //LOGA("popen方案:\n");
- while(fgets(buf,sizeof(buf),pfile))
- {
-
- char* strA=NULL;
- char* strB=NULL;
- char* strC=NULL;
- char* strD=NULL;
- strA=strstr(buf,"android_server");//通过查找匹配子串判断
- strB=strstr(buf,"gdbserver");
- strC=strstr(buf,"gdb");
- strD=strstr(buf,"fuwu");
- if(strA || strB ||strC || strD)
- {
- return 1;
- // 执行到这里,判定为调试状态
-
- }
- }
- pclose(pfile);
- return 0;
- }
复制代码
结果:只获取到了自身进程和一些无关紧要的进程,高版本的android无法获取所有进程
2,Ptrace检测
方案:使用PTRACE_TRACEME占位,使其他进程无法附加
实现:
- extern "C"
- JNIEXPORT jstring JNICALL
- Java_com_test_antidebug_MainActivity_antiDebug(JNIEnv *env, jobject thiz) {
- if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) {
- __android_log_print(ANDROID_LOG_ERROR, "gml", "error: %d", errno);
- return chars2jstring(env, "反调试失败");
- }
- return chars2jstring(env, "反调试成功");
- }
复制代码 结果:没用,selinux限制了ptrace函数,这种反调试形同虚设
3,TracerPid检测
方案:读取/proc/self/status来判断tracer pid是否为0
实现:- extern "C"
- JNIEXPORT jint JNICALL
- Java_com_test_antidebug_MainActivity_getTracerPid(JNIEnv *env, jobject thiz) {
- char buf[1024];
- int pid = 0;
- int fd = open("/proc/self/status", O_RDONLY); //TracerPid: 0
- read(fd, buf, 1024);
- char* tracer = strstr(buf, "TracerPid:");
- sscanf(tracer, "TracerPid:\t%d\n", &pid);
- close(fd);
- return (jint) pid;
- }
复制代码 结果:成功获取tracer pid,比较好用
4,java层的校验方案
本人Java水平较差,有需要可以看看正己大佬的帖子
总结
随着android版本的更新,很多反调试方案无法使用了
lz的水平有限,目前知道的反调试方法只有这么多,欢迎大佬补充
|
|