我创建了一个简单的.exe文件,该文件仅将3的值分配给称为“ x”的整数,然后打印出该值。以下是源代码的图片:
我用一个名为HxD的十六进制编辑器打开了.exe文件,并使用Visual Studio 2017的反汇编功能向我展示了我主要功能的操作码。经过一番搜索,我发现主要功能存储在偏移量为0xC10的文件中
这是反汇编:disassembly
以下是十六进制编辑器中的文件:hexadecimal view of .exe file
我知道十六进制编辑器中.exe文件的某些值与Visual Studio调试器所说的不同,但我知道主要从那里开始,因为我在十六进制编辑器中更改了x的值,然后在启动时.exe,它打印出了另一个值而不是3。我的问题是,.exe文件中的值表示:“在该点上,开始主函数的操作码。”
例如,在.bmp文件中,位置0x0A,0x0B,0x0C和0x0D的4个字节告诉您第一个像素的第一个字节的偏移量。
答案 0 :(得分:0)
.exe
是portable executable。
布局
便携式可执行32位的结构 PE文件由许多标题和节组成,这些标题和节告诉动态链接程序如何将文件映射到内存中。可执行映像由几个不同的区域组成,每个区域需要不同的内存保护。因此,每个部分的开头都必须与页面边界对齐。[4]例如,通常将.text部分(保存程序代码的 )映射为execute / readonly,然后...
因此,实际上这是.text
节在文件中的位置的问题。确切的位置取决于其他部分的标题和位置。
答案 1 :(得分:0)
在Windows上,可执行文件(.exe
)的入口点在文件的PE Header中设置。
WikiPedia说明了此标头like this (SVG file)的结构。
相对于文件的开头,PE标头从地址所指示的位置开始
DWORD 0x3C指向PE标头的指针
File Header / DOS Header
+--------------------+--------------------+
0000 | 0x5A4D | | |
0008 | | |
0010 | | |
0018 | | |
0020 | | |
0028 | | |
0030 | | |
0038 | | PE Header addr |
0040 | | |
.... | .................. | .................. |
进入点被指定在相对于上述地址的位置
DWORD 0x28 EntryPoint
PE Header
+--------------------+--------------------+
0000 | Signature | Machine | NumOfSect|
0008 | TimeDateStamp | PtrToSymTable |
0010 | NumOfSymTable |SizOfOHdr| Chars |
0018 | Magic | MJV| MNV | SizeOfCode |
0020 | SizeOfInitData | SizeOfUnInitData |
0028 | EntryPoint (RVA) | BaseOfCode (RVA) |
0030 | BaseOfData (RVA) | ImageBase |
0038 | SectionAlignment | FileAlignment |
0040 | ... | ... |
从PE标头的开头开始。该地址是RVA (Relative Virtual Address),表示它相对于加载程序将文件加载到的图像基址:
相对虚拟地址(RVA)不应与标准虚拟地址混淆。相对虚拟地址是对象从文件加载到内存后的虚拟地址,减去文件映像的基址。
此地址是主要功能的地址。