ETM恶意程序透明检测:Anti-Debug

ETM恶意软件透明分析测试过程中比较常用的内容:ptrace和int3

ptrace

ptrace 是一个系统调用,用于在 Unix-like 操作系统中进行进程间的调试。它允许一个进程(通常是调试器)观察和控制另一个进程的执行。这个调用通常用于调试器(如 GDB)实现,以便它们可以监视和修改另一个进程的执行,包括读取和写入其内存、寄存器和执行控制。
使用ptrace时,通常需要编写一个调试器程序,它将附加到目标进程并与其交互

一般使用过程

  1. 包含头文件
  2. 附加到目标进程:使用 ptrace 的 PTRACE_ATTACH 参数将调试器附加到目标进程。
    long pid = target_process_id;  // 目标进程的进程ID
    if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {
        perror("ptrace attach");
        // 处理错误
    }
    
    
  3. 等待目标进程信号: 一旦附加成功,目标进程会生成 SIGSTOP 信号,使其暂停。可以使用 waitpid 函数等待目标进程停止
    int status;
    waitpid(pid, &status, 0);
    
  4. 执行调试操作: 一旦目标进程被暂停,可以使用不同的 ptrace 请求进行调试操作,例如读取和写入寄存器、内存,单步执行等。例如,使用 PTRACE_PEEKDATA 读取目标进程的内存
    // 从目标进程的地址 addr 读取一个字(4个字节)的数据
    long data = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);	
    
  5. 分离调试器: 在调试完成后,使用 PTRACE_DETACH 请求将调试器从目标进程分离
    if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1) {
        perror("ptrace detach");
        // 处理错误
    }
    

具体的参数使用可以见这篇博客参考博客

禁止附加或调试

PT _ DENY _ ATTACH1是一个 Apple 特有的常量,它可以防止调试器(gdb、 DTrace 等)在内核级调试二进制文件
通过调用ptrace函数,并传入PT_DENY_ATTACH参数,可以实现禁止调试

#define PT_DENY_ATTACH 31
#include 
int main()
{
ptrace(PT_DENY_ATTACH, 0, 0, 0);
printf("Hello\n");
return 0;
}

程序正常运行时,就会输出hello
但是的那个程序加载到gdb中时,就不能正常运行

中断检测-int3

int3是x86中一条调试中断指令,用于在执行过程中触发软中断,以便进行调试。
int3会生成一个中断,中断号为3,当处理器执行到这个指令时会出发一个软中断,将控制权转移到操作系统的中断服务历程
在调试器的上下文中,这个中断通常用于设置断点,以在程序执行到特定位置时中断执行,允许调试器检查程序状态
在一些调试工具中,开发者可以通过在代码中插入int3指令来手动触发中断,以便进行调试。然后,调试器会捕获这个中断,停止程序执行,并提供开发者一个交互式的环境来检查程序状态、变量值等。
一般来说,int3指令常用于调试目的,正常的应用程序代码中并不会直接使用它
在C代码中,可以使用asm函数来嵌入汇编指令

NT:在arm架构中也有相应的中断指令brk

PS:代码示例在后续实验后再更新

你可能感兴趣的:(系统安全,系统安全,linux)