PE 文件中没有 .BSS

2023-11-30

这是简短的控制台应用程序示例

static char buffer[4096];
int main() {
    for(int i=0;i<4096;i++) {
        buffer[i] = 1234;
    }
    return 0;
}

据我了解,编译器生成的“exe”文件应包含 .bss 部分来存储“缓冲区”变量。

我正在使用 Tiny C 编译器,生成的文件不包含任何对 .bss 的引用。

DOS Header
Magic number:                    0x5a4d (MZ)
Bytes in last page:              144
Pages in file:                   3
Relocations:                     0
Size of header in paragraphs:    4
Minimum extra paragraphs:        0
Maximum extra paragraphs:        65535
Initial (relative) SS value:     0
Initial SP value:                0xb8
Initial IP value:                0
Initial (relative) CS value:     0
Address of relocation table:     0x40
Overlay number:                  0
OEM identifier:                  0
OEM information:                 0
PE header offset:                0x80

COFF/File header
Machine:                         0x14c IMAGE_FILE_MACHINE_I386
Number of sections:              2
Date/time stamp:                 0 (Thu, 01 Jan 1970 00:00:00 UTC)
Symbol Table offset:             0
Number of symbols:               0
Size of optional header:         0xe0
Characteristics:                 0x30f
                                 IMAGE_FILE_RELOCS_STRIPPED
                                 IMAGE_FILE_EXECUTABLE_IMAGE
                                 IMAGE_FILE_LINE_NUMS_STRIPPED
                                 IMAGE_FILE_LOCAL_SYMS_STRIPPED
                                 IMAGE_FILE_32BIT_MACHINE
                                 IMAGE_FILE_DEBUG_STRIPPED

Optional/Image header
Magic number:                    0x10b (PE32)
Linker major version:            6
Linker minor version:            0
Size of .text section:           0
Size of .data section:           0
Size of .bss section:            0
Entrypoint:                      0x1060
Address of .text section:        0x1000
Address of .data section:        0x2000
ImageBase:                       0x400000
Alignment of sections:           0x1000
Alignment factor:                0x200
Major version of required OS:    4
Minor version of required OS:    0
Major version of image:          0
Minor version of image:          0
Major version of subsystem:      4
Minor version of subsystem:      0
Size of image:                   0x4000
Size of headers:                 0x200
Checksum:                        0x95d5
Subsystem required:              0x3 (IMAGE_SUBSYSTEM_WINDOWS_CUI)
DLL characteristics:             0
Size of stack to reserve:        0x100000
Size of stack to commit:         0x1000
Size of heap space to reserve:   0x100000
Size of heap space to commit:    0x1000

Data directories
IMAGE_DIRECTORY_ENTRY_IMPORT:    0x2000 (40 bytes)
IMAGE_DIRECTORY_ENTRY_IAT:       0x2028 (32 bytes)

Imported functions

msvcrt.dll
                                 _controlfp
                                 __set_app_type
                                 __getmainargs
                                 exit
                                 _XcptFilter
                                 _exit
                                 _except_handler3
export directory not found

Sections
Name:                            .text
Virtual Address:                 0x1000
Physical Address:                0x1e8
Size:                            0x200 (512 bytes)
Pointer To Data:                 0x200
Relocations:                     0
Characteristics:                 0x60000020
                                 IMAGE_SCN_CNT_CODE
                                 IMAGE_SCN_MEM_EXECUTE
                                 IMAGE_SCN_MEM_READ
Name:                            .data
Virtual Address:                 0x2000
Physical Address:                0x10e0
Size:                            0x200 (512 bytes)
Pointer To Data:                 0x400
Relocations:                     0
Characteristics:                 0xc0000040
                                 IMAGE_SCN_CNT_INITIALIZED_DATA
                                 IMAGE_SCN_MEM_READ
                                 IMAGE_SCN_MEM_WRITE

可执行文件的反汇编版本引用“buffer”变量,就好像它位于 .data 部分之后一样。怎么运行的 ? PE加载器如何知道它应该在.data节之后保留特定区域?

可执行文件:https://www.dropbox.com/s/99bpil11j7396ej/test-bss.exe?dl=0
PEDUMP 在线:http://pedump.me/40c40172cf08c89c3d97bd6840dbd3a0/


现在已知 .data 部分的实际内存和磁盘大小,我认为可以解释在哪里buffer位于何处以及如何到达那里。

为了保持一致性,我使用的术语来自Microsoft 可移植可执行文件和通用对象文件格式规范.

这就是我们对 .data 部分的了解,它的 VirtualSize 是 4320 (0x10E0),它的 SizeOfRawData 是 512 (0x200)。这意味着 .data 部分在磁盘上有 512 字节,但在内存中被零填充到 4320 字节的大小。 SizeOfRawData 值是可执行文件中已初始化数据的大小,当您从 VirtualSize 中减去该值时,您将得到未初始化数据的大小。正如注释中所指出的,这意味着 .data 部分有 3808 字节的未初始化数据,这没有足够的空间来包含名为的 4096 字节数组buffer.

那么在哪里buffer?它必须从 .data 节的已初始化部分的某个位置开始,并继续到未初始化部分。 PECOFF 要求 SizeOfRawData 值向上舍入到 FileAlignment 的下一个倍数 (512)。这意味着当链接器创建可执行文件的 .data 部分时,它会用未初始化的数据填充磁盘上的已初始化数据,以便 SizeOfRawData 最终成为 512 的倍数。换句话说,可执行文件中的实际初始化数据量小于 512字节数,实际未初始化数据量大于3808。

此图试图显示链接器如何布局 .data 部分。顶部部分表示链接器在内存中相对于 .data 节的开头放置可执行文件中使用的所有已初始化变量和未初始化变量的位置。中间部分显示了哪里buffer被安置。底部部分显示了 .data 部分中作为可执行文件中的初始化数据存在的部分。

+------------------+----------------------------------------+
| Initialized Vars | Uninitialized Variables                |
+--------------------+-----------------------------------+--+
|                    | buffer[4096]                      |  |
+--------------------+---+-------------------------------+--+
| Initialized on Disk    |                                  4320
+------------------------+
0                        512   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PE 文件中没有 .BSS 的相关文章

  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • 将spark.local.dir设置为不同的驱动器

    我正在尝试在 Windows 10 上设置独立 Spark 我想设置spark local dir to D spark tmp tmp 目前它似乎正在使用C Users
  • Windows - 启动时自动启动特定应用程序

    在 Windows 操作系统中开发信息亭应用程序 当机器启动时 必须依次发生 3 件事 Node js 服务器启动 包含 Web 应用程序的浏览器以 kiosk 模式启动 另一个客户端应用程序启动 是否有一个实用程序可以轻松完成此操作 或者
  • 发送和接收 Windows 消息

    Windows 消息似乎是通知 Windows 操作系统上的应用程序的好方法 它实际上运作良好 但我想到了几个问题 How to指定结构化数据lparamSendMessage 例程 就像许多消息代码一样 我的意思是 参数当然是一个指针 但
  • 如何设置扬声器声音增强设置

    如何以编程方式设置 Windows 扬声器设置 增强 选项卡 中可用的声音效果 恐怕这是不可能的 参见 Maurits 对他的评论blog http blogs msdn com b matthew van eerde archive 20
  • 如何获取打印机设备上下文?

    我在 Windows 上尝试使用以下命令打印增强型图元文件 EMF 播放增强元文件 http msdn microsoft com en us library dd162800 28VS 85 29 aspx 我当前正在使用屏幕上窗口的设备
  • 使用 CMake 和 clang 在 Windows 上构建简单的 C++ 项目

    我正在尝试在 Windows 10 上构建一个简单的 Hello World 程序 最好使用 CMake 和 clang 如果我使用 MinGW 的 g 编译器 我可以成功编译 链接和运行同一个项目 但当我尝试使用 clang 时会遇到问题
  • Git,无法在 Windows 上克隆存储库

    我正在尝试在 Windows 上使用 git 克隆远程存储库 我可以在我的 mac 上克隆它 但在 Windows 上我遇到了问题 当使用 git bash 克隆时 我收到一条消息 指出服务器的主机密钥未缓存在注册表中 它要求我按 y 或
  • 如何用 Java 制作 Windows 7 工具提示

    我一直在网上到处寻找 但没有找到这个小问题的答案 在 Windows 7 中 我认为在 Vista 中 您有一个漂亮的圆形银色工具提示 它看起来比旧的黄色盒装蹩脚工具提示要好得多 下面的 How do I make a Windows 7
  • 为什么不鼓励在 Windows 上将 PPM perl 模块与 Strawberry perl 一起使用?

    任何人都可以解释为什么人们会发表此评论吗 我在 stackoverflow 上看到了几个线程 像这个 https stackoverflow com questions 6643939 installing modules using st
  • 从 C++ 源文件创建 Windows DLL

    我有多个 C 源文件 我想使用它们创建动态链接库 我在 linux 中使用 gcc shared 和 ln 看到这种情况发生 但是对于 Windows 我想我必须修改源文件才能生成 DLL 有没有办法用提供的源文件生成DLL 类似于linu
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 将 SQL 数据库附加到 ComboBox.ItemSsource (WPF)

    我想知道如何将 SQL Server 数据库分配给 ComboBox 的 ItemSource 属性 在 WPF 应用程序中 我将数据源分配给项目 但不知道如何分配给属性 此致 你可以这样尝试 你可以像下面这样绑定组合框的项目源属性 Ite
  • 如何使用 LOCK ASM 前缀来读取值?

    我知道如何使用 LOCK 来线程安全地递增一个值 lock inc J 但是如何以线程安全的方式读取 J 或任何值 LOCK 前缀不能与 mov 一起使用 如果我执行以下操作 xor eax eax lock add eax J mov J
  • 如何从 Windows 批处理文件中的 ECHO 字符串中去除引号?

    我正在创建一个 Windows 批处理文件 但我必须 ECHO 一个大型复杂字符串 因此我必须在两端加上双引号 问题是引号也被回显到我正在写入的文件中 如何 ECHO 这样的字符串并去掉引号 UPDATE 我花了两天的时间研究这个问题 终于
  • .NET 进程分配的内存何时释放回 Windows

    设置 NET 在启动时以及在收集后尝试满足分配请求时 分段为每一代的堆 0 1 2 LOH 分配内存 以获得连续的内存块 为每个堆分配的内存可能会随着应用程序 预热 而趋于平稳 但第 2 代和大型对象堆可能除外 在垃圾收集期间 每个堆 0
  • 堆栈独立的C/C++蓝牙API?

    我想知道是否有适用于 Windows XP Vista 7 x86 和 x64 的堆栈独立 C C 蓝牙 api 我的目标是创建连接并通过蓝牙发送 接收一些时间关键的数据 我的研究给了我以下选择以及这项任务的缺点 用于蓝牙的 Windows
  • 检测 C++/Win32 中的进程崩溃

    我正在开发一个包含 2 个程序的软件 Qt Main exe OpenGL Game exe 我们一开始总是使用 Qt Main exe 当我们点击 开始游戏 按钮时 我们执行OpenGL Game exe 这样做没问题 问题是 有时我们的
  • Java:以管理员身份运行

    Java 有没有办法要求系统控制管理员功能 当然不做 右键单击exe gt 以管理员身份运行 我想要的是 UAC 提供一个像 Windows Vista 或 Windows 7 中的框架 或者我在从 jar 生成 exe 时需要做一些设置吗
  • 使用 PHP 针对远程证书进行 Windows 应用商店 IAP 签名验证

    我正在尝试验证 Windows 应用商店应用程序的 PHP 中的 IAP 收据 基本上 尝试将此示例代码转换为 PHPhttp msdn microsoft com en us library windows apps jj649137 a

随机推荐

  • 大 VLA 溢出

    根据某人在另一个线程中的评论 VLA 带来的问题比它们解决的问题还要多 因为你永远不知道 如果声明会因为 x 太大而崩溃 堆 这段代码会溢出 因为sizeof a 对于堆栈来说太长 include
  • 如何在 Jmeter Webdriver 采样器中使用 chromeoption 和desirecapability?

    我正在使用带有 chrome 浏览器的 Jmeter webdriver 采样器 我需要在 jmeter 中使用 chromeoption 和desire 功能 如何编码以使用这些选项 我想使用的示例代码可以是这样的 ChromeOptio
  • jQuery 拖放 ul 和 li 元素

    一方面我得到了清单 ul and li The ul and li 元素应该被拖放 目标是一个div or span 我怎样才能开始呢 基本上你的draggables将是 li li 元素和你的 droppable 将是 div or sp
  • 在 SELECT 中选择行作为列[重复]

    这个问题在这里已经有答案了 可能的重复 如何选择列作为行 我有一张带有 ID 的桌子 例如 Table 1 2 3 4 5 and so on 我有这个疑问 选择A B 这里我需要选择 Id 作为列 来自我的表 所以结果将是 A B 1 2
  • x86 GNU 汇编器奇怪的变化段错误

    下面的 x86 汇编代码可以很好地编译 并且它曾经在我学校的 Linux 服务器上完美运行 但是当将相同的代码应用到我的 Linux 虚拟机 ubuntu 14 04 时 突然会导致分段错误 堆栈约定是否发生变化 这是 GNU 汇编器问题吗
  • 更改 TextView 中的文本字距或间距?

    我有一个要求 TextView 中的字母需要间隔远一些 不幸的是 我找到的大多数资源似乎都表明这是不可能做到的 至少不容易做到 到目前为止 明显的解决方案是 在字符串中的字符之间添加空格 改为 A B C 的 ABC 当然 如果空间再多一点
  • 在函数中找不到 PHP 全局变量 [重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中的全局变量 我有一个类似的 PHP 脚本 global var1 function func1 var1 gt something var1 not found why 我必须在每个函数中执
  • 统计普罗米修斯发出的警报数

    我有 Prometheus 定义了一些警报规则 我想获得有关 Prometheus 发出的警报数量的统计数据 我试图计算用 grafana 触发警报的次数 但它不起作用 SUM ALERTS alertname XXX alertstate
  • SwiftUI - AppStorage 不适用于 GeometryReader

    这是一个简单的例子 您可以创建新的 SwiftUI iOS 项目并将其复制到 ContentView 文件 import SwiftUI struct Settings static let onOff onOff struct Conte
  • 如何让CSS Grid最后一行占用剩余空间

    我有一个行数可变的网格 我希望最后一个网格的高度为 1fr 像这样的事情 有什么办法可以做到这一点吗 你可以使用 flex 来实现这一点 父容器应该有display flex 我们想垂直使用它 所以我们将像这样改变弯曲方向flex dire
  • 如何使用 ctypes python 指针更改结构体字段

    下面是我使用 ctypes 访问 dll 值的代码 我的目的是存储结构字段地址 每当结构中的值发生变化时 我都可以访问地址并获取更改后的值 DUMMY DLL PATH dummyModel dll class MyStruct ctype
  • HTML 5 API:我可以在上传之前检查我的 csv 文件是否包含某些列吗?

    我正在制作一个网页 使用 HTML5 文件上传 API 将 csv 文件上传到服务器 但在上传之前 我想验证 csv 是否包含某些列 例如 我需要一个名为 id 的列 如果该列不存在 我不想上传它 目前我正在等待文件完全上传到服务器 并检查
  • 尝试使用 Window.FEATURE_CUSTOM_TITLE 但出现异常:您无法将自定义标题与其他标题功能结合起来。

    我正在尝试使用自定义标题在标题栏上包含图像按钮 我从这篇文章中得到了很多帮助 android 将按钮添加到应用程序的标题中 但无法让它为我的 ListActivity 工作 简而言之 以下是我所拥有的 我在 AndroidManifest
  • Google Map Lite 模式 moveCamera 到 lat lng 边界添加了不需要的地图填充

    我希望地图相机移动到我的 LatLngBounds 所以我将地图片段添加到布局中BaseExpandableListAdapter s getChildView and onMapReady I ll moveCamera to LatLn
  • 是否可以更改 JQuery JQuery UI 自动完成生成的 Url?

    我正在使用 JQuery JQueryUI 的自动完成代码 它转到我提供的网址 以查找答案 但附加 term
  • 在 Java 中使用 JXL 复制工作表

    我想将现有 XLS 文档中的一张表复制到新文档的新位置 我怎样才能用 JXL 做到这一点 Workbook w1 Workbook getWorkbook new File ExistingDocument xls settings Wri
  • 客户端分页在智能表中不起作用

    所以我得到了一个智能表 用于重新加载整个数据集 我需要它来绘制图表 但我不希望所有数据立即渲染 太多 所以在文档中有一个叫做 客户端分页 但由于某种原因这似乎不起作用 objectDataArr 0 保存整个数据集 我的模拟是 div cl
  • Java 8 中接口方法的隐式说明符/修饰符是什么?

    我知道接口方法是隐式的public Java 文档教程 says All abstract default and static接口中的方法有 隐含地public 因此您可以省略 public 修饰符 Java 8 中隐式声明了抽象 静态和
  • 将复选框列表添加到 UIAlertController

    我正在与UI警报控制器 现在我可以通过以下代码列出一个项目 UIAlertController controller UIAlertController alertControllerWithTitle Beds message prefe
  • PE 文件中没有 .BSS

    这是简短的控制台应用程序示例 static char buffer 4096 int main for int i 0 i lt 4096 i buffer i 1234 return 0 据我了解 编译器生成的 exe 文件应包含 bss