2014-01-17 95 views
1

我有以下代码:编译器误解

IMAGE_THUNK_DATA* ori_iat; 
ori_iat += sizeof(IMAGE_THUNK_DATA) 

generates the asm: 

MOV EAX, ORI_IAT; 
ADD EAX, 10h; 
MOV ORI_IAT; EAX 

这是不是我想要的,因为IMAGE_THUNK_DATA的的sizeof应该是8, 我现在试试这个:

IMAGE_THUNK_DATA* ori_iat; 
DWORD addr = (DWORD)ori_iat; 
addr += sizeof(IMAGE_THUNK_DATA) 
ori_iat = (IMAGE_THUNK_DATA)addr; 

generates the asm: 

MOV ADDR, ORI_IAT; 
ADD ADDR, 4; 
MOV ORI_IAT, ADDR; 

又错了,现在让我们试试这个:

IMAGE_THUNK_DATA* ori_iat; 
ori_iat += (DWORD)sizeof(IMAGE_THUNK_DATA); 

generates the asm: 

MOV EAX, ORI_IAT 
MOV ECX, 10h 
LEA EAX, [EAX+ECX*4] 

非常糟糕,我不知道如何告诉编译器我只是想添加8到当前的指针和它真的很烦人。

UPDATE:也在寻找它有四个DWORD这是大小0x10h的IMAGE_THUNK_DATA但据我所看到的对倾倒在Ollydbg的有关IMAGE_THUNK_DATA结构它是这样的:

C5 87 87 00 | 00 00 00 00 
DB 87 87 00 | 00 00 00 00 
F7 87 87 00 | 00 00 00 00 
0E 88 87 00 | 00 00 00 00 

这使我认为结构的大小实际上是大小8.

求助:感谢++运营商。我不习惯与指针的工作,也是IMAGE_THUNK_DATA结构的实际大小4.每个IMAGE_IMPORT_DESCRIPTOR指向下一个IMAGE_THUNK_DATA,所以我不好:)

+0

您是否考虑过帧对齐优化?尝试'-O0' –

回答

3

我想你想的

ori_iat++ 

因为在C/C++

 ptr + i 

等同于

 &(ptr[i]) 
+0

非常感谢,我的错误长度也是结构,它的大小为4 :) – ffenix

1

sizeof返回字节。给指针加1会使数据类型的大小增加。

ori_iat += sizeof(IMAGE_THUNK_DATA) 

根据你相同

ori_iat += 8 

所以,这增加了由8 * sizeof(*ori_iat)ori_iat,这应该是64,而不是在组件(0×10)中示出16。

所以,sizeof(IMAGE_THUNK_DATA)必须是16的平方根,这是4

事实上,汇编程序的下一个片段显示尺寸实际上是4,而不是8(因为你没有加入的指针,但是到了正常的整数变量,它会直接添加数字)。

+0

感谢您的回答,IMAGE_THUNK_DATA大小错误,其大小为4,每个IMAGE_IMPORT_DESCRIPTOR指向下一条记录,但IMAGE_THUNK_DATA之间仍然有4个字节的差距,不知道为什么。大概填充到8字节... – ffenix

+0

@ffenix修复了答案,第一个版本是错误的(指针的大小与此无关)。 – hyde

+0

为什么ollydbg显示4以外的东西,我不知道。通常由padding理解的内容包含在struct的'sizeof'中,因为当在数组中使用时,'sizeof'必须是数组元素之间的分隔符。这可能是由于甚至8字节的对齐,当你有单个结构变量时,或者由于堆分配在堆中的堆块大小粒度等原因。 – hyde