首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器误解

编译器误解
EN

Stack Overflow用户
提问于 2014-01-17 05:01:07
回答 2查看 102关注 0票数 1

我有以下代码:

代码语言:javascript
复制
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,现在我尝试如下:

代码语言:javascript
复制
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;

同样错误,现在让我们尝试如下:

代码语言:javascript
复制
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上看到的关于IMAGE_THUNK_DATA结构的情况,它是这样的:

代码语言:javascript
复制
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,所以我很糟糕:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-17 05:03:38

我想你想要的是

代码语言:javascript
复制
 ori_iat++

因为在C/C++中

代码语言:javascript
复制
       ptr + i

等于

代码语言:javascript
复制
       &(ptr[i])
票数 3
EN

Stack Overflow用户

发布于 2014-01-17 05:12:17

sizeof返回字节。将1添加到指针会根据数据类型的大小增加指针的大小。

代码语言:javascript
复制
ori_iat += sizeof(IMAGE_THUNK_DATA)

根据你的说法

代码语言:javascript
复制
ori_iat += 8

因此,这增加了ori_iat8 * sizeof(*ori_iat),它应该是64,而不是程序集(0x10)中显示的16。

因此,sizeof(IMAGE_THUNK_DATA)必须是16的平方根,即4。

实际上,汇编程序的下一个片段显示大小实际上是4,而不是8(因为您不是在添加指针,而是添加到一个普通整数变量中,它只会直接添加数字)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21178230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档