動態連接庫

動態連接庫英文爲DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件html

動態連接提供了一種方法,使進程能夠調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連接並與使用它們的進程分開存儲的函數。DLL 還有助於共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。編程

目錄

1簡介編輯

動態連接庫Dynamic Link Library或者Dynamic-link library,縮寫爲DLL),是微軟公司在微軟視窗操做系統(即Windows操做系統)中實現共享函數庫概念的一種方式。這些庫函數的擴展名是.DLL、.OCX(包含ActiveX控制的庫)或者.DRV(舊式的系統驅動程序)。

動態連接庫縮寫爲DLL,在電腦中能夠更爲容易地將更新應用於各個模塊,而不會影響該程序的其餘部分。例如,您有一個大型網絡遊戲,若是把整個數百MB甚至數GB的遊戲的代碼都放在一個應用程序裏,日

動態連接庫

動態連接庫

後的修改工做將會十分費時,而若是把不一樣功能的代碼分別放在數個動態連接庫(DLL)中,您無需從新生成或安裝整個程序就能夠應用更新。

就下表說明了 Windows操做系統中的一些做爲 DLL 實現的文件:

控件文件

ActiveX控件的一個示例是日曆控件,它使您能夠從日曆中選擇日期。

面板 文件

.cpl 文件的一個示例是位於控制面板中的項。每一個項都是一個專用 DLL。

驅動程序

設備驅動程序的一個示例是控制打印到打印機打印機驅動程序


2庫文件編輯

動態連接庫文件,是一種不可執行的二進制程序文件,它容許程序共享執行特殊任務所必需的代碼和其餘資源。Windows提供的DLL文件中包含了容許基於Windows的程序在Windows環境下操做的許多函數和資源。通常被存放在C:\Windows\System目錄下。

Windows中,DLL多數狀況下是帶有DLL擴展名的文件,但也多是EXE或其餘擴展名;Debian系統中經常是.so的文件。它們向運行於Windows操做系統下的程序提供代碼、數據或函數。程序可根據DLL文件中的指令打開、啓用、查詢、禁用和關閉驅動程序


3優勢編輯

一、擴展了應用程序的特性;

二、能夠用許多種編程語言來編寫;

三、簡化了軟件項目的管理;

四、有助於節省內存

五、有助於資源共享

六、有助於應用程序的本地化;

七、有助於解決平臺差別;

八、能夠用於一些特殊的目的。windows使得某些特性只能爲DLL所用。


4錯誤類型編輯

當前木馬病毒常常感染或者替換系統文件dll文件,部分安全

dll圖標

dll圖標

工具查殺後並未對dll文件進行系統修復,因此常常會出現如下現象:

一、可執行程序沒法打開

二、電腦沒聲音

三、電腦藍屏

四、桌面沒法顯示

五、主頁被修改

六、桌面圖標沒法刪除(淘寶、小遊戲、電影等等,重啓一樣不能正常刪除)


5依賴項編輯

當某個程序或 DLL 使用其餘 DLL 中的 DLL 函數時,就會建立依賴項。所以,該程序就再也不是獨立的,而且若是該依賴項被損壞,該程序就可能遇到問題。例如,若是發生下列操做之一,則該程序可能沒法運行:

· 依賴 DLL 升級到新版本。

· 修復了依賴 DLL。

· 依賴 DLL 被其早期版本覆蓋。

· 從計算機中刪除了依賴 DLL。

這些操做一般稱爲 DLL 衝突。若是沒有強制實現向後兼容性,則該程序可能沒法成功運行。


6入口點編輯

在建立 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 爲各個線程提供惟一的數據。


7如何導出編輯

要導出 DLL 函數,您能夠嚮導出的 DLL 函數中添加函數關鍵字,也能夠建立模塊定義文件(.def) 以列出導出的 DLL 函數。

兩種方法

方法1、嚮導出的 DLL 函數中添加函數關鍵字

要使用函數關鍵字,您必須使用如下關鍵字來聲明要導出的各個函數:

__declspec(dllexport)

要在應用程序中使用導出的 DLL 函數,您必須使用如下關鍵字來聲明要導入的各個函數:

__declspec(dllimport)

一般狀況下,您最好使用一個包含 define 語句和 ifdef 語句的頭文件,以便分隔導出語句和導入語句。

方法2、建立模塊定義文件(.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 在 MicrosoftVisual 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,延時鎖定迴路提供一個數據濾波信號)


8錯誤危害編輯

系統文件auditpolicygpinterop.dll出錯,是因爲木馬病毒、或不當心下載了流氓軟件被感染所致。而該文件又是系統/程序正常運行的前提條件,因此一旦不幸被感染,一般會伴隨下幾種狀況

一、桌面圖標沒法刪除(淘寶、遊戲、小電影等等,重啓一樣不能正常刪除)

二、網絡遊戲打不開(DNF,穿越火線,魔獸世界等等)

三、電腦無端藍屏

四、電腦沒聲音

五、桌面沒法顯示

六、一些程序沒法正常使用(好比雙擊無響應等一系列狀況


9修復方法編輯

1.部分.dll缺失能夠從其餘電腦或者網上下載拷貝到,c盤windows目錄下來完成修復。

2.經過文件恢復器來恢復。

3.auditpolicygpinterop.dll出錯,不少是由於中了流氓軟件的招,若是不太瞭解系統,不知道應該把auditpolicygpinterop.dll放在哪,那麼建議使用修復工具對系統進行最全面的掃描和修復。


10木馬原理編輯

DLL是編譯好的代碼,與通常程序沒什麼大差異,只是它不能獨立運行,須要程序調用。那麼,DLL與木馬能扯上什麼關係呢?若是你學過編程而且寫過DLL,就會發現,其實DLL的代碼和其餘程序幾乎沒什麼兩樣,僅僅是接口和啓動模式不一樣,只要改動一下代碼入口,DLL就變成一個獨立的程序了。固然,DLL文件是沒有程序邏輯的,這裏並非說DLL=EXE,不過,依然能夠把DLL看作缺乏了main入口的EXE,DLL帶的各個功能函數能夠看做一個程序的幾個函數模塊。

DLL木馬就是把一個實現了木馬功能的代碼,加上一些特殊代碼寫成DLL文件,導出相關的API,在別人看來,這只是一個普通的DLL,可是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然一樣的代碼就能夠實現木馬功能,那麼直接作程序就能夠,爲何還要畫蛇添足寫成DLL呢?這是爲了隱藏,由於DLL運行時是直接掛在調用它的程序的進程裏的,並不會另外產生進程,因此相對於傳統EXE木馬來講,它很難被查到。


11特殊種類編輯

動態連接庫(DLL)地獄——當使用COM組件的應用程序被安裝在一臺機器上,在安裝過程當中會更新註冊表的COM組件信息。所以,有這些DLL時,將被覆蓋一些其餘的應用程序在同一臺計算機上安裝了一個機會。所以,應用程序,指的是一個特定的DLL錯誤的DLL。這形成了重大的問題,當一個應用程序指的是一個特定版本的DLL。[1]

相關文章
相關標籤/搜索