我有以下代码:
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 的大小应该是 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 添加到当前指针,这真的很烦人。
更新:同时查看 IMAGE_THUNK_DATA,它有 4 个 DWORDS,大小为 0x10h,但根据我在 Ollydbg 上的 DUMP 上看到的关于 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,所以我很糟糕 :)
最佳答案
我想你想要的是
ori_iat++
因为在 C/C++ 中
ptr + i
相当于
&(ptr[i])
关于c++ - 编译器误区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21178230/