首页
社区
课程
招聘
[旧帖] [求助]奇怪的现象! 0.00雪花
发表于: 2008-2-14 17:05 3627

[旧帖] [求助]奇怪的现象! 0.00雪花

2008-2-14 17:05
3627
请看如下驱动中的代码
_asm {
     ...
    mov eax ,ZwCreateFile;
    ...
}
编译后用IDA反汇编分析如下:
    mov     eax, ds:ZwCreateFile(x,x,x,x,x,x,x,x,x,x,x)

该语句执行后EAX = ZwCreateFile的地址。这也是很多高手的文章中可看到的。

而普通应用程序中如下代码:
_asm{
   ...
   mov eax,printf
   ...
}

反汇编变成如下:
00401095   mov         eax,[printf (004010d0)]
该语句执行后EAX = 83EC8B55,即printf函数代码的前4个字节

我的疑问是为何同样的代码用法,为何编译后得到的结果不同???前者为函数地址,后者为函数代码前4字节

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
ZwCreateFile, 是导入函数, 编译器在编译时无法知道具体地址以及内容
printf 是编译成库函数了 编译mov eax,printf 时, 相当于mov eax, dword ptr [printf]
你要取printf的函数地址,应该用lea eax, dword ptr [printf]
2008-2-14 17:41
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那不是指针吗?
“导入函数 在编译器在编译时无法知道具体地址。”
2008-2-14 21:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这二个怎么能一样呢
2008-2-14 23:39
0
雪    币: 223
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
理由在哪里呢?
如果编译链接时,找不到函数地址会报错的吧!
2008-2-15 10:43
0
游客
登录 | 注册 方可回帖
返回
//