背景
傀儡进程本质上是借用正常的软件进程或是系统进程的外壳来执行非正常的恶意操作。
函数介绍
1.GetThreadContext
获取指定线程的上下文
2.SetThreadContext
设置指定线程的上下文
3.ResumeThread
减少线程的暂停计数。当暂停计数递减到零时,恢复线程的执行
实现原理
(1)第一步
利用CreateProcess创建进程并且使用CREATE_SUSPENDED标志挂起主线程
bRet = ::CreateProcess(pszFilePath,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi)
(2)第二步
使用VirtualAllocEx在目标进程中申请一块内存,这块内存主要用于存放ShellCode数据,写入ShellCode数据使用WriteProcessMemory函数
什么是ShellCode自行百度哈
(3)第三步
使用GetThreadContext函数获取目标进程的线程上下文,然后使用SetThreadContext修改原来进程PE结构的加载基址,将存放ShellCode的地址作为第一执行顺序。
(4)第四步
使用ResumeThread函数恢复挂起进程的线程,让进程按照修改后的EIP继续运行,这一步主要是和第一步挂起主线程对应
目标
该技术主要是为了实现在目标进程中“夹带私货”,运行正常进程的同时运行我们自己想要加载的线程。
其中需要注意的是,在使用GetThreadContext获取线程上下文的时候,一定要对上下文结构中的ContextFlags成员赋值,知名要检索线程上下文的哪些部分,若赋值为CONTEXT_FULL表示获取所有线程的上下文信息。
另外第一步和第四步是对应关系,我们需要先挂起进程,不让他继续运行,然后插入我们的Shellcode后再通过ResumeThead让进程继续运行。