- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是简短的控制台应用程序示例
static char buffer[4096];
int main() {
for(int i=0;i<4096;i++) {
buffer[i] = 1234;
}
return 0;
}
据我了解,编译器生成的“exe”文件应包含用于存储“buffer”变量的 .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 Portable Executable and Common Object File Format Specification 中的术语.
这就是我们对 .data 部分的了解,它的 VirtualSize 是 4320 (0x10E0),它的 SizeOfRawData 是 512 (0x200)。这意味着 .data 部分在磁盘上有 512 字节,但在内存中被零填充到 4320 字节的大小。 SizeOfRawData 值是可执行文件中初始化数据的大小,当您从 VirtualSize 中减去它时,您将得到未初始化数据的大小。如注释中所述,这意味着 .data 部分有 3808 字节的未初始化数据,空间不足以包含名为 buffer
的 4096 字节数组。
那么 buffer
在哪里?它必须从 .data 部分的初始化部分开始,并继续进入未初始化部分。 PECOFF 要求将 SizeOfRawData 值四舍五入到 FileAlignment (512) 的下一个倍数。这意味着当链接器创建可执行文件的 .data 部分时,它用未初始化的数据填充磁盘上的初始化数据,以便 SizeOfRawData 最终成为 512 的倍数。换句话说,可执行文件中初始化数据的实际数量小于 512 bytes,实际未初始化数据量大于3808。
此图试图显示链接器如何布置 .data 部分。顶部表示在内存中相对于 .data 部分开始的位置,链接器放置了可执行文件中使用的所有已初始化变量和未初始化变量。中间部分显示了放置 buffer
的位置。底部部分显示了 .data 部分中作为初始化数据存在于可执行文件中的部分。
+------------------+----------------------------------------+
| Initialized Vars | Uninitialized Variables |
+--------------------+-----------------------------------+--+
| | buffer[4096] | |
+--------------------+---+-------------------------------+--+
| Initialized on Disk | 4320
+------------------------+
0 512
关于windows - PE文件中没有.BSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30019617/
我需要验证给定的二进制文件是否是 PE 文件(例如,如果我将 JS/HTML 或 .class 文件重命名为 .exe 或 .dll),它不会仍然是 PE 文件。解析 PE 文件会给我关于这个问题的信
我想将一些二进制数据附加到我的可执行文件的末尾。这只是为了使我的程序成为一个文件。我尝试使用 UpdateResource 但我用我的特定数据在其中遇到了一些错误,所以我必须使用其他解决方案。所以我需
我知道还有其他一些类似的问题,无论是否是 StackOverflow。我为此研究了很多,但仍然没有找到单一的解决方案。 我正在做一个操作系统作为一个副项目。我一直在做汇编,但现在我想加入 C 代码。
Is the pointer to the PE-header at offset 0x3c in the PE-file always set to 0x80? 我想知道为什么这个指针会改变。我猜
我是操作系统编程的新手,我正在阅读一本书,其中给出了一个简单的内核示例,如下所示: main() { char *video_memory = 0xb8000; *video_memory
我正在用 C# 编写程序,在其中读取 PE 的字节。但是为了获得 RVA,我需要使用部分标题。我想知道节标题的最大数量是多少? 我试过谷歌,我看过这里,但我没有找到任何可以指向正确方向的东西 谢谢。
一个awesome article关于PE格式说明如下: Name. Each section header has a name field up to eight characters long,
我对他们为什么在这里使用 - 1 感到困惑。有人可以解释这条线在非常非常非常低级别的详细信息中所做的事情......不是它的减法 1 结构......我需要了解更多......关于低级别......谢
我可以成功地在内存中加载并运行x32 pe,但是当我调整变量使其与x64可执行文件一起使用时,该程序将无休止地启动其自身的数千个副本,直到您杀死该程序或耗尽内存,而不是从内存启动pe。 我已经进行了尽
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我正在研究 PE 解析器,遇到了一些非常不寻常的事情。 PE 格式中目录的名称和顺序似乎因您查看的位置而异: 来自 PEReader (perdr) : #define IMAGE_DIRECTORY
我试图在IDA中找出一种方法,哪些导出是数据导出,哪些是实函数导出。 例如,让我们看一下Microsoft的msftedit.dll的导出条目: 虽然CreateTextServices是真正的导出函
有很多Windows PE 资源查看器程序。但它们是如何工作的?他们是否解码对 winapi 的函数调用,或者 PE 是否有一些 GUI 信息部分?就像 Android 有 XML GUI 定义一样?
我正在对 PE 文件进行一些批量分析,在解析 PE 文件的导入表时,我发现许多 PE 文件为给定的 DLL 导入了重复的条目...这是为什么?这在功能上提供了什么? 例如,example.exe 导入
我正在使用“PE 编辑器”检查 Windows 可执行文件,它显示入口点为 0x15B8,我们如何确定该入口点的地址为虚拟地址? 最佳答案 入口点是相对于模块的加载地址存储的。 模块可以通过设置 IM
根据这篇文章http://msdn.microsoft.com/en-us/library/ms809762.aspx?ppud=4 我们可以用自定义名称命名 PE 部分。 所以在一个 PE 文件中,
PE 加载器是否完全 加载了任何部分?或者是否加载了节标题中指定的每个节?在 ELF 程序中,应该加载的节头(称为程序头或段)是那些用 PT_LOAD 标记的。 PE项目中有类似的东西吗? 附言。我找
我查看了特定 DLL 的导出表,我在表中看到了一些奇怪的条目,所以我试图在 pecoff 规范中找到这个问题的答案,但没有找到任何答案,我希望有人可能有。 我在某个 DLL (Qt5Core.dll)
我已经问过类似的问题,"PE Header requirements" ,但我对它的答案并不满意。 我正在用 Java SE 1.6 构建一个汇编器/链接器。我已经阅读了大约 5 个关于 PE/COF
我正在“C/C++ - Win32API”环境中编写一个 dll。 我有一些常量变量(都是 DWORD 值和 LPWSTR/LPSTR 字符串),我必须启用用户修改。 我正在寻找的是(希望)一种工具,
我是一名优秀的程序员,十分优秀!