有没有人尝试过 ptrace_attaching android unity 应用程序进行反调试?

逆向工程 安卓 反调试
2021-06-19 07:39:41

我正在尝试使用 android unity 应用程序ptrace_attach的主进程及其线程 ( /proc/<pid>/task) 来避免恶意用户调试该应用程序(这是一款游戏)。

我开发了一个 ndk 库,它从函数ptrace_attach内部的主进程和父进程(作为主进程)分叉JNI_OnLoad()之后定期检查/proc/<pid>/task文件夹以附加新创建的线程。

问题是,这在普通应用程序中运行良好,但是当我尝试在统一制作的应用程序中运行它时,主进程停止并且屏幕变成黑屏或白屏没有响应。但是,如果您延迟附加几秒钟以查看屏幕上的动画效果,则附加工作正常。

代码大致是这样的:

if(!fork())
{
     parentPid = getppid();

     // attach parent process
     if(ptrace(PTRACE_ATTACH,parentPid,0,0)<0)
          exit(-1);
     ptrace(PTRACE_SETOPTIONS, parentPid, 0, PTRACE_O_TRACEEXEC| PTRACE_O_TRACEVFORKDONE|PTRACE_O_TRACESYSGOOD |PTRACE_O_TRACEFORK |PTRACE_O_TRACEVFORK |PTRACE_O_TRACECLONE );

     while(true)
     {
          // get signal from processes
          stoppedPid = waitpid(-1,&stat_loc, 0);

          ...

          // check if stoppedPid need to be attached
          // if so, attach
          ptrace(PTRACE_ATTACH,stoppedPid,0,0);

          ...

          // else, just continue the stopped process
          ptrace(PTRACE_CONT,stoppedPid,0,0);
     }
 }

也许我应该调整ptrace_setoptions

提前致谢 :)

1个回答

好吧,我发现了一些东西-

当我ptrace_attach在目标应用程序的主进程并等待信号时,我在应用程序加载时收到 SIGSEGV 信号并挂在那里(因为分叉进程无法处理 SIGSEGV)。在java代码中,似乎在调用View相关函数时发生了SIGSEGV。

我猜 UnityPlayer 或 Android 应用程序加载器在应用程序加载时顺利处理 SIGSEGV。因此,如果您获得 SIGSEGV,只需将其分离并再次附加不会挂起应用程序。