[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 hanyeguxing 于 2011-4-28 13:47 编辑

8# zm900612


  父进程 explorer.exe 在新建 cmd.exe 进程的用户空间为其建立了 PEB 之后,还通过 KlInitPeb (在父进程的用户空间执行)对此 PEB 加以进一步的初始化,在此之前已经准备好了 PPB 作为调用参数之一传下来。进程参数块是一个 RTL_USER_PROCESS_PARAMETERS 数据结构,里面带下来的参数中有一个指针 Environment ,指向一个“宽字符 Unicode” 串,这就是各环境变量的定义。

  参数 PPB 实际涉及两块数据。一块是进程参数块本身,这是有固定大小的;另一块的内容是一些环境变量字符串,这些字符串游离在进程参数块外面,并且也没有固定的长度。这里的目的就是要把这两块数据都复制到新建 cmd.exe 进程的用户空间去,并相应地设置好相关数据结构中的指针。为此,程序中首先要确定这些环境变量字符串所占的长度 EnvSize 。

  知道了这些环境变量字符串所占的长度 EnvSize 以后,如果非 0,就要在新建 cmd.exe 进程的用户空间分配相应的区间。这里在调用 NtAllocateVirtualMemory 时的第 2 个参数、即指针 EnvPtr 的值已预先设置为 NULL ,表示对起始地址没有特定的要求;并且第 3 个参数、即要求在所分配起始地址中前导 0 的个数也是 0 ,因此可以分配在任意的部位 (前导 0 的个数实际上大致上给定了一个部位)。对于这样的分配要求,内存管理会在目标空间从低到高扫描,以找到第一个符合大小要求的区间。由于用户空间的起点是 0x10000 ,这又是第一次要求由内存管理自由分配,所以实际分配的位置一定在 0x10000 处。另一方面,由于区间分配的粒度是 64KB ,所以实际分配的一般总是 64KB ,因为很难设想 EnvSize 会大于 64KB 。实际分配的位置和大小则通过参数 EnvPtr 和 EnvSize1 返回。然后通过 NtWriteVirtualMemory 将来自参数 Ppb、或当前进程的环境变量字符串复制到新建 cmd.exe 进程用户空间的这个区间中。

  接着把 PPB 复制过去并对新建进程用户空间 PPB 和 PEB 中的几个成分作出修正,然后 NtReadVirtualMemory 从 PEB 读取其 ImageBaseAddress 字段,并通过参数 ImageBaseAddress 返回目标映像装入用户空间后的起始地址。

  再接着就是创建新进程的第一个线程、堆栈、TEB 等等。。。。。。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

本帖最后由 hanyeguxing 于 2011-4-28 18:29 编辑

19# ▄︻┻═┳一


对这些我不甚了解,但我怀疑你的信息来源,
cmd.exe 不同于一般的应用程序,windows的shell 是系统最后一个启动的一个进程。
f8-- 带命令行的安全模式 就证明了 cmd.exe 是独立于 explorer.exe

1,恰恰相反,cmd.exe 和一般应用程序没什么不同,都是一个32位GUI程序
2,至于:
因为explorer.exe是Windows默认的外壳
大多数程序都是它的子进程
也自然继承了它的环境空间
所以我们无论从开始》运行中启动cmd
还是直接点击运行cmd.exe或者批处理
都将会成为explorer.exe的子进程
也同时继承它的环境空间

这里说的是 cmd.exe 的一般启动方式,这和其他一般应用程序也一样。但不代表说程序就必须从外壳 explorer 上作为子进程启动, cmd 是这样,其他程序也是这样。
3,“f8-- 带命令行的安全模式 就证明了 cmd.exe 是独立于 explorer.exe”
任何程序,只要愿意,都可以独立于外壳而单独装载运行。打个比方,把外壳关闭了qq程序就进程结束了吗?把外壳关了在任务管理器中就不能启动其他应用程序了吗?

系统经过 Pre-Boot 阶段最后加载 NTLDR 文件,切换实模为保护、ntdetect.com 收集信息、加载内核 ntokrnl.exe 、加载 HAL ;然后 system 初始化内核、创建会话管理子系统;smss.exe 创建用户模式并初始最原始的环境、加载 Win32k.sys 、启动 Csrss.exe 与 Winlogon.exe 进程;Winlogon.exe 启动 Services.exe 进程、Lsass.exe 进程、Userinit.exe 进程;Userinit.exe 进行用户初始化后,然后启动 Explorer.exe ,也是 Userinit.exe 启动的带命令行的安全模式中的 cmd.exe ,最后 Userinit.exe 退出。
看明白环境这一过程中环境的继承了吗?
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

本帖最后由 hanyeguxing 于 2011-4-28 19:52 编辑

22# batman


是说启动部分,还是?http://blog.sina.com.cn/s/blog_51a4af870100ds9h.html
很早以前写的。。。当时是大部分抄微软官方网站的
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

因为当时 ntldr 总出问题,所以就在 xp 启动上用了点时间
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表