欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

关于从系统内核创建一个进程的深入学习

关于从系统内核创建一个进程的深入学习

关于这个问题已经有了几篇文章了
Gary Nebbett的 炉子的。还有就是第八个门的,基本上都还是说的比较清楚的
但是都不去考虑一个关键问题
如果忽视了这个问题 那么仅仅也就就是 使用native api创建进程而已
而不是真正的 r0下面创建
关于r0下面怎么call r3的讨论比较多了 其实createprocess也算在里面
关于hook法 apc法 dispatch法等可以看看sudami牛的文章 说的很详细的
下面开始正题
利用一个可执行的PE文件去创建一个进程
首先 ZwOpenFile-ZwCreateSection-ZwCreateProcess
这时。进程的一些东西已经准备好了
下面是ZwAllocateVirtualMemory-做一些PEB之类的初始化工作
下面要来创建这个进程的第一个线程 ZwCreateThread
这个东西有几点要注意 第一。ZwCreateThread的参数
NTSTATUS NTAPI ZwCreateThread(
OUT PHANDLE       ThreadHandle,
IN   ACCESS_MASK           DesiredAccess,
IN   POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
IN   HANDLE                 ProcessHandle,
OUT PCLIENT_ID             ClientId,
IN   PCONTEXT               ThreadContext,
IN   PINITIAL_TEB           InitialTeb,
IN   BOOLEAN               CreateSuspended
);
CreateSuspended 这个参数在创建的一定要设置成TRUE
即使你想直接在创建完成之后运行,那也是后面ZwResumeThread的事情
这些在以上三位大牛的文章中都详细给出了,偶也不多提及
第二。CONTEXT 结构的初始化问题
BaseCreateStack和BaseInitializeContext完成初始化
Windows启动一个新进程的时候 并不是把目标程序OEP
直接设置成ZwCreateThread的起点EIP
而是把目标程序OEP设置成ZwCreateThread-CONTEXT-EAX
如果是创建进程的第一个线程,那么设置的就是BaseProcessStartThunk 
如果是创建其他情况的线程,那么就是BaseThreadStartThunk 
实际设置的是_BaseProcessStart和_BaseThreadStart
另外还有一个BaseFiberStart 这个偶就不知道是什么了。。
好了,这个BaseProcessStart将会设置一个SEH 然后call eax
在返回的时候执行_pspexitthread
这就是为什么我们写代码只需要在末尾写一个ret 0c就可以自动正确退出的原因
ret会回到BaseProcessStart处pspexitthread
如果是我们直接设置成OEP了。那么返回的时候就要注意注意了。
退出时不仔细注意,会卡住的。这是第一个问题
还有一个问题。这个也比较重要 就是InformCsrss
任何一个进程或者线程,创建之后都需要告知CSRSS.EXE,这个功能是
由CsrClientCallServer函数发送一个message告知csrss,
具体的端口是\\Windows\\ApiPort,该端口是在本程序之前CsrClientConnectToServer
函数中

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功