当前位置: 首页 > news >正文

Android 下通过触发 SIGTRAP 信号实现反调试

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

详细的 Linux 信号列表

Linux 信号是一种用于进程间通信(IPC)和异常处理的机制。以下是详细的 Linux 信号列表,包含信号名称、默认行为及用途

信号编号信号名称默认行为说明
1SIGHUP终止进程终止控制终端或配置文件发生变化时发出。
2SIGINT终止进程来自用户输入(通常是 Ctrl+C)。
3SIGQUIT终止进程并生成core文件来自用户输入(通常是 Ctrl+\)。
4SIGILL终止进程并生成core文件非法指令执行。
5SIGTRAP终止进程并生成core文件调试陷阱。
6SIGABRT终止进程并生成core文件调用 abort 函数时发出。
7SIGBUS终止进程并生成core文件总线错误(内存访问不对齐)。
8SIGFPE终止进程并生成core文件浮点运算错误。
9SIGKILL终止进程强制终止进程,无法被捕获或忽略。
10SIGUSR1终止进程用户自定义信号 1。
11SIGSEGV终止进程并生成core文件无效的内存访问。
12SIGUSR2终止进程用户自定义信号 2。
13SIGPIPE终止进程向没有读取端的管道写入数据时发出。
14SIGALRM终止进程由 alarm 函数发出的定时器信号。
15SIGTERM终止进程请求终止进程,可以被捕获和忽略。
16SIGSTKFLT终止进程协处理器栈错误。
17SIGCHLD忽略子进程停止或终止时发出。
18SIGCONT继续执行让停止的进程继续运行。
19SIGSTOP停止进程停止进程,无法被捕获或忽略。
20SIGTSTP停止进程来自用户输入的停止信号(通常是 Ctrl+Z)。
21SIGTTIN停止进程后台进程尝试从终端读取输入时发出。
22SIGTTOU停止进程后台进程尝试向终端写入输出时发出。
23SIGURG忽略套接字有紧急数据到达时发出。
24SIGXCPU终止进程超出 CPU 时间限制。
25SIGXFSZ终止进程超出文件大小限制。
26SIGVTALRM终止进程虚拟时钟信号,由
27SIGPROF终止进程定时器到期,由
28SIGWINCH忽略终端窗口大小改变时发出。
29SIGIO忽略I/O 事件发生时发出。
30SIGPWR终止进程电源故障时发出。
31SIGSYS终止进程并生成core文件非法的系统调用。

此外,Linux 还支持实时信号(Real-Time Signals),编号从 32 开始,通常是用于用户自定义的信号,应用程序可根据需要使用这些信号。

利用 SIGTRAP 检测调试器

SIGTRAP 是一个陷阱信号,通常由调试器在调试被调试程序时触发。

如果一个程序主动触发 SIGTRAP 信号,并且信号处理函数被成功调用,则意味着没有调试器存在,因为信号并未被拦截。

反之,如果信号处理函数没有被调用,则意味着调试器捕获并处理了该信号,从而可以推测出程序正处于被调试状态。

Android下反调试的流程

1. 我们通过 JNI 调用 C 代码来设置一个 SIGTRAP 信号处理器。

2. 当触发 SIGTRAP 时,信号处理器将会捕获信号。如果信号处理器成功处理了信号,则表明没有调试器。

3. 如果调试器存在,SIGTRAP 信号不会到达我们的信号处理器,程序将检测到这一情况并在 3 秒后退出。

Android下反调试实现

1. 定义信号处理器并检测调试器

首先,我们在 C 代码中编写反调试逻辑,核心是通过 raise(SIGTRAP) 触发 SIGTRAP 信号,并判断信号是否被捕获。

#include <jni.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <android/log.h>#define LOG_TAG "AntiDebug"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)// 标志变量,判断 SIGTRAP 是否被捕获
volatile int sigtrap_caught = 0;// SIGTRAP 信号处理函数
void sigtrap_handler(int sig) {LOGI("Caught SIGTRAP. No debugger present.");sigtrap_caught = 1; // 标记 SIGTRAP 被捕获
}// JNI 方法,触发 SIGTRAP 信号并检测调试器
JNIEXPORT jboolean JNICALL
Java_com_cyrus_example_antidebug_AntiDebug_detectDebugger(JNIEnv *env, jobject instance) {// 注册 SIGTRAP 处理器signal(SIGTRAP, sigtrap_handler);// 触发 SIGTRAP 信号raise(SIGTRAP);// 检查信号是否被捕获if (sigtrap_caught) {LOGI("No debugger detected.");return JNI_FALSE; // 没有检测到调试器} else {// 如果信号未被捕获,说明有调试器LOGI("Debugger detected! The program will exit in 3 seconds...");sleep(3); // 等待 3 秒exit(EXIT_FAILURE); // 退出程序return JNI_TRUE; // 返回 true,表示检测到调试器}
}

配置 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.4.1)find_library( # 查找 log 库log-lib# 库名log )add_library( # 库名称antidebug# 库类型SHARED# 源文件anti_debug.c )target_link_libraries( # 绑定库到 log 库antidebug${log-lib} )

2. Kotlin 层调用 JNI 方法

在 Kotlin 层,我们通过 JNI 调用 detectDebugger 函数,以检测是否存在调试器。根据结果,程序可以作出不同的响应。

package com.cyrus.example.antidebugimport android.util.Logobject AntiDebug {init {// 加载 native 库System.loadLibrary("antidebug")}external fun detectDebugger(): Booleanfun isDebuggerDetected(): Boolean {val detected = detectDebugger()if (detected) {Log.i("AntiDebug", "Debugger detected!")} else {Log.i("AntiDebug", "No debugger detected.")}return detected}
}

3. 调用反调试功能

val debuggerDetected = AntiDebug.isDebuggerDetected()
if (debuggerDetected) {Toast.makeText(this, "Debugger Detected", Toast.LENGTH_SHORT).show()
} else {Toast.makeText(this, "No Debugger Detected", Toast.LENGTH_SHORT).show()
}

测试反调试

1. 无调试状态

无调式状态 App 中点击 “SIGTRAP 反调试” 按钮调用反调试功能,未检测到调试器,程序正常运行。
image.png

2. 调试状态下

通过 IDA Pro 附加到当前应用
image.png
关于如何使用 IDA Pro 动态调试 Android App 可以参考这篇文章【使用IDA Pro动态调试Android APP】

App 中点击 “SIGTRAP 反调试” 按钮调用反调试功能,SIGTRAP 信号 被 IDA Pro 调试器捕获。
image.png

触发程序反调试机制,程序在 3 秒后退出。
image.png

源码

完整源码:https://github.com/CYRUS-STUDIO/AndroidExample

相关文章:

Android 下通过触发 SIGTRAP 信号实现反调试

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 详细的 Linux 信号列表 Linux 信号是一种用于进程间通信&#xff08;IPC&#xff09;和异常处理的机制。以下是详细的 Linux 信号列表&#xff0c;包含信号名…...

【MySQL】 表的增删操作

目录 1.Create&#xff08;增&#xff09; 1.1.单行数据 全列插入 1.2.多行数据 指定列插入 1.3.插入否则更新 1.4.替换数据&#xff08;REPLACE&#xff09; 2.Delete&#xff08;删&#xff09; 2.1.删除表中的某个条目 2.2.删除整张表数据 2.3.截断表 1.Create…...

新生入门季 | 学习生物信息分析,如何解决个人电脑算力不足的问题?

随着生物信息学在科研和教育中的快速普及&#xff0c;越来越多的新生开始接触基因组测序、RNA分析等复杂计算任务。然而&#xff0c;在面对这些大规模数据时&#xff0c;个人电脑的算力往往显得捉襟见肘。你是否也在为自己的笔记本性能不足而苦恼&#xff1f; 这篇文章将为你提…...

20255 - 中医方剂学 - 考研 - 执业

第1章 总论 1.我国现存最早的记载方剂的医书是&#xff08;&#xff09;( ) [单选] A.《太平圣惠方》 B.《黄帝内经》 C.《五十二病方》 D.《千金要方》 E.《外台秘要》 正确答案: C 2.我国最早的中医经典理论著作是&#xff08;&#xff09;( ) [单选] A.《伤寒杂病论…...

【Vue.js设计与实现】第三篇第9章:渲染器-简单Diff算法-阅读笔记

文章目录 9.1 减少 DOM 操作的性能开销9.2 DOM 复用与 key 的作用9.3 找到需要移动的元素9.4 如何移动元素9.5 添加新元素9.6 移除不存在的元素 系列目录&#xff1a;【Vue.js设计与实现】阅读笔记目录 当新旧vnode 的子节点都是一组节点时&#xff0c;为了以最小的性能…...

服务器软件之Tomcat

服务器软件之Tomcat 服务器软件之Tomcat 服务器软件之Tomcat一、什么是Tomcat二、安装Tomcat1、前提&#xff1a;2、下载3、解压下载的tomcat4、tomcat启动常见错误4.1、tomcat8.0 startup报错java.util.logging.ErrorManager: 44.2、java.lang.UnsatisfiedLinkError 三、Tomca…...

Flutter包管理(三)

1、作用 在APP的实际开发过程中往往会依赖很多包&#xff0c;而这些包之间存在着交叉依赖、版本依赖&#xff0c;由开发者自己管理手动管理会非常麻烦&#xff0c;每种开发生态或编程官方会提供一些包的管理工具&#xff0c;在Flutter中我们在pubspec.yaml文件中来管理第三方依…...

CGNS资料

CGNS数据文件 资料 CFD General Notation System CGNS Converters vtkCGNSReader cgnsToFromFoam Example Computer Codes 8.1.2. CGNS Mesh Format and Multizone Interface Connectivity 8 Multizone Interface Connectivity pyvista.cgnsreader CGNS for MATLAB and Octave…...

论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文&#xff1a;Deep Residual Learning for Image Recognition   论文链接&#xff1a;Deep Residual Learning for Image Recognition   代码链接&#xff1a;Github 1.介绍 在ResNet网络提出之前&#xff0c;传统的卷…...

Dubbo 序列化方式

Hession 这是dubbo的默认序列化协议&#xff0c;是一种二进制协议&#xff0c;他的特点是序列化的速度比较快&#xff0c;并且序列化的数据体积比较小。Hession适合于大部分场景&#xff0c;因此被选为dubbo的默认序列化协议。 Json Json是一种基于文本的序列化方式&#xf…...

如何替换OCP节点(二):使用 antman脚本 | OceanBase应用实践

前言&#xff1a; OceanBase Cloud Platform&#xff08;简称OCP&#xff09;&#xff0c;是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中&#xff0c;OCP的安装通常是第一步&#xff0c;先搭建OCP平台&#xff0c;进而依赖OCP来创建、管理和监控我们的生…...

15.JVM垃圾收集算法

一、垃圾收集算法 1.分代收集理论 分代收集理论是JAVA虚拟机进行垃圾回收的一种思想&#xff0c;根据对象存活周期的不同将内存分成不同的几个区域&#xff1b;一般将JAVA堆内存分为新生代和老年代&#xff1b;根据每个分代特点选择不同的垃圾收集器&#xff1b; 在新生代中&am…...

软件工程:图书管理系统甘特图

1 实验目的 熟悉GanttProject 软件环境&#xff0c;能够使用GanttProject绘制甘特图,进行项目管理与规划。 2 实验内容 为小型图书管理系统项目的实施计划绘制甘特图。 小型图书管理系统项目包含登录、浏览、管理读者、管理图书资料、管理书目、登记借书、登记还书、预定图书、…...

视频的编解码格式

文章目录 视频的编解码格式概念术语视频处理流程视频封装格式视频编码格式视频编解码器&#xff0c;视频容器和视频文件格式之间的区别补充视频码率 参考资料 视频的编解码格式 概念术语 两大组织主导视频压缩的组织及其联合(joint)组织 ITU-T(VCEG) ITU-T的中文名称是国际电信…...

网络资源模板--Android Studio 实现简易新闻App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易新闻App 二、项目测试环境 三、项目详情 登录页 用户输入&#xff1a; 提供账号和密码输入框&#xff0c;用户可以输入登录信息。支持“记…...

LabVIEW提高开发效率技巧----离线调试

离线调试是LabVIEW开发中一项重要的技巧&#xff0c;通过使用Simulate Signal Express VI生成虚拟数据&#xff0c;开发者能够有效减少对实际硬件的依赖&#xff0c;加速开发过程。这种方法不仅可以提高开发效率&#xff0c;还能降低成本&#xff0c;增强系统的灵活性。 ​ 离…...

6N137S1取反电路图

文章目录 一、前言二、6N137S1性能介绍三、应用电路图 一、前言 在硬件电路设计中需要用到隔离电路&#xff0c;但此引脚输出为WS2812的信号&#xff0c;频率有840khz&#xff0c;所以需要使用逻辑光耦&#xff0c;选用6N137S1光耦&#xff0c;速率能达到10Mhz&#xff0c;能满…...

Nullinux:一款针对Linux操作系统的安全检测工具

关于Nullinux Nullinux是一款针对Linux操作系统的安全检测工具&#xff0c;广大研究人员可以利用该工具针对Linux目标设备执行网络侦查和安全检测。 该工具可以通过SMB枚举目标设备的安全状况信息&#xff0c;其中包括操作系统信息、域信息、共享信息、目录信息和用户信息。如…...

学会这 5 个 AI 神器做字体设计,保证让你私单接到爆!

最近我在浏览 AI 绘画的相关内容时&#xff0c;发现不少图像都是与字体相关的&#xff0c;而且其中一些呈现出的艺术特效很是让人眼前一亮。 放在之前&#xff0c;我们需要掌握一些专业技能、并花费大量时间才能设计出精致酷炫的艺术字&#xff0c;但是现在却可以轻松用文本直…...

《Vue3 踩坑》expose 和 defineExpose 暴露属性或方法注意事项

选项式写法 使用 选项式API - 状态选项 - expose 一定要注意&#xff1a; 接下来&#xff0c;进一步看示例说明&#xff1a; 设置 expose 仅显示列出的属性/方法才能被父组件调用&#xff1b;代码第 2 行&#xff0c;父组件可访问属性 a 和 方法 myFunc01&#xff0c;不可访…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...