【问题标题】:IDA 6.5 show "??" in decompileIDA 6.5 显示“??”在反编译
【发布时间】:2014-12-04 02:46:41
【问题描述】:

IDA pro 6.5 无法完全反编译我的文件 (binary.exe)。从偏移量 00409400 到 00417000 “十六进制视图”选项卡显示“??”作为 ASCII 字符。

但是当我用十六进制工作室或其他十六进制编辑器尝试这个文件时,都认为是正确的。

为什么 IDA 不能正确反编译我的二进制文件?

【问题讨论】:

  • 可能没有映射到该内存范围的 PE 文件部分。
  • 这个文件是 aspack 保护的,我用 ollydbg(ollydump) 解压。 PE问题相关吗?

标签: reverse-engineering ida


【解决方案1】:

短版

??s 表示在可执行文件中没有映射的字节。在 Windows 中,当图像加载到内存中时,它们将被初始化为零。如果不清楚,请继续阅读:

部分的工作原理

(根据 cmets,我假设您正在查看 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;

成员PointerToRawDataSizeOfRawData 描述了可执行文件中包含该节字节的偏移量。成员VirtualAddressVirtualSize 描述了要在内存中映射节的虚拟地址。

请注意,SizeOfRawDataVirtualSize 有单独的字段。当SizeOfRawData < VirtualSize时,映射中剩余的字节用零填充。这是一个有用的优化,允许链接器为不需要初始化内容的全局变量指定内存而不浪费空间在可执行文件中。

为了清楚起见,已经为带有?? 标记的地址定义了一个部分,但这些地址的内容在文件中未初始化。您可以通过PE viewer 验证这一点。

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2022-08-04
    • 2023-03-23
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多