| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1711 人关注过本帖
标题:有关导入函数的问题
取消只看楼主 加入收藏
Lactoferrin
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-7-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
有关导入函数的问题
我用微软的汇编器ml.exe和连接器link.exe,源代码中使用proto和导入库来导入dll导出的函数
然后发现用到那个函数时总是先到一个jmp指令的位置,然后jmp指令再跳转至导入表中的地址
如asm文件中GetModuleHandleW proto stdcall,:dword
includelib kernel32.lib
...
invoke GetModuleHandleW,0
编译后它就成了
push 0
call 4004d6
而4004d6处的东西是jmp dword ptr[40052c],这个40052c就是GetModuleHandleW的地址在导入表中存放的位置
我认为这是因为一开始ml.exe不知道GetModuleHandleW是从另一个dll中导入的函数,就当一般的函数处理的,所以link.exe就自己提供了一个跳转指令
但这样做又占时间又占空间,我想问一下汇编中有没有像vc++中__declspec(dllimport)的东西,让编译器知道函数是导入来的,这样就不需要那个jmp了。
搜索更多相关主题的帖子: 函数 
2010-07-02 10:21
Lactoferrin
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-7-2
收藏
得分:0 
这书我看过,还是不会,但是你看一下c语言,如果用void*__stdcall GetModuleHandleW(void*);来声明导入函数就会产生jmp指令,如果用__declspec(dllimport)void*__stdcall GetModuleHandleW(void*);就不会,而是直接call dword ptr[IAT中的地址],在masm中有没有类似__declspec(dllimport)功能的东西?还有,masm中怎么使用其它pe文件中的导出变量,比如ntoskrnl.exe中的PsInitialSystemProcess?不会都要用MmGetSystemRoutineAddress或自己去分析映像吧,我想直接用导入地址表。

说白了,我就是不想要那个跳转指令,请问如何处理。c语言能办到,汇编为什么办不到?

[ 本帖最后由 Lactoferrin 于 2010-7-2 15:05 编辑 ]
2010-07-02 14:56
Lactoferrin
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-7-2
收藏
得分:0 
谢谢,很好。
这里是不是要评分?如果是再请教一下如何给分,我不是很熟悉论坛的功能。

找到给分方法了

[ 本帖最后由 Lactoferrin 于 2010-7-2 21:09 编辑 ]
2010-07-02 20:08
快速回复:有关导入函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021427 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved