-
-
[原创]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_磐正编辑
,原因: 错别字
赞赏
看原图
赞赏
雪币:
留言: