进程
- 进程的定义
- 进程只负责给程序提供资源:代码、数据、虚拟内存空间
- 进程是空间概念,不负责执行代码;真正执行代码的是线程
- 程序是磁盘上静态文件;运行起来之后才变成进程
- 查看运行中的进程
● 所有进程都由别的进程创建;Windows 第一个进程(explorer.exe)由内核创建
● 双击 exe,explorer.exe调用CreateProcess()生成新进程;任务管理器可以观察进程
x86 Windows 4GB 虚拟地址空间划分
| 区域 | 地址范围 | 说明 |
|---|---|---|
| 空指针赋值区 | 0x00000000 ~ 0x0000FFFF | 前64KB,禁止访问,捕获空指针异常 |
| 用户模式区 | 0x00010000 ~ 0x7FFEFFFF | 用户程序、exe、dll全部在这里,低2GB |
| 64KB禁入区 | 0x7FFF0000 ~ 0x7FFFFFFF | 用户空间末尾保留隔离区域,禁止访问 |
| 内核区 | 0x80000000 ~ 0xFFFFFFFF | 高2GB,所有进程共享,存放内核、驱动、kernel32.dll等 |
重点:每个进程独立用户空间;内核空间全部进程共用
调试工具(如 x64dbg/DTDebug)附加进程,就可以查看虚拟内存视图

3. 模块化视图(PE 模块角度看进程)
进程内存由若干 PE 模块组成:.exe、.dll
● 示例:cxstudy.exe默认加载基址 0x00400000
● 每个 PE 包含多个节:
.text:代码段,可执行 .data:数据段,读写
.rsrc:资源段(图标、对话框等)
● 模块分类:
a. 主模块:exe 本身
b. 系统模块:ntdll.dll、kernel32.dll,一般加载到高地址
c. 第三方 dll
4. Windows 进程创建完整 5 步(CreateProcess 内部)
- 映射 EXE 文件到虚拟内存 将磁盘 exe 映射到进程虚拟地址,按照 PE 可选头的 ImageBase 加载,避开前后 64KB 保护区域
- 创建内核对象 EPROCESS 内核结构体,操作系统管理进程的核心,保存 PID、权限、内存描述等信息,用户态不能直接访问
- 映射系统 DLL 强制载入ntdll.dll;根据 PE 导入表,递归加载所有依赖 DLL
- 创建主线程内核对象 ETHREAD 进程至少要有 1 个线程,没有线程的进程无法运行 ETHREAD记录线程上下文、栈、寄存器等
- 线程开始执行:ntdll!LdrInitializeThunk 主线程真正跑起来,在这里完成全部 DLL 加载、导入表重定位,之后才跳转到 exe 入口点
⚡关键漏洞时机:第 5 步,LdrInitializeThunk 执行期间,还没跑用户代码、安全检测 DLL 还未初始化,这是注入的经典时机
狸猫换太子原理 - 使用 CreateProcess 创建进程 A,挂起主线程
- 在 Ldr 初始化完成前,把内存里 A 的代码覆盖成 B 程序
- 恢复线程执行,执行 B 逻辑
- 任务管理器显示进程 A,实现伪装,恶意软件常用该思路
安全对抗要点
- 用户双击程序,本质explorer.exe调用CreateProcessA/W生成子进程
- 进程伪装:修改 EPROCESS 里进程名字,伪装成系统进程,如services.exe;但线程数量、模块列表会暴露异常
- 防护:不能只看进程名,要校验模块列表、线程数量、原始磁盘文件哈希
总结
- 进程提供资源,线程执行代码;进程本身不会跑指令
- 用户空间每个进程互相隔离;内核空间全部进程共享
- ntdll.dll是每个 Windows 用户进程必加载的底层 dll
- LdrInitializeThunk是进程真正完成 DLL 加载的入口,注入常用时机

782

被折叠的 条评论
为什么被折叠?



