dll編譯小工具
❶ DLL文件編譯,高手請指教。
DLL文件即動態鏈接庫文件,是一種可執行文件,它允許程序共享執行特殊任務所必需的代碼和其他資源。Windows提供的DLL文件中包含了允許基於Windows的程序在Windows環境下操作的許多函數和資源。
DLL多數情況下是帶有DLL擴展名的文件,但也可能是EXE或其他擴展名。它們向運行於Windows操作系統下的程序提供代碼、數據或函數。程序可根據DLL文件中的指令打開、啟用、查詢、禁用和關閉驅動程序。
DLL的全稱是Dynamic Link Library, 中文叫做「動態鏈接文件」。在Windows操作系統中, DLL對於程序執行是非常重要的, 因為程序在執行的時候, 必須鏈接到DLL文件, 才能夠正確地運行。而有些DLL文件可以被許多程序共用。因此, 程序設計人員可以利用DLL文件, 使程序不至於太過巨大。但是當安裝的程序越來越多, DLL文件也就會越來越多, 如果當你刪除程序的時候, 沒有用的DLL文件沒有被刪除的話, 久而久之就造成系統的負擔了。
DLL是動態連接庫。使用動態連接庫的一些好處是:
1.多個應用程序共享代碼和數據:比如Office軟體的各個組成部分有相似的外觀和功能,這就是通過共享動態連接庫實現的。
2.在鉤子程序過濾系統消息時必須使用動態連接庫。
3.動態連接庫以一種自然的方式將一個大的應用程序劃分為幾個小的模塊,有利於小組內部成員的分工與合作。而且,各個模塊可以獨立升級。如果小組中的一個成員開發了一組實用常式,他就可以把這些常式放在一個動態連接庫中,讓小組的其他成員使用。
4.為了實現應用程序的國際化,往往需要使用動態連接庫。使用動態連接庫可以將針對某一國家、語言的信息存放在其中。對於不同的版本,使用不同的動態連接庫。在使用AppWizard生成應用程序時,我們可以指定資源文件使用的語言,這就是通過提供不同的動態連接庫實現的。
VC++、C++ Builder、Delphi都可以編寫DLL文件。Visual Basic 5.0以上版本也可以編寫一種特殊的DLL,即ActiveX DLL。
DLL不是獨立運行的程序,它是某個程序的一個部分,它只能由所屬的程序調用。用戶不能,也不需要打開它。
❷ 用什麼工具能反編譯DLL文件
非託管的DLL只能反匯編,不能反編譯
反匯編最強大的工具為IDA
https://www.hex-rays.com/index.shtml
❸ dll文件用什麼軟體來編輯
dll文件是系統的動態鏈接庫文件,可以用一些十六位春文本編輯器打開,如UltraEdit
一、DLL文件常識
DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可有多個DLL文件,一個DLL文件也可能被幾個應用程序所共用,這樣的DLL文件被稱為共享DLL文件。DLL文件一般被存放在C:WindowsSystem目錄下
二、修改DLL文件的具體應用
在系統的組策略和注冊表中,我們可以修改一些鍵值來優化我們的系統,並加強操作系統的安全性。可是,對於限制下載、禁止刪除文件等功能,我們無法通過上述的操作來完成,這只有通過修改系統DLL文件來實現。目前,我們通過修改系統的DLL文件,可以實現禁止刪除文件、禁止IE下載、禁止IE另存為、禁止文件打開方式等功能。
三、系統中部分DLL文件的功能
1、Browselc.dll IE所需要調用的庫文件DLL結構雛形就是它了
2、Shdoclc.dll 系統窗口及設置等,如刪除文件、重命名
3、Shell32.dll 系統窗口及設置等,如刪除文件、重命名
4、Cryptui.dll IE控制項下載及提示對話框程序
四、修改DLL文件的方法
1、下載DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
2、獲取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll這幾個鏈接文件。在找這幾個文件時,最好將其他機器的硬碟,掛接在本機中,然後用本機的操作系統啟動並復制這幾個文件。
3、在修改DLL文件的時候,打開該鍵值,在右面的對話框中將所要修改的鍵值禁用即可,不要刪除,以備日後恢復
五、DLL文件修改秘籍
1、禁止下載的修改方法:打開Shdoclc.dll修改資源--對話框---4416,將4416鍵值禁用即可。
2、禁止網頁添加到收藏夾,打開Shdoclc.dll修改資源--對話框---21400,將該鍵值禁用即可。
3、禁止惡意網頁載入控制項,修改Cryptui.dll文件,要同時修改5個地方才能完全禁止 資源--對話框---130 資源--對話框---230 資源--對話框---4101 資源--對話框---4104 資源--對話框---4107 將以各對話框中的相應鍵值,修改成為禁用就可以了。
4、禁止系統刪除文件修改Shell32.dll,這個文件需要修改5個地方才可以禁止系統刪除文件。資源--對話框---1011 資源--對話框---1012 資源--對話框---1013 資源--對話框---1021 資源--對話框---1022 將以上五個地址的鍵值禁用就可以了!
5、禁止文件被改名,修改shell32.dll,有2個地方需要修改資源--對話框---1018 資源--對話框---1019 將以上兩處的相應鍵值,修改為禁用就可以了!
6、禁止運行菜單,修改shell32.dll,將資源--對話框---1018鍵值設置為禁用。
7、禁止系統文件被挪動修改shell32.dll,需要修改4個地方 資源--對話框---1014 資源--對話框---1015 資源--對話框---1016 資源--對話框
8、禁止目標另存為,修改Shdoclc.dll文件,需要修改3個地方 資源--菜單--258---257 資源--菜單--258---252 資源--菜單--24641--2268 在這個修改中,我們要把各對應的鍵值刪除。打開該鍵值後,右鍵菜單中有刪除。在資源--菜單--24641—2268中,有多項該鍵值,請逐一刪除。
9、禁止自定義文件夾選項修改Shell32.dll文件,需要修改以下4個地方 資源--菜單--215---28719 資源--菜單--216---28719 資源--菜單--217---28719 資源--菜單--216---28719 找到以上四處鍵值,直接需要刪除後即可,而不是禁用。
10、禁止IE文件夾選項,修改Browselc.dll文件,需要修改3個鍵值 資源--菜單--263 (這里有多個請刪除)---41251(刪除) 資源--菜單--266(也有多個請刪除)---41329 (刪除) 資源--菜單--268---41251 (刪除) 在上面的3個鍵值中,個別鍵值有多處,請逐一刪除。
11、禁止98文件共享控制項,修改Msshrui.dll,需要修改2個地方 資源---對話框---- 1 --- AutoRadioButton 資源---對話框---- 30 --- AutoRadioButton 將以上兩處的鍵值禁用即可。其他的選項,可以根據自己的需要進行修改。找到相應的功能鍵值,將不需要的功能,禁用就可以了。
12、禁止文件的打開方式,修改Url.dll,需要修改2個地方 資源---對話框--- 7000 資源---對話框--- 7005 將以上兩處的鍵值禁用即可。
13、禁止更改系統桌面,修改Shdoc401.dll,有2處地方需要修改 資源---對話框--- 29952--- PushButton:瀏覽資源---對話框--- 29952--- PushButton:圖案 將以上兩處的鍵值禁用即可。
14、禁止系統文件夾自定義,修改Shd401lc.dll,有2處地方需要修改 資源---對話框--- 29957 資源---對話框--- 29958 將以上兩處的鍵值禁用即可。
15、禁止文件保存路徑及打開,修改Comdlg32.dll,有2處地方需要修改 資源---對話框--- 1547 資源---對話框--- 1548 將以上兩處的鍵值禁用即可。
❹ 有沒有將exe文件編譯成dll文件的工具
不用工具.
打開"我的電腦",在窗口的工具欄上面"工具"-->"文件夾選項"-->"查看"-->
找到"隱藏已知文件類型的擴展名",把前面的"囗"設置為空白,也就是不選,-->確定.
然後,就在你想要改的那個EXE文件重名名,後面加上」.DLL」就行啦.
但此法只是冶標不冶本.
❺ 如何編譯一個 dll文件
創建DLL工程
這里,我們為了簡要說明DLL的原理,我們決定使用最簡單的編譯環境VC6.0,如下圖,我們先建立一個新的Win32 Dynamic-Link Library工程,名稱為「MyDLL」,在Visual Studio中,你也可以通過建立Win32控制台程序,然後在「應用程序類型」中選擇「DLL」選項,
點擊確定,選擇「一個空的DLL工程」,確定,完成即可。
一個簡單的dll
在第一步我們建立的工程中建立一個源碼文件」dllmain.cpp「,在「dllmain.cpp」中,鍵入如下代碼
[cpp] view plain
#include <Windows.h>
#include <stdio.h>
BOOL APIENTRY DllMain(HMODULE hMole, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("DLL_PROCESS_ATTACH\n");
break;
case DLL_THREAD_ATTACH:
printf("DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
printf("DLL_THREAD_DETACH\n");
break;
case DLL_PROCESS_DETACH:
printf("DLL_PROCESS_DETACH\n");
break;
}
return TRUE;
}
之後,我們直接編譯,即可以在Debug文件夾下,找到我們生成的dll文件,「MyDLL.dll」,注意,代碼裡面的printf語句,並不是必須的,只是我們用於測試程序時使用。而DllMain函數,是dll的進入/退出函數。
實際上,讓線程調用DLL的方式有兩種,分別是隱式鏈接和顯式鏈接,其目的均是將DLL的文件映像映射進線程的進程的地址空間。我們這里只大概提一下,不做深入研究,如果感興趣,可以去看《Window高級編程指南》的第12章內容。
隱式鏈接調用
隱士地鏈接是將DLL的文件影響映射到進程的地址空間中最常用的方法。當鏈接一個應用程序時,必須制定要鏈接的一組LIB文件。每個LIB文件中包含了DLL文件允許應用程序(或另一個DLL)調用的函數的列表。當鏈接器看到應用程序調用了某個DLL的LIB文件中給出的函數時,它就在生成的EXE文件映像中加入了信息,指出了包含函數的DLL文件的名稱。當操作系統載入EXE文件時,系統查看EXE文件映像的內容來看要裝入哪些DLL,而後試圖將需要的DLL文件映像映射到進程的地址空間中。當尋找DLL時,系統在系列位置查找文件映像。
1.包含EXE映像文件的目錄
2.進程的當前目錄
3.Windows系統的目錄
4.Windows目錄
5.列在PATH環境變數中的目錄
這種方法,一般都是在程序鏈接時控制,反映在鏈接器的配置上,網上大多數講的各種庫的配置,比如OPENGL或者OPENCV等,都是用的這種方法
顯式鏈接調用
這里我們只提到兩種函數,一種是載入函數
[cpp] view plain
HINSTANCE LoadLibrary(LPCTSTR lpszLibFile);
HINSTANCE LoadLibraryEx(LPCSTR lpszLibFile,HANDLE hFile,DWORD dwFlags);
返回值HINSTANCE值指出了文件映像映射的虛擬內存地址。如果DLL不能被映進程的地址空間,函數就返回NULL。你可以使用類似於
[cpp] view plain
LoadLibrary("MyDLL")
或者
[cpp] view plain
LoadLibrary("MyDLL.dll")
的方式進行調用,不帶後綴和帶後綴在搜索策略上有區別,這里不再詳解。
顯式釋放DLL
在顯式載入DLL後,在任意時刻可以調用FreeLibrary函數來顯式地從進程的地址空間中解除該文件的映像。
[cpp] view plain
BOOL FreeLibrary(HINSTANCE hinstDll);
這里,在同一個進程中調用同一個DLL時,實際上還牽涉到一個計數的問題。這里也不在詳解。
線程可以調用GetMoleHandle函數:
[cpp] view plain
GetMoleHandle(LPCTSTR lpszMoleName);
來判斷一個DLL是否被映射進進程的地址空間。例如,下面的代碼判斷MyDLL.dll是否已被映射到進程的地址空間,如果沒有,則裝入它:
[cpp] view plain
HINSTANCE hinstDll;
hinstDll = GetMoleHandle("MyDLL");
if (hinstDll == NULL){
hinstDll = LoadLibrary("MyDLL");
}
實際上,還有一些函數,比如 GetMoleFileName用來獲取DLL的全路徑名稱,FreeLibraryAndExitThread來減少DLL的使用計數並退出線程。具體內容還是參見《Window高級編程指南》的第12章內容,此文中不適合講太多的內容以至於讀者不能一下子接受。
DLL的進入與退出函數
說到這里,實際上只是講了幾個常用的函數,這一個小節才是重點。
在上面,我們看到的MyDLL的例子中,有一個DllMain函數,這就是所謂的進入/退出函數。系統在不同的時候調用此函數。這些調用主要提供信息,常常被DLL用來執行進程級或線程級的初始化和清理工作。如果你的DLL不需要這些通知,就不必再你的DLL源代碼中實現此函數,例如,如果你創建的DLL只含有資源,就不必實現該函數。但如果有,則必須像我們上面的格式。
DllMain函數中的ul_reason_for_call參數指出了為什麼調用該函數。該參數有4個可能值: DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH、DLL_PROCESS_DETACH。
其中,DLL_PROCESS_ATTACH是在一個DLL首次被映射到進程的地址空間時,系統調用它的DllMain函數,傳遞的ul_reason_for_call參數為DLL_PROCESS_ATTACH。這只有在首次映射時發生。如果一個線程後來為已經映射進來的DLL調用LoadLibrary或LoadLibraryEx,操作系統只會增加DLL的計數,它不會再用DLL_PROCESS_ATTACH調用DLL的DllMain函數。
而DLL_PROCESS_DETACH是在DLL被從進程的地址空間解除映射時,系統調用它的DllMain函數,傳遞的ul_reason_for_call值為DLL_PROCESS_DETACH。我們需要注意的是,當用DLL_PROCESS_ATTACH調用DLL的DllMain函數時,如果返回FALSE,說明初始化不成功,系統仍會用DLL_PROCESS_DETACH調用DLL的DllMain。因此,必須確保沒有清理那些沒有成功初始化的東西。
DLL_THREAD_ATTACH:當進程中創建一個線程時,系統察看當前映射到進程的地址空間中的所有DLL文件映像,並用值DLL_THREAD_ATTACH調用所有的這些DLL的DllMain函數。該通知告訴所有的DLL去執行線程級的初始化。注意,當映射一個新的DLL時,進程中已有的幾個線程在運行,系統不會為已經運行的線程用值DLL_THREAD_ATTACH調用DLL的DllMain函數。
而DLL_THREAD_DETACH,如果線程調用ExitThread來終結(如果讓線程函數返回而不是調用ExitThread,系統會自動調用ExitThread),系統察看當前映射到進程空間的所有DLL文件映像,並用值DLL_THREAD_DETACH來調用所有的DLL的DllMain函數。該通知告訴所有的DLL去執行線程級的清理工作。
這里,我們需要注意的是,如果線程的終結是因為系統中的一個線程調用了TerminateThread,系統就不會再使用DLL_THREAD_DETACH來調用DLL和DllMain函數。這與TerminateProcess一樣,不再萬不得已時,不要使用。
下面,我們貼出《Window高級編程指南》中的兩個圖來說明上述四種參數的調用情況。
好的,介紹了以上的情況,下面,我們來繼續實踐,這次,建立一個新的空的win32控制台工程TestDLL,不再多說,代碼如下:
[cpp] view plain
#include <iostream>
#include <Windows.h>
using namespace std;
DWORD WINAPI someFunction(LPVOID lpParam)
{
cout << "enter someFunction!" << endl;
Sleep(1000);
cout << "This is someFunction!" << endl;
Sleep(1000);
cout << "exit someFunction!" << endl;
return 0;
}
int main()
{
HINSTANCE hinstance = LoadLibrary("MyDLL");
if(hinstance!=NULL)
{
cout << "Load successfully!" << endl;
}else {
cout << "Load failed" << endl;
}
HANDLE hThread;
DWORD dwThreadId;
cout << "createThread before " << endl;
hThread = CreateThread(NULL,0,someFunction,NULL,0,&dwThreadId);
cout << "createThread after " << endl;
cout << endl;
Sleep(3000);
cout << "waitForSingleObject before " << endl;
WaitForSingleObject(hThread,INFINITE);
cout << "WaitForSingleObject after " << endl;
cout << endl;
FreeLibrary(hinstance);
return 0;
}
代碼很好理解,但是前提是,你必須對線程有一定的概念。另外,注意,我們上面編譯的獲得的「MyDLL.dll"必須拷貝到能夠讓我們這個工程找到的地方,也就是上面我們提到的搜索路徑中的一個地方。
這里,我們先貼結果,當然,這只是在我機器上其中某次運行結果。
有了上面我們介紹的知識,這個就不是很難理解,主進程在調用LoadLibrary時,用DLL_PROCESS_ATTACH調用了DllMain函數,而線程創建時,用DLL_THREAD_ATTACH調用了DllMain函數,而由於主線程和子線程並行的原因,可能輸出的時候會有打斷。但是,這樣反而能讓我們更清楚的理解程序。
❻ 怎麼打開dll文件,dll反編譯
除非是未編譯成機器語言的語言像java,否則想c/c++等編譯出來的目標碼只能反編譯成匯編,查看源碼幾乎是不可能的。 既然dll編寫者沒有公開源碼,肯定是有商業目的或其他原因,如果要學習或在自己的程序中使用,建議還是找開源的替代品吧
❼ 如何在vs中安裝dll反編譯工具
網路搜索下載Reflector綠色版,解壓,可找到文件Reflector,
雙擊Reflector,即可運行Reflector,可看到如下界面;左上角工作欄,File->Open Assembly;打開你所需要打開的dll文件
在軟體左邊工作區域我們就可以看到你所打開的dll文件,點擊展開,在所選擇的.dll文件下面可以看到dll中所有的編寫的類,
4
點擊類名我們就可以看到裡面編寫的內容了
❽ dlledit不刷新
網路延遲。dlledit是一款專業實用的dll文件編輯工具,不刷新的原因是網路延遲,待網路恢復後即可正常刷新。該工具能夠幫助用戶輕松的修改、編輯exe、dll等格式的文件,深受人們的歡迎。
❾ 怎麼樣才能打開DLL文件進行編譯
DLL是已經編譯過了的,怎麼再編譯啊,找到源代碼來編譯吧。看DLL裡面的EXPORT可以用EXECOPE這個工具