免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3276 | 回复: 12
打印 上一主题 下一主题

[求助]有关DLL的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-21 11:28 |只看该作者 |倒序浏览
5可用积分
从开发的角度上理解,我想知道,为什么一些DLL文件被调用后,文件可以重命名,然后系统会自动拷贝一份跟原来一模一样的DLL回来,名称也一样的。很多病毒使用的DLL和Windows系统的DLL都有这个特点?
这些DLL虽然可以重命名,但是删除确实拒绝的,这是为什么?如何做到的?

期盼高手指点!

[ 本帖最后由 ciwsecurity 于 2007-9-21 11:47 编辑 ]

最佳答案

查看完整内容

只要动态库加载到进程空间,你就不能删除了,操作系统对加载的文件保护了。其实dll可以同名,如果dll导出的函数也一样,那么程序在搜索加载的动态库有一个优先的搜索方式,同名的不同目录的动态库,肯定是只会加载其中一个的,病毒多半是这样做的,当程序加载动态库后,在动态库的加载执行代码中加入有害代码,目的就可以达到

论坛徽章:
0
2 [报告]
发表于 2007-09-21 11:28 |只看该作者
原帖由 ciwsecurity 于 2007-9-21 11:28 发表
从开发的角度上理解,我想知道,为什么一些DLL文件被调用后,文件可以重命名,然后系统会自动拷贝一份跟原来一模一样的DLL回来,名称也一样的。很多病毒使用的DLL和Windows系统的DLL都有这个特点?
这些DLL虽然 ...



只要动态库加载到进程空间,你就不能删除了,操作系统对加载的文件保护了。
其实dll可以同名,如果dll导出的函数也一样,那么程序在搜索加载的动态库有一个优先的搜索方式,同名的不同目录的动态库,肯定是只会加载其中一个的,病毒多半是这样做的,当程序加载动态库后,在动态库的加载执行代码中加入有害代码,目的就可以达到

论坛徽章:
0
3 [报告]
发表于 2007-09-21 12:32 |只看该作者
windows不清楚,Linux下的so动态库在打开后会有一份拷贝到内存中(mmap)

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
4 [报告]
发表于 2007-09-21 15:35 |只看该作者
原帖由 ciwsecurity 于 2007-9-21 11:28 发表
从开发的角度上理解,我想知道,为什么一些DLL文件被调用后,文件可以重命名,然后系统会自动拷贝一份跟原来一模一样的DLL回来,名称也一样的。很多病毒使用的DLL和Windows系统的DLL都有这个特点?
这些DLL虽然 ...


不仅是DLL,EXE也可以每次改名字。这样做:

在Load DLL之前,rename,然后Load,运行完后,unload, rename

论坛徽章:
0
5 [报告]
发表于 2007-09-21 19:45 |只看该作者
谈谈个人看法:既然DLL也是动态链接的,所以它被调用的时候,应该是被全部装入内存的。这个时候如果被删除的话,当这个库被用完之后,会被重写(如果不做任何保护是可以删除的)。当然,如果对动态链接库调用之前,给它加个锁,就不会被删除了,就好像在文件系统中对它有一个连接计数,不能被unlink一样。

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
6 [报告]
发表于 2007-09-21 21:36 |只看该作者

回复 #4 foolishx 的帖子

不要把DLL和SO混为一弹,两个不同。

论坛徽章:
0
7 [报告]
发表于 2007-09-22 16:53 |只看该作者
楼上二位的解析很精彩,我基本上理解了DLL被加载后无法删除是通过“加锁”的方式来实现的。不知道这个理解对不对?

另外,我疑惑的是,比如%systemroot%\system32\shell32.dll被成功的加载后,的确是无法删除的。但是却可以该名字?这个为什么?

另外,改完名字后,系统立刻复制了一份新的和原来一模一样的shell32.dll回到原来的位置,这是如何实现的?(我想各位高手从编程的角度上帮我简单分析一下)。

小弟不胜感激!

论坛徽章:
0
8 [报告]
发表于 2007-09-22 17:00 |只看该作者
不能删除是因为正在被调用;
自动拷贝过来,是因为有备份;

想要删掉,先改名,杀掉调用进程,或者重新启动机器,就可以删除。

论坛徽章:
0
9 [报告]
发表于 2007-09-22 18:10 |只看该作者
至于如何处理无法删除的文件,这些基本的东西我都懂的!我想知道细节!比如上面一位朋友说的有关于锁的问题,就类似这个,我当然不需要知道具体的实现细节。但是我需要知道这类东西!谢谢!

论坛徽章:
0
10 [报告]
发表于 2007-09-22 18:11 |只看该作者
更简单一点,小弟正在进行C语言的学习,所以,作为一个学习开发的人,我需要了解的东西!我希望能够从这个方面阐述答案!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP