android 反调试(TracePid 不断轮询检查 JAVA )

Android下反调试与反反调试 TracerPid: 16208 说明当前的进程正在被进程 16208 调试或跟踪,否则没有被调试值应该为0。使用 cat 命令查看 /proc/[pid]/wchan 文件,该文件显示进程当前正在等待的内核函数。再通过 head /proc/[pid]/status 可以查看详细的进程状态,包括是否被调试等信息。在输出中,ptrace_stop 表示进程 17305 当前正在被调试器暂停,等待调试器发出的命令。通过head /proc/[pid]/status 可以查看详细的进程状态。 阅读详情

在android 中,在调试状态下,linux会向/proc/"进程PID"/status 中写入状态信息。其中TracePid 就是调试该进程的进程的的Pid,所以反调试的方法之一就是通过不断轮询检查TracePid的值,假如为0的话,说明该进程没有被调试,假如不为0的话,就说明当前该进程正在被调试,程序执行exit(0)操作。

我直接用一个类来包装我的adb shell:

先通过getpid()函数来查找当前我们程序的pid.然后利用Runtime.getRuntime.exec()函数来执行adb 命令,然后通过BufferReader来读取status 并放入String中。

public final class RootCmd {
   public static String GetTracePid(){
       int pid =getpid();
       String ss=String.valueOf(pid);
       Process p = null;
       try {
           p = Runtime.getRuntime().exec("cat /proc/"+ss+"/status");
       } catch (IOException e) {
           e.printStackTrace();
       }
       String data = null;
       BufferedReader ie = new BufferedReader(new InputStreamReader(p.getErrorStream()));
       BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
       String error = null;
       try {
           while ((error = ie.readLine()) != null
                   && !error.equals("null")) {
               data += error + "\n";
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
       String line = null;
       try {
           while ((line = in.readLine()) != null
                   && !line.equals("null")) {
               data += line + "\n";
           }
       } catch (IOException e) {
           e.printStackTrace();
       }

       Log.v("ls", data);
       String tmp=data.split("\n")[7];
       tmp=tmp.replace("TracerPid:","");
      // Log.i("TracePid",tmp);
       return tmp;
   }

在MainActivity中利用线程不断轮询执行该函数,因为toast只能在主线程中执行,所以利用handleMessage向主线程发送消息。我这里没有用Timer来实现不断轮询执行,我用的是线程的sleep函数

public class MainActivity extends AppCompatActivity {
    private Handler handler ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler=new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 0) {
                    Toast toast = Toast.makeText(getApplicationContext(), "程序没有正在被调试", Toast.LENGTH_LONG);
                    //显示toast信息
                    //toast 只能在主线程中执行,所以利用handeler message 向主线程发送消息
                    toast.show();

                }
                if (msg.what == 1) {
                    Toast toast = Toast.makeText(getApplicationContext(), "程序正在被调试", Toast.LENGTH_LONG);
                    //显示toast信息
                    toast.show();
                    exit(0);
                }
            }
        };
      /* Log.i("SSSSS", "调试开始了");
        int pid =getpid();
        String ss=String.valueOf(pid);
        Log.i("SSSSS",ss);
       Toast toast=Toast.makeText(getApplicationContext(),ss, Toast.LENGTH_LONG);
        //显示toast信息
       toast.show();*/
        //利用线程的sleep 定时轮询检查TracePid
        new Thread() {
            @Override
            public void run() {
                //这里写入子线程需要做的工作
                int flag=1;
                while(flag!=0) {
                    String Tracepid = RootCmd.GetTracePid().trim();  //执行adb命令,查找当前程序是否正在被调试
                    int Trace = Integer.valueOf(Tracepid).intValue();
                    if (Trace != 0) {
                        Log.i("TracePid", "程序正在被调试");
                        Message message=new Message();
                        message.what=1;
                        handler.sendMessage(message);
                    } else {
                        Log.i("TracePid", "程序没有正在被调试");
                        Log.i("TracePid", Tracepid);
                        Message message=new Message();
                        message.what=0;
                        handler.sendMessage(message);
                    }
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }




}

 

Python-编写点云处理软件(二)点云软件ui制作之仿CC界面 至本篇结束,我们已经能够获得一个有点模子的界面了,但是具体的功能还没有编写,后续的文章将逐渐完善功能。 阅读详情

相关推荐

Cadence ADE实战:1GHz VCO相位噪声仿真全流程(附PSS/Pnoise避坑指南)

本文详细介绍了在Cadence ADE环境中对1GHz VCO进行相位噪声仿真的完整流程。重点剖析了PSS(周期性稳态分析)和Pnoise(周期性噪声分析)两大核心引擎的关键参数设置与避坑指南,帮助射频与模拟IC设计者准确评估VCO性能,解决仿真不收敛、结果异常等常见问题。

rock5的博客 668

一文实现通过系统底层对抗反调试检测

无论你是去B站或者是油管上面都有很多网络安全的相关视频可以学习,当然如果你还不知道选择那套学习,我这里也整理了一套和上述成长路线图挂钩的视频教程,完整版的视频已经上传至优快云官方,朋友们如果需要可以点击这个链接免费领取。安卓的native下,是运用醉倒的反调试方案是通过读取进程的status或stat来检测tracepid,它主要原理是调试状态下的进程tracepid不为0。对于这种调试检测手段,因为android系统是开源的,所以最彻底的绕过方式就是修改系统源码后重新编译,让tracepid永远为0。

qq_44005305的博客 266

DeepSeek Harness桌面版安装教程:从零配置到实用插件推荐

在AI编程工具逐步普及的今天,开发者越来越关注如何将大模型能力无缝融入日常编码流程。这类工具的核心在于构建一个连接模型服务与本地开发环境的中间层,通过项目级上下文理解、终端指令执行和插件机制,让AI真正成为能动手干活的编程副驾驶。安装配置过程中,环境准备、模型服务连接与工具权限设置是三个关键环节。完成基础搭建后,选择合适的插件能显著提升代码质量与问题排查效率,例如基于代码审查的规范对齐和安全扫描,以及面向运行时日志关联分析与性能告警的诊断工具。本文以DeepSeek Harness桌面版为例,从环境自查、安

weixin_31286719的博客 306

Android代码保护与反调试方案

Android代码保护与反调试方案

IT从业者,生活精致一点,工作认真一点! 1523

蓝牙 - 如何在Windows下抓取蓝牙数据

选择Windows Instarller(64-bit),最好不要选择PortableApps版,因为后面需要通过btvs.exe来启动Wireshark,如果是绿色可移植版,会启动失败。在安装完以后,找到btvs.exe文件,位于路径:C:\BTP\v1.14.0\x86下,这个视安装版本不同路径名不同。在第一台机器上启动btvs.exe,第二台机器上手动启动wireshark,并将第一台机器的IP地址作为参数。1,同一机器上,Wireshark安装后,会自动直接启动,如上面使用方式一样。

guoqx的专栏 2万+

使用 Simulink + Simscape Electrical 实现一个三相电压型PWM整流器的仿真模型

三相电压型PWM整流器(Voltage Source PWM Rectifier, VSR)是一种先进的电力电子装置,它不仅可以将交流电转换为直流电,还能实现单位功率因数操作,即输入电流与输入电压同相位。这不仅提高了电网质量,减少了谐波污染,而且提高了整个系统的效率。本文将详细介绍如何使用实现一个三相电压型PWM整流器的仿真模型,并探讨其在单位功率因数下的控制策略和仿真结果。本文详细介绍了如何使用搭建一个三相电压型PWM整流器的仿真模型,并对其在单位功率因数下的控制策略进行了探讨。

amy_mhd的博客 128

[安卓逆向]常见调试和反调试及解决方案

我们在逆向软件时难免会遇到一些反调试策略,这篇文章就来详细总结下,现阶段比较流行的几种反调试策略及解决方案。

杰孑的博客 4698

VMware Horizon 8 2111 部署系列(九)创建即时克隆桌面池

即时克隆桌面池是在 vCenter Server 中使用 vmFork 技术(称为即时克隆 API)从最佳配置映像创建的自动桌面池。即时克隆共享同一个基础映像虚拟机,使用基础映像虚拟机的快照创建的,它使用的存储空间也少于完整虚拟机。 即时克隆始终保持开机状态,并在注销后从当前发布的映像重新创建。...

白昼的技术专栏 4042

android 多线程反调试,android 反调试(TracePid 不断轮询检查 JAVA )

android 反调试(TracePid 不断轮询检查 JAVA )android 反调试(TracePid 不断轮询检查 JAVA )在android 中,在调试状态下,linux会向/proc/"进程PID"/status 中写入状态信息。其中TracePid 就是调试该进程的进程的的Pid,所以反调试的方法之一就是通过不断轮询检查TracePid的值,假如为0的话,说明该进程没有被调试,假如...

weixin_30803191的博客 384

从零开始创建Davinci Configurator配置工程

本文介绍了从零开始搭建达芬奇工程的详细步骤。首先安装Vector的CBD包后,通过DavicCFG.exe新建空白ECU工程。文章提到Postbuild相关概念可参考往期文章《AUTOSAR配置中的PostBuild、Precompile、Linktime》,并预告下期将讲解如何通过导入DBC文件来启用AUTOSAR模块。全文以实操截图为主,步骤清晰简明,适合开发者参考备份。

Xiaowestwind的博客 217

Mstar的Monitor方案OSD 菜单制作(五)——icon绘制

Mstar的Monitor方案(五)————绘制icon

android 系统定制开发那些事 1807

浅谈android反调试之轮询TracePid(解决方案是特色)

浅谈android反调试之轮询TracePid(解决方案是特色)

kodmoqn的博客 274

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

移动安全入门

移动安全入门 编写安卓程序 xml界面类似于web的界面 layout为布局,wrap_content为填充布局,表示填充满 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.andr

playmaker的博客 364

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux pid nr ns,尝试绕过TracerPID反调试

安装MinGW, 在官网下好之后, 右键按下图选中要下载的,之后直接在Installation中直接选中Apply change即可。进入安装目录\MinGW\bin, 将gcc.exe重命名为cc.exe, 就短暂地这样改就好了,之后用完make工具再改回来。反正我没找到哪里可以改Makefile的内容(小辣鸡)。不这样修改的话会出现如下报错:具体原因好像是MinGW的bug, 在Linux环境...

weixin_42305163的博客 543

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 反调试 方案,android反调试之tracerPid检测

#include #include #include #include #include #define TRACERPID "TracerPid:"#define TRACERPID_LEN (sizeof(TRACERPID) - 1)void loop(){while(true){sleep(60);}}bool check_debugger(pid_t pid){const int pat...

weixin_32120857的博客 564

移动安全面试题—调试&反调试

对抗方法:使用内核模块或 Xposed 插件拦截对 /proc/self/status 的读取,将 TracerPid 字段设置为 0。对抗方法:使用内核模块或 Xposed 插件拦截对 /proc/self/maps 的读取,移除与调试器相关的内存映射信息。检测 /proc/self/status 中的 TracerPid 字段:如果该字段的值不为 0,则表示有调试器附加。修改 /proc/self/status 中的 TracerPid 字段,伪装成无调试器附加的状态。可能需要结合静态和动态分析工具。

Andy0214的专栏 5336

Android逆向-基础与实践 (六) 反调试

反制手段1.算法助手、对话框取消等插件一键hook2.分析具体的检测代码3.利用IO重定向使文件不可读4.修改Andoird源码,去除常见指纹定义了一个和。方法检查设备的build tags是否包含test-keys。这通常是用于测试的设备,因此如果检测到这个标记,则可以认为设备已被 root。方法检查设备是否存在一些特定的文件,这些文件通常被用于执行 root 操作。如果检测到这些文件,则可以认为设备已被 root。方法使用方法来执行which su命令,然后检查命令的输出是否不为空。

shuwangyong的专栏 987

linux trace 进程,使用trace或ltrace 诊断linux下软件的“疑难杂症”

当我们在linux下发现进程无法正常启动或者软件的运行速度突然变慢,那么我们如何去诊断问题到底出在什么地方?下面我们通过案例来看下在linux系统下如何去诊断这些疑难杂症。在这里我们需要用到linux系统下的两个命令,strace和lltrace,首先我们需要了解下这两个命令分别是做什么的,以及如何使用。strace用来跟踪一个进程的系统调用或信号产生的情况,ltrace用来跟踪进程调用库函数的情...

weixin_39733232的博客 1171

安卓 反调试 环境检测点汇总 hook( 面具 xp ida frida )检测点 和 绕过策略

属于到处收集的资料和工作中碰到的,在此感谢文末出处链接的作者 我把他们分为三大部分,由浅至深,实际上检测点实在太多了,肯定不全的,如果有漏掉的麻烦大佬在评论区指出 Java 在java层检测的实际很容易就能找到,因为app反调试的反映只有几种 闪退 弹窗 卡启动页 实际上甚至可以无视上面几种,无脑hook所有函数,再过滤掉启动必须的函数就能找到 1.应用主动申请root权限 来源: https://www.cnblogs.com/android-er/p/5478298.html 主要是这一条命令 .

arr的博客 1万+

安卓反调试实现

不多说了,直接上源码,8种反调试方法。 1.//ptrace自己,使得android_server附加不上 void anti_debug01() { ptrace(PTRACE_TRACEME, 0, 0, 0); } 2.//检测Tracepid的值 void anti_debug02() { try { const int bufsize = 1024; char filename[bufsize]; char line[bufsize]; int pid = getpid(); sprintf(fi

深耕安全技术研究 3194

Android反调试检测

java层保护 1 代码混淆 apk应用在被逆向分析时,java层代码就像被扒光一样,而native代码分析难度大,但是需要扎实的c/c++基础。这个时候大家就可以考虑一下代码混淆技术稍作保护(毕竟看着好多abc也挺烦的)。Android开发中提供了Proguard这一工具来进行代码混淆。 这里只做简单介绍,Proguard是一个开源项目,他能够对Java类中的代码进行压缩(Shrink),优化(...

re_psyche的博客 3011

Android反调试方法总结以及源码实现之检测篇(一)

好久没有更新博客了,主要是忙项目的事,今日总结一下在Android中常遇到的反调试方法,一来帮助需要之人,二来加深自己的理解。 反调试在代码保护中扮演着很重要的角色,虽然不能完全阻止攻击者,但是还是能加大攻击者的时间成本,一般与加壳结合使用,核心还是加壳部分。 反调试可以分为两类:一类是检测,另一类是攻击,前者是去想各种办法去检测程序是否在被调试,如果正在被调试的话做出一些“反”的举措,比

雪一梦的博客 2万+

Android反调试笔记

转:http://my.oschina.net/cve2015/blog/734381 1)代码执行时间检测 通过取系统时间,检测关键代码执行耗时,检测单步调试,类似函数有:time,gettimeofday,clock_gettime. 也可以直接使用汇编指令RDTSC读取,但测试ARM64有兼容问题。 time_t t1, t2; time (&t1); /* Parts of

zhangmiaoping23的专栏 3049

android 反编译、反调试方法总结

0x01 前言 最近在分析的很多应用都使用了XXX加固,研究半月未见成效,原因是对反调试的方法和原理不够熟悉,导致无法对程序进行进一步分析和调试,故整理收集现有调试和反调试方法以便加深理解。 ...

qq_34108752的博客 786
上一篇: android adb命令
下一篇: Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记
Viewz
博客等级 码龄9年 309粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值