花指令与anti-debug

花指令

anti-Debug

  1. ptrace反调试
    (1) ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像(包括寄存器)的值。其基本原理是: 当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED。而父进程收到信号后,就可以对停止下来的子进程进行检查和修改,然后让子进程继续运行。
    函数原型:

     \#include <sys/ptrace.h>
         long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
    

    ptrace有四个参数:
    - enum __ptrace_request request:指示了ptrace要执行的命令。
    - pid_t pid: 指示ptrace要跟踪的进程。
    - void *addr: 指示要监控的内存地址。
    - void *data: 存放读取出的或者要写入的数据。
    返回值:
    - 成功时,ptrace()返回0,否则返回-1并设置errno。

    部分Ptrace request:

    • PTRACE_TRACEME
      表示本进程将被其父进程跟踪,交付给这个进程的所有信号(除SIGKILL之外),都将使其停止,父进程将通过wait()获知这一情况。
      它通常总是与 fork/exec 一起使用。对于每一个进程,PTRACE_TRACEME 只能被调用一次。
    • PTRACE_ATTACH
      根据pid将调试进程附加到被调试进程上,PTRACE_ATTACH向被调试进程发送SIGSTOP信号使之停下.
      但是在ptrace(PTRACE_ATTACH,pid,0,0)执行完毕时被调试进程可能还没有暂停,可以使用waitpid()等待其停下.
    • PTRACE_DETACH
      将被调试进程与调试进程分离,使被调试进程正常运行.
    • PTRACE_SYSCALL
      使被调试进程继续运行,但是在下一个系统调用的入口处或出口处停下,或者是执行完一条指令后停下.
      例如,调试进程可以监视被调试进程系统调用入口处的参数,接着再使用SYSCALL,监视系统调用的返回值.

    (2) ptrace系统调用号为101,则syscall(101,0,0,0,0)表示ptrace(0,0,0,0)而当request参数为0时,表示PTRACE_TRACEME.相当于Ptrace自己的进程.然而一个程序只能被ptrace一次,所以当调试的时候,ptrace(0,0,0,0)会失败返回-1.
    依此便可以生成一个反调试的脚本.

     \#include <sys/ptrace.h>
     int main() {
         if(-1 == ptrace(0, 0, 0, 0);
         {   printf("debugger!\n");
             return -1;
         }
         printf("not debugger!\n");
         return 0;
     }
    

    example:[sctf SGAME]
    img

posted @ 2024-10-11 20:29  Un1corn  阅读(4)  评论(0编辑  收藏  举报