2016-03-05 85 views
0

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

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

+1

你需要知道使用的指令,而不仅仅是大小和内存地址。典型的编译器输出将使用'movsd' /'movss'用于FP加载,'mov'用于整数加载(到gp regs)或'movd' /'movq'(到矢量regs)。负载也可以是ALU操作的内存操作数。 –

+0

@PeterCordes,谢谢你的回答。我似乎只在我用-O1/2/3标志进行编译时才获得FP加载的movss。定期编译似乎只会生成mov A,dword <..>。这可能是什么原因造成的?您可以将其作为评论删除,并作为答案发布。我会接受:) – user3875690

+0

你可以发表一个例子吗?我不认为gcc应该使用'mov eax,dword [mem]'来加载一个浮点数,即使它只是马上重新存储它而不做任何FP数学运算。在http://gcc.godbolt.org/中键入或复制一个函数,然后单击“永久链接”。我的评论不是这个问题的正确答案,因为你仍然无法区分'int64_t'和指针。有些编译器会将结构复制到跨越多个较窄成员的广泛加载/存储中(如'int')。 –

回答

0

您无法通过其大小推断操作数的类型。我甚至怀疑你可以在指导下以可靠的方式做到这一点。