思路:如何跳过CreateProcess调用底层创建进程函数

简介:

论坛近日有人在问如何跳过CreateProcess调用底层的NtCreateProcess。

我想说的是不能单纯看这个问题,首先不同NT内核版本CreateProcess进入

底层的路径是不同的:


2k ->NtCreateProcess
xp ->NtCreateProcessEx
vista/win7/2008 ->NtCreateUserProcess


拿windows7 x64来说吧,在ntdll32!NtCreateUserProcess设置断点,中断后,查看stack内容,结合该函数原型来看:


NTSTATUS NtCreateUserProcess(PHANDLE ProcessHandle,
  PHANDLE ThreadHandle,
  PVOID Parameter2,
  PVOID Parameter3,
  PVOID ProcessSecurityDescriptor,
  PVOID ThreadSecurityDescriptor,
  PVOID Parameter6,
  PVOID Parameter7,
  PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
  PVOID Parameter9,
  PVOID pProcessUnKnow);

vals in stack :
0028f5dc 760b4338 kernel32!CreateProcessInternalW+0xe75 (ret)
0028f5e0 0028f920
0028f5e4 0028f900
0028f5e8 02000000
0028f5ec 02000000
0028f5f0 00000000
0028f5f4 00000000
0028f5f8 00000000
0028f5fc 00000001
0028f600 00755c38
0028f604 0028f7a4
0028f608 0028fb20
0028f60c d0c89b5d
0028f610 0028fcdc
0028f614 00000001

可知其最关键的ProcessParameters地址在755c38,分析其内容则有:

ntdll!_RTL_USER_PROCESS_PARAMETERS
  +0x000 MaximumLength : 0x94c
  +0x004 Length : 0x94c
  +0x008 Flags : 1
  +0x00c DebugFlags : 0
  +0x010 ConsoleHandle : 0x00001480 Void
  +0x018 ConsoleFlags : 3
  +0x020 StandardInput : 0x0000000b Void
  +0x028 StandardOutput : 0x00755ed0 Void
  +0x030 StandardError : 0x03ee03ec Void
  +0x038 CurrentDirectory : _CURDIR
  +0x000 DosPath : _UNICODE_STRING "C:\Windows\system32\notepad.exe"
  +0x000 Length : 0x3e
  +0x002 MaximumLength : 0x40
  +0x008 Buffer : 0x00180016 "--- memory read error at address 0x00180016 ---"
  +0x010 Handle : 0x00756584 Void
  +0x050 DllPath : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x060 ImagePathName : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x070 CommandLine : _UNICODE_STRING "C:\Windows\system32\notepad.exe"
  +0x000 Length : 0x3e
  +0x002 MaximumLength : 0x40
  +0x008 Buffer : 0x0020001e "--- memory read error at address 0x0020001e ---"
  +0x080 Environment : 0x00020000 Void
  +0x088 StartingX : 0
  +0x08c StartingY : 0
  +0x090 CountX : 0
  +0x094 CountY : 0
  +0x098 CountCharsX : 0
  +0x09c CountCharsY : 0
  +0x0a0 FillAttribute : 0
  +0x0a4 WindowFlags : 0
  +0x0a8 ShowWindowFlags : 0
  +0x0b0 WindowTitle : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0c0 DesktopInfo : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0d0 ShellInfo : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0e0 RuntimeData : _UNICODE_STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x0f0 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
  +0x000 Flags : 0
  +0x002 Length : 0
  +0x004 TimeStamp : 0
  +0x008 DosPath : _STRING ""
  +0x000 Length : 0
  +0x002 MaximumLength : 0
  +0x008 Buffer : (null)  
  +0x3f0 EnvironmentSize : 0
  +0x3f8 EnvironmentVersion : 0

接下来就可以操作鸟:

1 找出 NtCreateUserProcess 地址
2 构建及填充 ProcessParameters 内容
3 调用并处理好返回值


相关文章
|
Linux
进程等待(wait和wait函数)【Linux】
进程等待(wait和wait函数)【Linux】
359 0
|
6月前
|
Shell Linux C语言
函数和进程之间的相似性
在一个C程序可以fork/exec另一个程序,其过程是先fork一个子进程,然后让子进程使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。在学了C语言、C++或是JAVA等高级语言,你会知道,在这些语言中的函数是可以相互进行见调用的,但是在学习了Linux的前面的知识后,你就会有意无意的认识到其实进程也是与函数有相同之处的,进程之间也是可以相互调用的。程序之间相互调用带来的好处之一。那么下面就将这部分内容扩展。
105 0
|
12月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
540 13
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
Linux API
Linux源码阅读笔记07-进程管理4大常用API函数
Linux源码阅读笔记07-进程管理4大常用API函数
|
编译器
【收藏】内核级利用通用Hook函数方法检测进程
【收藏】内核级利用通用Hook函数方法检测进程
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之函数计算里中FC出现函数还没有执行完进程就关闭了是什么导致的
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
Linux Shell 程序员
【进程控制】进程程序替换的原理以及exec函数族
【进程控制】进程程序替换的原理以及exec函数族
|
存储 算法 Unix
【创建进程】fork函数与写时拷贝
【创建进程】fork函数与写时拷贝
|
C语言
C语言 -- CreateProcess创建进程
C语言 -- CreateProcess创建进程
192 4

热门文章

最新文章