ETM恶意软件透明分析测试过程中比较常用的内容:ptrace和int3
ptrace 是一个系统调用,用于在 Unix-like 操作系统中进行进程间的调试。它允许一个进程(通常是调试器)观察和控制另一个进程的执行。这个调用通常用于调试器(如 GDB)实现,以便它们可以监视和修改另一个进程的执行,包括读取和写入其内存、寄存器和执行控制。
使用ptrace时,通常需要编写一个调试器程序,它将附加到目标进程并与其交互
long pid = target_process_id; // 目标进程的进程ID
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {
perror("ptrace attach");
// 处理错误
}
int status;
waitpid(pid, &status, 0);
// 从目标进程的地址 addr 读取一个字(4个字节)的数据
long data = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
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是x86中一条调试中断指令,用于在执行过程中触发软中断,以便进行调试。
int3会生成一个中断,中断号为3,当处理器执行到这个指令时会出发一个软中断,将控制权转移到操作系统的中断服务历程
在调试器的上下文中,这个中断通常用于设置断点,以在程序执行到特定位置时中断执行,允许调试器检查程序状态
在一些调试工具中,开发者可以通过在代码中插入int3指令来手动触发中断,以便进行调试。然后,调试器会捕获这个中断,停止程序执行,并提供开发者一个交互式的环境来检查程序状态、变量值等。
一般来说,int3指令常用于调试目的,正常的应用程序代码中并不会直接使用它
在C代码中,可以使用asm函数来嵌入汇编指令
NT:在arm架构中也有相应的中断指令brk
PS:代码示例在后续实验后再更新