首页
社区
课程
招聘
[原创]dll与导入表的问题
发表于: 2021-8-14 12:36 5078

[原创]dll与导入表的问题

2021-8-14 12:36
5078

首先,由一个错误引发的惨案:
在调用dll时,发生一个错误:
Link110:文件无效或损坏;无法在0x245读取
仔细检查了一下原因:
图片描述
附加依赖项的Dll1.lib写成了Dll1.h

接着又有一个疑问,为什么在查看exe文件导入表时,没有发现自己要导入的dll
这就涉及显式链接和隐式连接的区别
使用隐式链接时:
图片描述
图片描述
使用PEView查看导入表
图片描述
出现了Dll1.dll的信息

这时尝试着使用显式链接的方式看看有没有dll信息
图片描述
又出现了报错,猜测可能是因为前面写dll使用stdcall的原因,
stdcall去掉
或者
图片描述
typedef int (__stdcall *FUNC)(int a, int b);
加入调用约定
图片描述
运行成功,此时查看PE导入表
图片描述
并没有发现Dll1.dll的信息

总结:
1.隐式链接时,动态链接库会被写入到exe文件中,以供exe进行调用。
这样会出现几个问题:
a).如果导入表中有dll信息,那么程序在加载时,就会调用dll,如果不在同一目录,就会报错:由于找不到dll,无法继续执行代码
这就为dll劫持,监视操作系统提供方便
b).如果想要程序继续运行,可以采用dll延迟加载技术,即将dll从导入表项删除,并在vs中设置使用dll延迟加载

2.显式链接时,dll不会被写入到exe文件中
导入表中查看不到dll信息,只能通过LoadLibrary动态加载
相当于dll延迟加载
可以采用dll注入
3.使用stdcall声明函数,必须使用stdcall方式调用,不然会出错,默认采用__cdecl方式


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-8-14 12:40 被wx_磐正编辑 ,原因: 错别字
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//