简介
使用通知的方式只能在进程创建的时候注入,而我们想注入一个已经运行的进程时,
可以使用与应用层类似的,申请注入shellcode的内存,并创建线程来运行的方式。
这里参照 Blackbone
的部分代码进行修改:https://github.com/DarthTon/Blackbone
工作原理
推荐的方法是获取SSDT表,找到 NtCreateThreadEx
函数来创建线程。在64位系统中获取SSDT的方法,
通常是搜索特征码,可以从 Blackbone
中查看,这里暂不讨论。另外 RtlCreateUserThread
函数也
可以创建线程,但好像还涉及 PrevMode
等信息,虽然测试未出现蓝屏现象,这种方法待议。
参见: https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/previousmode
1 | NTSTATUS NTAPI RtlCreateUserThread( |
这里使用 在内核中获取进程的DLL和导出函数(1)
文章中获取的 WinExec
导出函数为例
1 | // 以调用WinExec函数为目标生成的ShellCode |
调用的函数如下所示
1 | NTSTATUS InjectExplorerProcess(IN PCCHAR RunCmd) |