父子进程反调试
简介
顾名思义,如果一个进程创建出了另一个进程
然后用第一个进程(父)去调试第二个进程(子)
子进程由于已经被调试,所以不能再被调试器附加,从而防止了真实逻辑被调试
这里引申出几个议题:
如何创建另一个进程(子进程的来源)
- 另一个可执行程序
- 就是本身
- 一段内存中的代码
从上又分出几个问题
- 创建另一个可执行程序(已经存在的,还是在代码里面需要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继续执行流程
这里只是大概说个流程
评论