泊头网站排名优化,做网站平台需要多少钱,免费加速器试用一小时,网站换肤代码版权归作者所有#xff0c;如有转发#xff0c;请注明文章出处#xff1a;https://cyrus-studio.github.io/blog/ 详细的 Linux 信号列表
Linux 信号是一种用于进程间通信#xff08;IPC#xff09;和异常处理的机制。以下是详细的 Linux 信号列表#xff0c;包含信号名… 版权归作者所有如有转发请注明文章出处https://cyrus-studio.github.io/blog/ 详细的 Linux 信号列表
Linux 信号是一种用于进程间通信IPC和异常处理的机制。以下是详细的 Linux 信号列表包含信号名称、默认行为及用途
信号编号信号名称默认行为说明1SIGHUP终止进程终止控制终端或配置文件发生变化时发出。2SIGINT终止进程来自用户输入通常是 CtrlC。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停止进程来自用户输入的停止信号通常是 CtrlZ。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 反调试” 按钮调用反调试功能未检测到调试器程序正常运行。
2. 调试状态下
通过 IDA Pro 附加到当前应用 关于如何使用 IDA Pro 动态调试 Android App 可以参考这篇文章【使用IDA Pro动态调试Android APP】
App 中点击 “SIGTRAP 反调试” 按钮调用反调试功能SIGTRAP 信号 被 IDA Pro 调试器捕获。
触发程序反调试机制程序在 3 秒后退出。
源码
完整源码https://github.com/CYRUS-STUDIO/AndroidExample