【发布时间】: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。)