IDA pro 6.5无法完全反编译我的文件(binary.exe)。从偏移00409400到00417000“十六进制视图”选项卡显示“??”作为ASCII字符。
但是当我使用十六进制工作室或其他十六进制编辑器尝试此文件时,所有人都认为是正确的。
为什么IDA无法正确反编译我的二进制文件?
答案 0 :(得分:2)
??
表示在可执行文件中没有映射的字节。在Windows中,当图像加载到内存时,它们将被初始化为零。如果不清楚,请继续阅读:
(根据评论,我假设您正在查看PE文件)
在PE file format中,定义了许多部分。每个部分描述了加载到内存中的图像的一部分及其属性。通常有代码的可执行部分,全局变量的可读/可写部分,常量值的只读部分,以及其他一些部分。
定义部分的简化版the section structure看起来像这样:
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
DWORD VirtualSize;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
...
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
成员PointerToRawData
和SizeOfRawData
描述了可执行文件中包含该部分字节的偏移量。成员VirtualAddress
和VirtualSize
描述了要在内存中映射该部分的虚拟地址。
请注意,SizeOfRawData
和VirtualSize
有单独的字段。当SizeOfRawData < VirtualSize
时,映射中的剩余字节用零填充。这是一个有用的优化,允许链接器为全局变量指定内存,其内容不需要在没有初始化的情况下进行初始化在可执行文件中浪费空间。
因此,需要明确的是,已为具有??
标记的地址定义了一个部分,但这些地址的内容在文件中未初始化。您可以使用PE viewer验证这一点。