【问题标题】:Inferring type information from memory read size从内存读取大小推断类型信息
【发布时间】:2016-06-19 16:25:17
【问题描述】:

我正在使用 PIN 来检测我的应用程序二进制文件并生成应用程序生成的地址列表(更具体地说是内存读取)。我有一个检测例程,它将 IARG_MEMORYREAD_SIZE、IARG_MEMORYREAD_EA 作为参数传递。但是,我想根据正在读取的内存大小来推断应用程序变量的类型信息。

例如, 如果 PIN 观察到 4 个字节的内存读取,我如何判断正在访问什么类型的数据。它是 int/float 吗?同样,对于8字节的数据,我怎么知道数据是双变量还是指针类型变量。

【问题讨论】:

  • 您需要知道使用的指令,而不仅仅是大小和内存地址。典型的编译器输出将使用 movsd / movss 用于 FP 加载,mov 用于整数加载(到 gp regs)或 movd / movq(到向量 regs)。加载也可以是 ALU 操作的内存操作数。
  • @PeterCordes,感谢您的回答。我似乎只有在使用 -O1/2/3 标志编译时才能获得用于 FP 加载的 movss。常规编译似乎会生成 mov A, dword <..>只有。这可能是什么原因?您可以将此作为评论删除并作为答案发布。我会接受的:)
  • 你能举个例子吗?我认为 gcc 不应该使用 mov eax, dword [mem] 来加载浮点数,即使它只是立即再次存储它而不进行任何 FP 数学运算。在gcc.godbolt.org 中键入或复制一个函数,然后单击“永久链接”。我的评论不是对该问题的正确答案,因为您仍然无法将 int64_t 与指针区分开来。并且一些编译器将复制结构,其中包含跨越多个较窄成员的广泛加载/存储(如int。)

标签: intel intel-pin


【解决方案1】:

您无法仅通过操作数的大小来推断操作数的类型。我什至怀疑您是否可以按照说明以可靠的方式做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多