c++ - 编译器误区

标签 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

这不是我想要的,因为 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/

相关文章:

c++ - 将 make_shared 与不完整的类型一起使用

gnu-assembler - 汇编语言从0递增到100

c - 如何指示可以使用内联 ASM 参数*指向*的内存?

javascript - JavaScript构造函数可以返回函数并保持继承吗?

ios - 如何跟踪内存中地址的值?

c++ - union 作为模板化基类的部分特化

c++ - 使用 BOOST 时出现 LNK 错误 1561

C++ 模板声明不可见

delphi - "Object Aware"图形用户界面控件

c# - 在 C# 中实现多态性,如何最好地做到这一点?