[继续讨论]关于Windows PE和.net assembly的加载

简介: 在firelong写的关于近期C#大论战的回应的评论中有许多观点。有些话题当时没有看清楚。后来抽时间看了一下。那些评论里面的观点实在太多,没有办法一一验证。我只谈我的发现。   1. SizeOfImage对Windows PE内存加载的影响   我开始建立起来的概念是Windows PE都会全部加载进内存执行。

在firelong写的关于近期C#大论战的回应的评论中有许多观点。有些话题当时没有看清楚。后来抽时间看了一下。那些评论里面的观点实在太多,没有办法一一验证。我只谈我的发现。

 

1. SizeOfImage对Windows PE内存加载的影响

 

我开始建立起来的概念是Windows PE都会全部加载进内存执行。当那个评论中有人提到了RAR自解压EXE。我当时是想当然地认为RAR自解压EXE同样也会全部加载进内存. 后来经其他人的指出,还有做试验,证实即使物理内存不够大同时没有页面文件的情况下也能解压一个很大的文件。我真有点想不透是什么原因。当时有一个网友gussing提到了SizeOfImage参数, 让我有点启发。后来经过进一步的查看,才知道RAR自解压EXE是Windows PE的一种特例。这个特别之处就在SizeOfImage参数上。用Windbg装入一个35M的RAR自解压EXE, 然后用RAMMap查看其物理内存占用.发现其内存占用大约是0x00020000. 再用CFF explorer VII查看其PE文件, 果然SizeOfImage字段是0x00020000.

其他的Windows PE文件呢,如ntdll.dll,其SizeOfImage是0x00127000, 其文件大小是1,202,168, 十六进制是0x1257F8. 看来SizeOfImage刚好和文件大小相匹配,刚刚足以装下这个ntdll.dll本身。再看Windows文件夹下许多其他的EXE/DLL, 很多都是SizeOfImage与其文件大小刚好相匹配。

综上所述, SizeOfImage决定了PE加载到内存里的大小。

 

2. Windoes PE是用File mapping加载的

 

网友Ivony一直说这个观点。现在经过证实了。上一张图来说明问题:

img_d2116b82d556c091c1181166eec1665e.jpg

图一

这个图二可以帮组你理解File mapping是怎么运作的。

img_531a50124363984b7f24407343231bb6.jpg

图二

 

3. 许多Windows PE是全部加载进内存的

 

上面那个图一已经告诉我们MSPAINT.EXE在内存里的物理地址,而且上下卷动一下,你会发现每个物理内存页都是Active. 就是都在内存里。当然了,不是所有的Windows PE都全部加载进内存。因为这受SizeOfImage参数影响。

 

4. .net assembly(即.net PE)也是全部加载进内存的

 

首先.net PE的SizeOfImage也是与其文件大小相匹配的。这是前提。接下来看看实际的证据:

我的.net PE文件大小27M左右:

img_fbc229ec4c0278fad2c2d3cf215e0150.jpg

图三

运行之后,用RAMMap查看物理内存页状态:

img_785a857c418b0b3919efedfc236cc71d.jpg

图四

img_93e78550f8c30bbdb4a51bfedfb21679.jpg

图五

这个文件很大。内存页有很多。上下翻动看了一下,除了前面有一些Standby之外,大部分是Active,就是说大部分在内存里面. 但是为什么会有Standby呢?开始还是不太明白。直到我看到了VMMap给出的图:

img_ea5c58e228be4f307431c29e968ab213.jpg

图六

img_b0e7b71471085dfaa875aa14d3976257.jpg

图七

看到.net PE的这些节没有: header, .text, .rsrc, .reloc, 还有标记为Reserved的节没有。对比了非托管的Windows PE和.net PE, 在内存映像上是有差别的。非托管的Windows PE基本是全部装入内存,而.net PE的内存映像总要空几段。在header和.text之间要空一段,.rsrc和.reloc之间要空一段。

 

5.  另外一个问题, Working set 为什么只有7-8M大呢?

这个.net PE大部分实际上已经进了内存。但是为什么这个进程的Working set为什么只有7-8M大呢?

想起了Working set的定义: The working set of a program is a collection of those pages in its virtual address space that have been recently referenced.
然后又想起了图二。有点明白是什么回事情了。那就是每个进程建立的File view不一样。这个File View对Working set的大小有影响。

 

还是系统地读<Windows Internals>比较好.

 

这里说的,和看到的可能并不是真相。还请达人指点一二。

 

目录
相关文章
|
1月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
510 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
6月前
|
安全 API 数据安全/隐私保护
aipy实战:建设PE文件查杀神器,阻止Windows EXE木马!
本工具为小型木马静态特征查杀工具,专用于检测Windows下的EXE文件是否为可疑木马。核心功能包括:扫描恶意字符串(如keylogger、powershell)、检查熵值异常以判断加密/加壳、揪出可疑API组合(如注册表篡改、网络通信链)以及解析PE头分析编译环境与加壳痕迹。通过提示词实现功能开发,并保存为`aipy_kill_rat.py`文件。测试结果显示,工具成功扫描出426个可疑字符串、超高熵值及恶意API组合,确认目标文件为恶意木马。该工具轻量灵活,适合样本初筛与应急响应,是静态分析的高效利器。
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
211 0
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
11月前
|
区块链 C# Windows
PasteEx:一款.NET开源的Windows快捷粘贴神器
PasteEx:一款.NET开源的Windows快捷粘贴神器
162 17
|
11月前
|
Web App开发 C# Windows
一款.NET开源的Windows资源管理器标签页工具
一款.NET开源的Windows资源管理器标签页工具
162 5
|
11月前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
249 9
|
12月前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
12月前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
算法 Linux API
.NET图像处理的艺术 — 从加载到添加文本,一步步领略图像处理的奇妙世界
.NET图像处理的艺术 — 从加载到添加文本,一步步领略图像处理的奇妙世界
168 2

热门文章

最新文章