在反调试保护的crackme中调试分叉的孩子

逆向工程 linux 反调试 雷达2 快手
2021-06-17 10:22:43

我对在crackme 中实现的名为trace-p的反调试方法很感兴趣一个子进程被分叉,它使用 int3 指令与父进程通信。我想调试孩子。gdb 有set follow-fork-mode,但是 gdb 无法将该文件识别为可执行文件(可能是因为已删除部分相关信息)。用radare2我可以反汇编甚至调试,但是我不知道在fork发生后如何跟随孩子。我想这样做是因为孩子包含以下说明:

0x0804898a    jmp dword [edx*4 + 0x8049334]

我想在那里停下来检查 edx,以便了解跳转的位置。

我对任何能够调试子进程的工具或方法感兴趣。

3个回答

用于dbg.forks=true在发生分叉时停止调试器。然后只需使用dp来列出并选择您要关注的 pid。

使用radare2 的第一件事是确保您运行的是最新的git 版本

要获得有关radare2 中命令的帮助,您可以使用该?字符。有关配置变量的帮助,您可以使用e??(因为e?会帮助您了解如何使用它们,而不是列出它们)。由于有很多变量,您可以使用内部 grep 命令过滤它们:~

[0x00000000]> e??dbg
          dbg.args:设置要调试的程序的args
       dbg.backend:选择调试器后端
           dbg.bep:中断入口点(加载器、入口、构造函数、主)
      dbg.bpinmaps:强制断点位于有效地图内
        dbg.bpsize:软件断点的大小
        dbg.btalgo:选择回溯算法
       dbg.btdepth:回溯深度
         dbg.clone:如果创建新线程则停止执行
         dbg.execs:如果创建新线程则停止执行
        dbg.follow:当 pc > core->offset + dbg.follow 时跟随程序计数器
         dbg.forks:如果 fork() 完成则停止执行(参见 dbg.threads)
          dbg.libs:如果在加载匹配的 libname 时设置停止
       dbg.profile: RRunProfile 文件的路径
 dbg.shallow_trace:跟踪时,避免跟随指定范围之外的调用
          dbg.slow:以缓慢但详细的模式在可视模式下显示堆栈和注册表
        dbg.status: 将 cmd.prompt 设置为 '.dr*' 或 '.dr*;drd;sr PC;pi 1;s-'
        dbg.swstep:强制使用软件步骤(代码分析+断点)
       dbg.threads:在调试器中断时停止所有线程(参见 dbg.forks)
         dbg.trace:跟踪程序执行(见asm.trace)
     dbg.trace.tag:跟踪标签
        dbg.unlibs:如果在卸载匹配的 libname 时设置停止
[0x00000000]>

您也可以使用 use e dbg.<tab>,因为有自动完成功能。

显然,您要查找的变量是dbg.fork,将其设置为 true:这将在遇到fork(). 您可以使用d-command更改 pid

[0x00000000]> d?~进程
| dH [handler] 将过程移植到新的处理者
| 执行打开过程(重新加载,'oo' 的别名)
| dp[?] 列表,附加到进程或线程 id
| dx[?] 在目标进程上注入和运行代码(参见 gs)

[0x00000000]> dp?
|用法:dp #处理命令
| dp 列出当前的 pid 和孩子的
| dp 列出pid的孩子
| dp* 列出所有可附加的 pid
| dp=选择pid
| dp- 分离选择 pid
| dpa 附加并选择pid
| dpe 显示可执行文件的路径
| dpf 像文件 fd 一样附加到 pid // HACK
| dpk 发送信号给进程
| dpn 创建新进程(fork)
| dpnt 创建新线程(克隆)
| dpt 列出当前pid的线程
| dpt 列出进程的线程
| dpt= 附加到线程

[0x00000000]

Radare2 有一个配置变量dbg.follow.child,相当于set follow-fork-mod.

 e??~fork
    dbg.follow.child: Continue tracing the child process on fork. By default the parent process is traced

设置它以使用命令调试子进程

e dbg.follow.child = true

或使用以下命令启动雷达时-e

r2 -e dbg.follow.child=true -d ./my_binary