windows系统扫盲之--dll动态链接库概念

动态链接库

百科名片

windows系统扫盲之--dll动态链接库概念_第1张图片  
动态链接库文件

动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。

目录

简介
  1. · ActiveX控件(.ocx) 文件
  2. · 控制面板(.cpl) 文件
  3. · 设备驱动程序(.drv) 文件
动态链接库文件
DLL 优点
DLL文件损坏
DLL 依赖项
DLL 入口点
导出 DLL 函数
  1. 两种方法
  2. 特别调用
  3. DLL内容说明
DLL错误的危害
DLL修复方法
dll木马原理
DLL Hell
展开
简介
  1. · ActiveX控件(.ocx) 文件
  2. · 控制面板(.cpl) 文件
  3. · 设备驱动程序(.drv) 文件
动态链接库文件
DLL 优点
DLL文件损坏
DLL 依赖项
DLL 入口点
导出 DLL 函数
  1. 两种方法
  2. 特别调用
  3. DLL内容说明
DLL错误的危害
DLL修复方法
dll木马原理
DLL Hell
展开

简介

动态链接库可以更为容易地将更新应用于各个 模块,而不会影响该 程序的其他部分。例如,您有一个大型 网络游戏,如果把整个数百MB甚至数GB的游戏的 代码都放在一个 应用程序里,日
windows系统扫盲之--dll动态链接库概念_第2张图片

 动态链接库

后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个 动态链接库(DLL)中,您无需重新生成或安装整个程序就可以应用更新。
下表说明了 Windows 操作系统中的一些作为 DLL 实现的文件:

· ActiveX控件(.ocx) 文件

ActiveX 控件的一个示例是日历控件,它使您可以从日历中选择日期。

· 控制面板(.cpl) 文件

.cpl 文件的一个示例是位于 控制面板中的项。每个项都是一个专用 DLL。

· 设备驱动程序(.drv) 文件

设备驱动程序的一个示例是控制打印到 打印机的 打印机驱动程序。

动态链接库文件

动态链接库文件,是一种不可执行的 二进制 程序文件,它允许 程序共享执行特殊任务所必需的 代码和其他资源。Windows提供的DLL文件中包含了允许基于Windows的 程序在Windows环境下操作的许多函数和资源。一般被存放在C:\Windows\System目录下。Windows中,DLL多数 情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名;Debian系统中常常是.so的文件。它们向运行于Windows 操作系统下的 程序提供 代码、数据或函数。 程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭 驱动程序。

DLL 优点

1、扩展了 应用程序的特性;
2、可以用许多种 编程语言来编写;
3、简化了 软件项目的管理;
4、有助于节省 内存;
5、有助于 资源共享;
6、有助于 应用程序的本地化;
7、有助于解决平台差异;
8、可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。

DLL文件损坏

当前木马病毒经常感染或者替换 系统文件 dll文件,部分安全
windows系统扫盲之--dll动态链接库概念_第3张图片

 dll图标

工具查杀后并未对dll文件进行系统修复,所以经常会出现以下现象: 
1、 网络游戏无法打开
2、 电脑没声音
3、 电脑蓝屏
4、桌面无法显示
5、主页被修改为网址导航 
6、桌面图标无法删除(淘宝、小游戏、电影等等,重启同样不能正常删除)

DLL 依赖项

当某个 程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。因此,该 程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。例如,如果发生下列操作之一,则该 程序可能无法运行:
· 依赖 DLL 升级到新版本。
· 修复了依赖 DLL。
· 依赖 DLL 被其早期版本覆盖。
· 从 计算机中删除了依赖 DLL。
这些操作通常称为 DLL 冲突。如果没有强制实现向后 兼容性,则该 程序可能无法成功运行。

DLL 入口点

在创建 DLL 时,可以有选择地指定入口点函数。当进程或 线程将它们自身附加到 DLL 或者将它们自身从 DLL 分离时,将调用入口点函数。您可以使用入口点函数根据 DLL 的需要来初始化 数据结构或者销毁数据结构。此外,如果 应用程序是 多线程的,则可以在入口点函数中使用线程本地 存储 (TLS) 来分配各个线程专用的 内存。下面的 代码是一个 DLL 入口点函数的示例:
BOOL APIENTRY DllMain(
HANDLE hModule, // DLL模块的句柄
DWORD ul_reason_for_call, // 调用本函数的原因
LPVOID lpReserved ) // 保留
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
//进程正在加载本DLL
break;
case DLL_THREAD_ATTACH:
//一个 线程被创建
break;
case DLL_THREAD_DETACH:
//一个 线程正常退出
break;
case DLL_PROCESS_DETACH:
//进程正在卸载本DLL
break;
}
return TRUE;
//返回TRUE,表示成功执行本函数
}
当 入口点函数返回 FALSE 值时,如果您使用的是加载时 动态链接,则 应用程序不启动。如果您使用的是运行时 动态链接,则只有个别 DLL 不会加载。
入口点函数只应执行简单的初始化任务,不应调用任何其他 DLL 加载函数或终止函数。例如,在 入口点函数中,不应直接或间接调用 LoadLibrary 函数或 LoadLibraryEx 函数。此外,不应在进程终止时调用 FreeLibrary 函数。
注意:在 多线程 应用程序中,请确保将对 DLL 全局数据的访问进行同步( 线程安全),以避免可能的数据损坏。为此,请使用 TLS 为各个 线程提供唯一的数据。

导出 DLL 函数

要导出 DLL 函数,您可以向导出的 DLL 函数中添加函数关键字,也可以创建 模块定义文件(.def) 以列出导出的 DLL 函数。

两种方法

方法一、向导出的 DLL 函数中添加函数关键字
要使用函数 关键字,您必须使用以下 关键字来声明要导出的各个函数:
__declspec( dllexport)
要在 应用程序中使用导出的 DLL 函数,您必须使用以下关键字来声明要导入的各个函数:
__declspec( dllimport)
通常 情况下,您最好使用一个包含 define 语句和 ifdef 语句的头文件,以便分隔导出语句和导入语句。
方法二、创建 模块定义文件 (.def) 以列出导出的 DLL 函数
使用 模块定义文件来声明导出的 DLL 函数。当您使用 模块定义文件时,您不必向导出的 DLL 函数中添加函数关键字。在 模块定义文件中,您可以声明 DLL 的 LIBRARY 语句和 EXPORTS 语句。

特别调用

关于特定 情况下的调用,比如DLL函数中使用到了win32 API或者将C++生成的DLL供标准C语言使用,则需要注意以下一些情况:
如果使用到了win32 API,则应该使用调用方式为“__stdcall”。
在将C++生成的DLL供标准C语言使用,输出文件需要用“extern "C"”修饰,否则不能被标准C语言调用。如果使用“__stdcall”调用方式,可能产生C不识别的修饰名,所以设置导出函数时要采用.def文件形式,而不是__declspec(dllexport)形式。后者会进行修饰名转换,C语言无法识别函数。
下面的 代码是一个 定义文件的示例。
// SampleDLL.def
//
LIBRARY "sampleDLL"
EXPORTS
HelloWorld示例 DLL 和 应用程序XXXXXXXX 在 Microsoft Visual C++6.0 中,可以通过选择“Win32 动态链接库” 项目类型或“MFC 应用程序向导 ( dll)”来创建 DLL。下面的 代码是一个在 Visual C++ 中通过使用“Win32 动态链接库” 项目类型创建的 DLL 的示例。
// SampleDLL.cpp
//#include "stdafx.h"
#define EXPORTING_DLL
#include "sampleDLL.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
void HelloWorld(){
MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);
}
// File: SampleDLL.h
//#ifndef INDLL_H
#define INDLL_H
#ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ;
#elseextern __declspec(dllimport) void HelloWorld() ;
#endif
#endif
下面的 代码是一个“Win32 应用程序”项目的示例,该示例调用 SampleDLL DLL 中的导出 DLL 函数。
// SampleApp.cpp
//#include "stdafx.h"
#include "sampleDLL.h"
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HelloWorld();
return 0;
}
注意:在加载时 动态链接中,您必须链接在生成 SampleDLL 项目时创建的 SampleDLL.lib 导入库。
在运行时 动态链接中,您应使用与以下 代码类似的代码来调用 SampleDLL. dll 导出 DLL 函数。
...
typedef VOID (*DLLPROC) (LPTSTR);
...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;
hinstDLL = LoadLibrary("sampleDLL.dll");
if (hinstDLL != NULL)
{
HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");
if (HelloWorld != NULL)
(HelloWorld);
fFreeDLL = FreeLibrary(hinstDLL);
}
...

DLL内容说明

KERNEL32.DLL ---- 低级 内核函数。使用他可以完成 内存管理、 任务管理、
资源控制等。
USER32.DLL------与windows管理有关的函数。消息、 菜单、 光标、 计时器
、通信和其他大多数非现实函数都可以从这里找到
GDI32.DLL------- 图形设备接口库。与设备输出有关的函数:大多数绘图
、显示场景、 图元文件、坐标及其 字体函数都可以从这里找到。
COMDLG32.DLL\LZ32.DLL\VERSION.DLL\---这都是提供一些附加函数的库,包
括通用对话框、 文件压缩、 版本控制的支持。
COMCTL32.DLL --------一个新的windows控件集合,比如TreeView和RichTextBox
等等,最初这个是为了win95而制作的,但是现在也使用与NT下
MAPI32.DLL---------提供了一套 电子邮件的专用函数
NETAPI32.DLL--------提供了一套访问和控制网络的函数
ODBC32.DLL--------ODBC功能的DLL之DLL(Delay Locked Loop,延时锁定回路提供一个数据滤波信号)

DLL错误的危害

系统文件auditpolicygpinterop. dll出错,是由于木马病毒、或不小心下载了流氓软件被感染所致。而该文件又是系统/ 程序正常运行的前提条件,所以一旦不幸被感染,通常会伴随下几种 情况:
1、桌面图标无法删除(淘宝、小游戏、电影等等,重启同样不能正常删除)
2、 网络游戏打不开(DNF,穿越火线,魔兽世界等等)
3、电脑无故蓝屏
4、电脑没声音
5、 桌面无法显示
6、一些 程序无法正常使用(比如双击无响应等一系列 情况)

DLL修复方法

部分. dll缺失可以从其他电脑或者网上上下载拷贝到,c盘windows目录下来完成修复。
auditpolicygpinterop.dll出错,很多是因为中了 流氓软件的招,如果不太了解系统,不知道应该把auditpolicygpinterop.dll放在哪,那么建议使用 修复工具对系统进行最全面的扫描和修复。

dll木马原理

DLL是编译好的 代码,与一般 程序没什么大差别,只是它不能独立运行,需要 程序调用。那么,DLL与木马能扯上什么关系呢?如果你学过编程并且写过DLL,就会发现,其实DLL的 代码和其他程序几乎没什么两样,仅仅是接口和启动模式不同,只要改动一下代码入口,DLL就变成一个独立的程序了。当然,DLL文件是没有 程序逻辑的,这里并不是说DLL=EXE,不过,依然可以把DLL看做缺少了main入口的EXE,DLL带的各个功能函数可以看作一个程序的几个函数模块。DLL木马就是把一个实现了木马功能的 代码,加上一些特殊代码写成DLL文件,导出相关的API,在别人看来,这只是一个普通的DLL,但是这个DLL却携带了完整的木马功能,这就是DLL木马的概念。也许有人会问,既然同样的 代码就可以实现木马功能,那么直接做 程序就可以,为什么还要多此一举写成DLL呢?这是为了隐藏,因为DLL运行时是直接挂在调用它的程序的进程里的,并不会另外产生进程,所以相对于传统EXE木马来说,它很难被查到。

DLL Hell

动态链接库(DLL)地狱——当使用 COM组件的应用程序被安装在一台机器上,在安装过程中会更新注册表的COM组件信息。因此,有这些DLL时,将被覆盖一些其他的应用程序在同一台计算机上安装了一个机会。因此,应用程序,指的是一个特定的DLL错误的DLL。这造成了重大的问题,当一个应用程序指的是一个特定版本的DLL。 [1]

你可能感兴趣的:(windows系统扫盲之--dll动态链接库概念)