简介

顾名思义,如果一个进程创建出了另一个进程

然后用第一个进程(父)去调试第二个进程(子)

子进程由于已经被调试,所以不能再被调试器附加,从而防止了真实逻辑被调试

这里引申出几个议题:

如何创建另一个进程(子进程的来源)

  • 另一个可执行程序
  • 就是本身
  • 一段内存中的代码

从上又分出几个问题

  • 创建另一个可执行程序(已经存在的,还是在代码里面需要dump或者从网上下载)
  • 本身(如何区分两次执行的逻辑流)
  • 一段内存中的代码(CreateProcess很明显不支持,那要怎么办)

第二:

如何用父进程调试子进程

在win API中有CreateProcess的第6个参数可以选择父进程作为调试器。

然后通过API中其它函数来接受调试信息以及读取/修改子进程的上下文/寄存器/执行流。

有没有其它办法不知道

第三:

执行完如何返回内容/结果

同样在win API中有函数OutputDebugString来输出调试信息

现在以创建自身为新进程来解释


区分逻辑流的方法

区分逻辑流,表明为需要一个if-else分支语句来执行不同的代码

因此

  • if中写一样的内容,但是可能返回不同的东西
  • 在执行第一个逻辑时修改了本身,导致执行流的改变

对于第一种情况

  • 检查自身的状态,两次的状态不一致
  • 检查外界的状态,通过本身在外界的注册内容来判断

常见标志位
系统函数

这些内容还没怎么学QAQ

我只知道绑定端口和创建互斥体两个函数,这两个函数只要指定了id,只要第一次返回可行,第二次一定失败。借这个来直接区分逻辑流,至于使用它们,自然不重要

还有就是创建进程时可以指定参数,参数数量也可以算作不同的内容


调试方法

首先CreateProcess,并设置DEBUG_PROCESS

然后WaitForDebugEvent等待并读取调试信息

然后用得到的debugEvent.dwDebugEventCode来判断类型

比如:EXCEPTION_DEBUG_EVENT(int 3断点)

然后就可以用WriteProcessMemory写入内存,其它的像获取rip,stack之类的就不说了

最后ContinueDebugEvent继续执行流程

这里只是大概说个流程