一张图看从CreateProcess到main函数的过程

整体过程如下:

需要说明两点:

1.在XP中,新进程主线程的启动,会先执行一个用户态的APC,会执行ntdll!LdrInitializeThunk进行程序执行前的一些列初始化操作。其中很重要任务就是加载从Kernel32.dll开始的系统DLL。注意的是,这个APC的插入,根据WRK中的代码看来是在PspUserThreadStartup中进行的:

但实际调试XP SP3发现,该函数并未有这个动作。并且在进入这个函数的时候APC已经插入好了。于是追踪到在XP SP3中,该APC的插入时机是在nt!PspCreateThread中进行的。

2.虽然XP和Win7都会在主线程Ring3入口(XP是BaseProcessStart,Win7是RtlUserThreadStart)前执行LdrInitializeThunk进行初始化,但二者细节处还是不同。

对于XP,如上所述,是通过nt!PspCreateThread在创建线程完成后插入APC,等到新进程主线程得到调度,在nt!KiThreadStartup完成后,跳到nt!_KiSystemExit处返回到用户模式时,该APC得到交付从而执行到。

而对于Win7,创建进程路径发生了大变化,不再有nt!PspCreateThread,而是nt! PspAllocateThread,这里面也没有插入APC的动作。即使追踪到nt!KiThreadStartup即将跳到nt!_KiSystemExit的位置,KTHREAD中的APC队列仍然没有LdrInitializeThunk这一项。按理说,这个时候返回就会到线程启动入口ntdll!RtlUserThreadStart才对。那LdrInitializeThunk怎么会执行呢?调试发现,在即将跳到nt!_KiSystemExit的时候,线程的KTRAP_FRAME中的EIP已经是LdrInitializeThunk而不是RtlUserThreadStart了。进一步跟踪发现,原来是在nt!PspCreateThread返回的前夕,通过nt!PspInitializeThunkContext—> nt!PspSetContextThreadInternal-->nt!PspGetSetContextSpecialApc-->nt!KeContextToKframes进行对KTRAP_FRAME进行修改了。通过函数名字也可以看出,这个动作是在模拟交付用户模式APC的动作。

因此,总结一下就是,对于XP,是通过正常的插入APC的形式,在线程内核启动函数完成后返回到用户模式时,触发了APC的交付。而对于Win7,则是在内核启动函数完成时,模拟出一个APC交付的过程,提前修改了KTRAP_FRAME,等到返回到用户模式时直接就从LdrInitializeThunk处开始执行。

LdrInitializeThunk执行完成后需要进入内核(通过NtContinue),重新进入到线程的用户态执行入口。由于在XP中是通过APC进入的,所以这个工作就不用LdrInitializeThunk来做,APC的执行器ntdll!KiUserApcDispatcher会负责这件事。但在Win7上并非通过APC执行的,所以调用NtContinue的工作需要LdrInitializeThunk自己来完成了。
Win7: 

最后说一下,经常见到在LoadImageNotify回调中做(用户态)APC注入。由图可见exe&ntdll的回调通知和后面加载的dll回调通知执行的路径不一样。最开始这两个模块是在DbgkCreateThread中执行回调的,后面的是通过MmMapViewOfSection-->MiMapViewOfImageSection执行的回调。而MmMapViewOfSection在回调执行之前会通过LOCK_ADDRESS_SPACE进行进程地址空间的锁定。这个时候再进行(用户态)APC注入,在使用ZwAllocateVirtualMemory分配shellcode的内存空间时会卡死在这里。所以(用户态)APC注入的时机是在ntdll的回调中,这之后就会面临卡死的问题。

时间: 2024-10-29 19:11:45

一张图看从CreateProcess到main函数的过程的相关文章

两张图看.NET Framework组成及编译运行过程

一张图看懂ANSYS17.0 流体 新功能与改进

一张图看懂ANSYS17.0 流体 新功能与改进 提交 我的留言 加载中 已留言 一张图看懂ANSYS17.0 流体 新功能与改进 原创2016-02-03ANSYS模拟在线模拟在线 模拟在线 微信号sim_ol 功能介绍这是数值模拟.仿真分析领域最大的公众号,没有之一!!! 点上方“模拟在线”查看更多“牛B”资讯! 感谢ANSYS公司对平台的友情支持,本次17.0的改进报告均为ANSYS提供(授权直接摘抄,确实给小编省事不少啊).本次首先带来是流体方面的改进和优化.后续陆续推送结构.电磁等各方

一张图看懂css的position里的relative和absolute的区别

position有以下属性:static.inherit.fixed.absolute.relative前三个好理解好区分:static:是默认状态,没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明).nherit:从父元素继承 position 属性的值.fixed:生成绝对定位的元素,相对于浏览器窗口进行定位.(即滚动浏览器的时候,元素永远固定显示在窗口可视区的某个位置). 比较常用而且会引起初学者迷惑的是absolute和r

一张图看懂原码、反码、补码、移码

前言 原码.反码.补码其实两年前就讲过,只是当时的理解太过肤浅或者直接说就是没有理解,因为对于数学比较发怵的我看到那么多的公式很是脑袋大,所以想要硬记也记不住.这次讲课的时候好歹知道了运算规则,但别人一问为什么,立马那个冏啊~好了,废话不多说了,开始进入正题(如果我的理解有偏差,恳请各位大虾不吝指出): 一张图胜过千言万语,下面的这张是本篇想要说的大概内容 原码 我们知道,计算机是以0和1进行运算的,而且内部只有加法运算器,但日常生活中使用的却是十进制,并且有正负之分.于是我们发明了原码:最高位

4张图看懂delphi 10生成ipa和在iPhone虚拟器上调试(教程)

4张图看懂delphi 10生成ipa和在iPhone虚拟器上调试(教程) (2016-02-01 03:21:06) 转载▼ 标签: delphi ios delphi10 教程 编程 分类: 编程学习 参见: delphi XE4生成ipa并部署到越狱iPad视频教程 os x el capitan / Xcode_7.2 / delphi 10 切换不同版本的模拟器.png在虚拟器上调试的正确设置.png域名设置.png记得选择的平台要选虚拟器.png

31张图看懂初高中所有英语语法

31张图看懂初高中所有英语语法

Nginx源码分析:3张图看懂启动及进程工作原理

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享.转载请注明来自高可用架构公众号「ArchNotes」.   导读:很多工程师及架构师都希望了解及掌握高性能服务器开发,阅读优秀源代码是一种有效的方式,nginx 是业界知名的高性能 Web 服务器实现,如何有效的阅读及理解 nginx?本文用图解的方式帮助大家来更好的阅读及理解 nginx 关键环节的实现.   陈科,十年行业从业经验,曾在浙江电信.阿里巴巴.华为.五八同城任开发工程及架构师等职,目前负责河狸

【转帖】自助式BI的崛起:三张图看清商业智能和大数据分析市场趋势

自助式BI的崛起:三张图看清商业智能和大数据分析市场趋势 大数据时代,商业智能和数据分析软件市场正在经历一场巨变,那些强调易用性的,人人都能使用的分析软件正在取代传统复杂的商业智能和分析软件成为市场的热点和趋势. 只要看一眼Tableau的财务报告,你就能明白商业智能市场正在发生什么,Tableau去年第四季度营收同比增长了75%.这标志着企业和个人纷纷开始购买那些“自助式”分析软件,也就是那种简单易用到完全不懂数据分析的业务人员和商务人士也能轻松上手的分析软件,例如Tableau,而传统商业分

【python系统学习07】一张图看懂字典并学会操作

点击跳转 - 原文地址 数据类型 - 字典(dict) 目录: [python系统学习07]一张图看懂字典并学会操作 原文地址:https://www.cnblogs.com/padding1015/p/12232571.html