C++ 编译错误
我有以下代码:C++ 编译错误,c++,oop,assembly,C++,Oop,Assembly,我有以下代码: 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 这不是我想要的,因为图像数据的大小应该是8, 现在我试试这个: IMAGE_THUNK_DATA* ori_iat; DWORD addr = (DWORD)ori_iat; addr += sizeof(IMAGE
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
这不是我想要的,因为图像数据的大小应该是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]
又错了,现在让我们试试这个:
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,这真的很烦人
更新:同时查看图像数据,它有4个DWORD,大小为0x10h,但根据我在Ollydbg的DUMP上看到的关于图像数据结构的内容,它是这样的:
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
已解决:感谢++运算符。我不习惯使用指针,也不习惯使用图像数据结构,它的大小实际上是4。每个图像\u导入\u描述符都指向下一个图像\u THUNK\u数据,所以我很糟糕:)我想你想要的是
ori_iat++
因为在信用证中++
ptr + i
相当于
&(ptr[i])
我想你想要的是
ori_iat++
因为在信用证中++
ptr + i
相当于
&(ptr[i])
sizeof
返回字节。向指针添加1会按数据类型的大小增加指针的大小
ori_iat += sizeof(IMAGE_THUNK_DATA)
据你所说
ori_iat += 8
因此,这会将ori_iat
增加8*sizeof(*ori_iat)
,该值应为64,而不是组件(0x10)中显示的16
因此,sizeof(IMAGE\u THUNK\u DATA)
必须是16的平方根,即4
实际上,汇编器的下一个片段显示大小实际上是4而不是8(因为您并没有添加到指针,而是添加到普通整数变量,它将直接添加数字)。
sizeof
返回字节。向指针添加1会按数据类型的大小增加指针的大小
ori_iat += sizeof(IMAGE_THUNK_DATA)
据你所说
ori_iat += 8
因此,这会将ori_iat
增加8*sizeof(*ori_iat)
,该值应为64,而不是组件(0x10)中显示的16
因此,sizeof(IMAGE\u THUNK\u DATA)
必须是16的平方根,即4
事实上,汇编程序的下一个片段显示大小实际上是4,而不是8(因为您并没有添加到指针,而是添加到普通整数变量,它将直接添加数字)。您考虑过帧对齐优化吗?尝试
-O0
您是否考虑过帧对齐优化?试试-O0
谢谢你的回答,我的结构长度也不对,它的大小是4:)谢谢你的回答,我的结构长度也不对,它的大小是4:)谢谢你的回答,我的图像数据大小不对,它的大小是4,每个图像导入描述符指向下一个记录,但是图像数据之间仍然有4个字节的间隔,不知道为什么。可能是为了填充到8字节…@ffenix修复了答案,第一个版本是错误的(指针的大小与此无关)。我不知道为什么ollydbg会显示4以外的内容。通常通过填充理解的内容包含在struct的sizeof
中,因为在数组中使用时,sizeof
必须在数组元素之间分隔。这可能是由于在使用单个结构变量时对齐到8个字节,或者如果在堆中分配,则是由于堆块大小粒度,或者类似的原因。感谢您的回答,我为IMAGE_THUNK_数据设置了错误的大小,其大小为4,每个IMAGE_IMPORT_描述符指向下一条记录,但是图像数据之间仍然有4个字节的间隔,不知道为什么。可能是为了填充到8字节…@ffenix修复了答案,第一个版本是错误的(指针的大小与此无关)。我不知道为什么ollydbg会显示4以外的内容。通常通过填充理解的内容包含在struct的sizeof
中,因为在数组中使用时,sizeof
必须在数组元素之间分隔。这可能是由于在使用单个结构变量时对齐到8个字节,或者是由于在堆中分配了堆块大小粒度,或者类似的原因。