導航:首頁 > 源碼編譯 > dll里有編譯時間

dll里有編譯時間

發布時間:2023-03-30 14:17:50

⑴ E語言中DLL的介紹

DLL(動態連接庫),既然是動態,那麼就是有靜態連接庫,我想如果這么說大家會更明白:
也許有的人在DOS下編寫過程序都明白這么一件事情,我寫了一個程序,裡面有一個功能就是把屏幕的內容翻轉在轉90°列印出來,那麼我需要把整個程序寫好放

到我的所有代碼中,但是如果我寫另外一個程序的時候也有相通的功能,我可以

調用以前的程序這個功能嗎?當然是不可以的了,所以我就要重新的寫一次,如

果有5個需要調用這個功能的程序,我的這個功能函數需要20K的地方,那麼我的

硬碟就有80K的碧歷垃圾出現(20k*5 - 20k),這僅僅是一個函數,大家是否可以數

清除WINDOWS如果這樣來寫,需要多少函數嗎?你看看所有的按鈕、滾動條、

Listbox\Textbox\checkBox\窗體、列印對話框、顏色對話框、打開、保存、另存

、字體對話框、文件的排列、拷貝、粘貼...... 這一切的一切是不是都需要在所

有的程序中都要寫出來呢?如果真的是這個樣子,那麼我們的windows應該按TB來

計算了(1TB=1024GB),也許你說你的硬碟很大,那麼他們還要在運行的時候占

用相同大下的內容呢!所以發展出來了,動態連接庫(dll)這個感念:

動態連接,就是把這些相通的功能、函數都放到一種特殊形式的windwos可執行文

件中(dll),生成一個DLL的時候,程序員需要寫出,其中包含那些函數需由其

他程序來訪問。這個過程叫做對函數的「導出」
創建windows程序的時候,專門的連接程序對程序的對象文件進行掃描,並生成一

個列表,列出那些調用的函數在那個DLL那個位置,指定各個函數所在位置的過程

叫做對函數的「導入」,當程序運行的時候,一旦要求用到執行文件內部沒有的

函數,windows就會自動裝載動態連接庫,使應用程序可以訪問這些函數。此時,

每個函數的地址都會解析出來,並且以動態的方式連接到程序里--這便是術語

「動態連接」的由來。
另外還有一個好處,就是當你更新你的這個函數的版本和功能的時候,靜態連接

所需要做的工作是多少(假設按windwos來說他有上千個這樣的函數,一共有100

多個程序來使用,那靜態連接需要100000次的更新,動態連接只需要1000次)
,從而也節省了內存的空間。
動態連接庫不一定是DLL擴展名的,也可以是ocx、vbx、exe、drv 等等的
大家可以發現在調用WIN32 api的時候裡面都會有說明是來自於那個dll等宿主文

件的
現在我就在這里講講一些標準的dll用途:
看下面這個API聲明:
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias

"GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long)

As Long
看見kernel32了嗎,其實這個就是kernel32.dll的名字,你可以在你的硬碟里找

到他,這就是說GetWindowsDirectory這個函數是在kernel32.dll裡面,他的別名

是GetWindowsDirectoryA,()中是他的參數,有兩個一個是字元型,一個是長

整型,返回值也是長整型。lpBuffer ------- String,指定一個字串緩沖區,

用於裝載Windows目錄名。除非是根目錄,否則目錄中不會有一個中止用的「\」

字元nSize ---------- Long,lpBuffer字串的最大長度,返回值 為Long,復制

到lpBuffer的一個字串的長度。如lpBuffer不夠大,不能容下整個字串,就會返

回lpBuffer要求的長度。零表示失敗。
這就是API聲明的意義所在!枝慧殲
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之一
WINMM.DLL------(這可不是WINDOWS的MM)是多媒體控制訪問函數集合

windows api正在快速發展和變化,是你我任何單個人都追趕不上的速度發展,幸

運的是我們不用掌握所有的windows API,只是掌握需要經常使用的WINDOWs api

和他的常規結構、基本感念就可以了,這亮點很重要。

⑵ 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不是獨立運行的程序,它是某個程序的一個部分,它只能由所屬的程序調用。用戶不能,也不需要打開它。

⑶ C# dll編譯問題

這個只有三樓說對了!

事實上我們在引用時自己開發的dll時存在兩種引用方式:

  1. 引用時選擇的是項目(dll項目也在項目資源管理器中),這里引用最直接,原則上是使用這種引用的方式。

  2. 引用時選擇的是文件(直接引用了文件夾中指定的dll),這里引用其實一般用於不一個項目資源管理器時的使用(因為這個dll的源碼你無法拿到,或者為了不允許你更改,要求你引用文件而不是項目)

當然,如果條件允許,引用前可以在資源管理器先添加已存在的項目(當然是你要引用的那個項目),然後按第一種引用方式引用!

兩種引用方式有一定的區別:

引用項目其實是在項目資源管理器中形成一個依賴關系,這個可以在項目管理管理器上右面查看項目依賴關系(不是在項目上右擊,不是在項目上右擊,不是在項目上右擊,重要的事說三遍,因為很多人連項目與項目資源管理器都沒分清!)正是因為有這個項目依賴的關系,所以IDE在編譯時會按照依賴關系進行生成——也就是說被引用項目要比引用項目先生成!當然了,我見過一些「牛X"程序員把自己項目中亂寫一通,最後形成了一個環狀引用,還告訴我說找到了vs的bug,項目生成失敗,而且無解!汗了~~自己原理不清楚,你以為臭蟲那麼好捉?

之所以這么說,就是因為其實你每次生成時,由於依賴關系的原因,引用的永遠是最後的dll,不管是有人解釋為「所有項目重新生成了,所以能引用到最新的」,還是解釋為「直接引用了被引用項目bin中的文件」,還是解釋為「通知了依賴項項目更新引用文件」等等不影響你使用的,而且在被引用生成之後,其他的引用都是新的。

第二種其實是引用了一個副本文件!不管你在不在同一項目資源,只要是直接引用文件的這種,都實都是將文件到了object文件夾中,而這個文件夾的文件在生成時會生成到bin文件夾中!也有人理解為到了bin文件夾中,但是他們搞不清楚——類似於以上文件明明引用源中的dll已經更新,而bin中的怎麼還是舊文件呢?其實文件引用方式是引用到項目中一個中間文件中了,這個文件並沒有在vs上顯示(文件組中存在,有些還是隱藏的),眾所周知的是bin只有在編譯的時候才會生成,所以很多人會以為源dll文件也是此時生成的,事實上根本上不是!而是你在引用時已經將文件到了隱藏的目錄中!在生成時再將其到bin中!所以即引源文件夾的內容已經改變,這個文件也不會再發生錯誤了!如果這樣理解了,那麼樓主的問題就已經知道原因了!

如果是項目引用,不用管的,引用的永遠是最新的dll!

如果是文件引用,在dll更新時,應該在項目中引用文件夾中找到文件,然後右擊「刷新引用」即可!這個方式相當於再次從將源dll 到中間object目錄中。當然,開發過程中使用的就是新的dll了!另一種方式更絕,就是刪除引用文件,重新引用(這絕對可行,但怎麼也不那麼優雅,人家原因的dll位置又沒換)!

如果讓我根據樓主的描述,我猜你使用的也是文件引用方式!那麼知道文件引用方式,怎麼解決就不成問題了!

你一定奇怪,為什麼還要有文件引用方式?我想引用哪個直接把那個項目添加到我的項目資源管理器中不就行了?就算兩台機器上,一個dll也是,把整個的項目拷貝過來不也行嗎(大多時候我們使用TFS時,可以直接將項目拉回來的)?為什麼會存在這樣文件引用呢?它的作用就為了解決我們拿不到源碼無法添加到項目中而出現的引用方式嗎?答案是肯定的,但只是一部分原因!我來告訴你另一部分的原因!

Fake!Fake!Fake! 如果你懂這個單詞,那麼一定知道我的意思,如果不懂我來告訴你吧,這個單詞就是「假的」!如果dll開發是一個任務(develop task), 而引用該dll的應用軟體或中間件也是一個任務(delevop task),在正常的開發關繫上來說,dll開發任務是應用開發的前驅,也就是正常的需要dll開發完成後才進行應用軟體的開發(很多人的模式都是這樣的),但現在情況是,dll開發需要5天,而應用開發也需要5天,產品卻要7天內交付!那麼是說兩個任務要同時進行develop! 怎麼辦?怎麼辦?應用開發程序員卻說你沒dll讓我怎麼引用——聽起來很有道理,不少管理者向dll開發team壓壓力,你們在兩天內加班完成,我給你們放5天假!事實上兩天內加班完成的dll其實質量可想而知!為什麼不Fake呢!

Fake的意思就是應用開發人員引用一個「假的」dll! 標記為Fake的引用文件非常好玩——你可以在開發中試一下!它只需要在成品是組合一下就可以了(因為引用文件會使用其文件的版本/哈希值/空間等相關校驗,而這個即更是更新後的文件也存在有些值不一樣——如publicToken值,而引用Fake則就是解決了這個問題)!

所以說文件引用的方式同時還是打破任務前驅方式的一種行為,有利於扁開化安排開發時間!所以文件引用也存在其實必要的因素!

  1. 無源碼時的引用(只提供了dll沒提供源碼),比如某些SDK等,一般用於穩定的成熟的,基本上更新不大的dll文件使用。

  2. 分支版本控制(由於開發過程中存在諸多的分支版本)應用程序員無法分清楚或不需分清楚分支版本時,引用源碼則會對應用開發造成一定的混淆,當然在dll開發立場上他們當然知道該用哪個版本的源碼,對於應用開發的team,沒有必要增加他們學習時間。各版本的區別他們並不知道細節。

  3. Fake引用!並行開發成為可能性(雖然可以引用另一個團隊的dll源碼,如果你願意每次生成時都更新他們的源碼——他們有可能同時在改動,還要以無比的關愛來忍受他們的千奇百怪的bug的話,我同意,當然還得忍受這種原因導致你自己的進度緩慢)。

也正是因為如此,所以文件引用可能會出現的現象要知道怎麼處理。

⑷ AVIFILE.DLL是什麼文件。有什麼用途,可以刪掉嗎

這個文件是系統中支持AVI格式文件的動態鏈接庫,刪除有可能影響AVI格式文件的播放。

⑸ reflector反編譯DLL文件:DLL文件中有一段時間控製程序的使用時間,我想把這個時間往後延長

可以用WINHEX打開搜索字元串,找到對應的修改之,當然對代碼混淆或者加密的可能就無能為力了

⑹ 系統問題

教你查殺DLL木馬

從DLL技術說起

要了解DLL木馬,就必須知道這個「DLL」是什麼意思,所以,讓我們追溯到幾年前,DOS系統大行其道的日子裡。在那時候,寫程序是一件繁瑣的事情,因為每個程序的代碼都是獨立的,有時候為了實現一個功能,就要為此寫很多代碼,後來隨著編程技術發展,程序員們把很多常用的代碼集合(通用代碼)放進一個獨立的文件里,並把這個文件稱為「庫」(Library),在寫程序的時候,把這個庫文件加入編譯器,就能使用這個庫包含的所有功能而不必自己再去寫一大堆代碼,這個技術被稱為「靜態鏈接」(Static Link)。靜態鏈接技術讓勞累的程序員鬆了口氣,一切似乎都很美好。可是事實證明,美好的事物不會存在太久,因為靜態鏈接就像一個粗魯的推銷員,不管你想不想要宣傳單,他都全部塞到你的手上來。寫一個程序只想用到一個庫文件包含的某個圖形效果,就因為這個,你不磨襪得不把這個庫文件攜帶的所有的圖形效果都加入程序,留著它們當花瓶擺設,這倒沒瞎指激什麼重要,可是這些花瓶卻把道路都阻塞了——靜態鏈接技術讓最終的程序成了大塊頭,因為編譯器把整個庫文件也算進去了。

時代在發展,靜態鏈接技術由於天生的弊端,不能滿足程序員的願望,人們開始尋找一種更好的方法來解決代碼重復的難題。後來,Windows系統出現了,時代的分水嶺終於出現。Windows系統使用一種新的鏈接技術,這種被稱為「動態鏈接」(Dynamic Link)的新技術同樣也是使用庫文件,微軟稱它們為「動態鏈接庫」——Dynamic Link Library,DLL的名字就是這樣來的。動態鏈接本身和靜態鏈接沒什麼區別,也是把通用代碼寫進一些獨立文件里,但是在編譯方面,微軟繞了個圈逗鋒子,並沒有採取把庫文件加進程序的方法,而是把庫文件做成已經編譯好的程序文件,給它們開個交換數據的介面,程序員寫程序的時候,一旦要使用某個庫文件的一個功能函數,系統就把這個庫文件調入內存,連接上這個程序佔有的任務進程,然後執行程序要用的功能函數,並把結果返回給程序顯示出來,在我們看來,就像是程序自己帶有的功能一樣。完成需要的功能後,這個DLL停止運行,整個調用過程結束。微軟讓這些庫文件能被多個程序調用,實現了比較完美的共享,程序員無論要寫什麼程序,只要在代碼里加入對相關DLL的調用聲明就能使用它的全部功能。最重要的是,DLL絕對不會讓你多拿一個花瓶,你要什麼它就給你什麼,你不要的東西它才不會給你。這樣,寫出來的程序就不能再攜帶一大堆垃圾了——絕對不會讓你把吃剩的東西帶回家,否則罰款,這是自助餐。(靜態鏈接與動態鏈接)

DLL技術的誕生,使編寫程序變成一件簡單的事情,Windows為我們提供了幾千個函數介面,足以滿足大多數程序員的需要。而且,Windows系統自身就是由幾千個DLL文件組成,這些DLL相互扶持,組成了強大的Windows系統。如果Windows使用靜態鏈接技術,它的體積會有多大?我不敢想。

應用程序介面API

上面我們對DLL技術做了個大概分析,在裡面我提到了「介面」,這又是什麼呢?因為DLL不能像靜態庫文件那樣塞進程序里,所以,如何讓程序知道實現功能的代碼和文件成了問題,微軟就為DLL技術做了標准規范,讓一個DLL文件像乳酪一樣開了許多小洞,每個洞口都註明裡面存放的功能的名字,程序只要根據標准規范找到相關洞口就可以取得它要的美味了,這個洞口就是「應用程序介面」(Application Programming Interface),每個DLL帶的介面都不相同,盡最大可能的減少了代碼的重復。

用Steven的一句話:API就是一個工具箱,你根據需要取出螺絲刀、扳手,用完後再把它們放回原處。

在Windows里,最基本的3個DLL文件是kernel32.dll、user32.dll、gdi32.dll。它們共同構成了基本的系統框架。
DLL與木馬

DLL是編譯好的代碼,與一般程序沒什麼大差別,只是它不能獨立運行,需要程序調用。那麼,DLL與木馬能扯上什麼關系呢?如果你學過編程並且寫過DLL,就會發現,其實DLL的代碼和其他程序幾乎沒什麼兩樣,僅僅是介面和啟動模式不同,只要改動一下代碼入口,DLL就變成一個獨立的程序了。當然,DLL文件是沒有程序邏輯的,這里並不是說DLL=EXE,不過,依然可以把DLL看做缺少了main入口的EXE,DLL帶的各個功能函數可以看作一個程序的幾個函數模塊。DLL木馬就是把一個實現了木馬功能的代碼,加上一些特殊代碼寫成DLL文件,導出相關的API,在別人看來,這只是一個普通的DLL,但是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然同樣的代碼就可以實現木馬功能,那麼直接做程序就可以,為什麼還要多此一舉寫成DLL呢?這是為了隱藏,因為DLL運行時是直接掛在調用它的程序的進程里的,並不會另外產生進程,所以相對於傳統EXE木馬來說,它很難被查到。

DLL的運行

雖然DLL不能自己運行,可是Windows在載入DLL的時候,需要一個入口函數,就如同EXE的main一樣,否則系統無法引用DLL。所以根據編寫規范,Windows必須查找並執行DLL里的一個函數DllMain作為載入DLL的依據,這個函數不作為API導出,而是內部函數。DllMain函數使DLL得以保留在內存里,有的DLL裡面沒有DllMain函數,可是依然能使用,這是因為Windows在找不到DllMain的時候,會從其它運行庫中找一個不做任何操作的預設DllMain函數啟動這個DLL使它能被載入,並不是說DLL可以放棄DllMain函數。

DLL木馬技術分析

到了這里,您也許會想,既然DLL木馬有那麼多好處,以後寫木馬都採用DLL方式不就好了嗎?話雖然是這么說沒錯,但是DLL木馬並不是一些人想像的那麼容易寫的。要寫一個能用的DLL木馬,你需要了解更多知識。

1.木馬的主體

千萬別把木馬模塊寫得真的像個API庫一樣,這不是開發WINAPI。DLL木馬可以導出幾個輔助函數,但是必須有一個過程負責主要執行代碼,否則這個DLL只能是一堆零碎API函數,別提工作了。

如果涉及一些通用代碼,可以在DLL里寫一些內部函數,供自己的代碼使用,而不是把所有代碼都開放成介面,這樣它自己本身都難調用了,更不可能發揮作用。

DLL木馬的標准執行入口為DllMain,所以必須在DllMain里寫好DLL木馬運行的代碼,或者指向DLL木馬的執行模塊。

2.動態嵌入技術

Windows中,每個進程都有自己的私有內存空間,別的進程是不允許對這個私人領地進行操作的,但是,實際上我們仍然可以利用種種方法進入並操作進程的私有內存,這就是動態嵌入,它是將自己的代碼嵌入正在運行的進程中的技術。動態嵌入有很多種,最常見的是鉤子、API以及遠程線程技術,現在的大多數DLL木馬都採用遠程線程技術把自己掛在一個正常系統進程中。其實動態嵌入並不少見,羅技的MouseWare驅動就掛著每一個系統進程-_-

遠程線程技術就是通過在另一個進程中創建遠程線程(RemoteThread)的方法進入那個進程的內存地址空間。在DLL木馬的范疇里,這個技術也叫做「注入」,當載體在那個被注入的進程里創建了遠程線程並命令它載入DLL時,木馬就掛上去執行了,沒有新進程產生,要想讓木馬停止惟有讓掛接這個木馬DLL的進程退出運行。但是,很多時候我們只能束手無策——它和Explorer.exe掛在一起了,你確定要關閉Windows嗎?

3.木馬的啟動

有人也許會迫不及待的說,直接把這個DLL加入系統啟動項目不就可以了。答案是NO,前面說過,DLL不能獨立運行,所以無法在啟動項目里直接啟動它。要想讓木馬跑起來,就需要一個EXE使用動態嵌入技術讓DLL搭上其他正常進程的車,讓被嵌入的進程調用這個DLL的DllMain函數,激發木馬運行,最後啟動木馬的EXE結束運行,木馬啟動完畢。

啟動DLL木馬的EXE是個重要角色,它被稱為Loader,如果沒有Loader,DLL木馬就是破爛一堆,因此,一個算得上成熟的DLL木馬會想辦法保護它的Loader不會那麼容易被毀滅。記得狼狽為奸的故事嗎?DLL木馬就是爬在狼Loader上的狽。

Loader可以是多種多樣的,Windows的rundll32.exe也被一些DLL木馬用來做了Loader,這種木馬一般不帶動態嵌入技術,它直接掛著rundll32進程運行,用rundll32的方法(rundll32.exe [DLL名],[函數] [參數])像調用API一樣去引用這個DLL的啟動函數激發木馬模塊開始執行,即使你殺了rundll32,木馬本體還是在的,一個最常見的例子就是3721中文實名,雖然它不是木馬。(圖3--啟動項)

注冊表的AppInit_DLLs鍵也被一些木馬用來啟動自己,如求職信病毒。利用注冊表啟動,就是讓系統執行DllMain來達到啟動木馬的目的。因為它是kernel調入的,對這個DLL的穩定性有很大要求,稍有錯誤就會導致系統崩潰,所以很少看到這種木馬。

有一些更復雜點的DLL木馬通過svchost.exe啟動,這種DLL木馬必須寫成NT-Service,入口函數是ServiceMain,一般很少見,但是這種木馬的隱蔽性也不錯,而且Loader有保障。
4.其它

到這里大家也應該對DLL木馬有個了解了,是不是很想寫一個?別急,不知道大家想過沒有,既然DLL木馬這么好,為什麼到現在能找到的DLL木馬寥寥無幾?現在讓我來潑冷水,最重要的原因只有一個:由於DLL木馬掛著系統進程運行,如果它本身寫得不好,例如沒有防止運行錯誤的代碼或者沒有嚴格規范用戶的輸入,DLL就會出錯崩潰。別緊張,一般的EXE也是這樣完蛋的,但是DLL崩潰會導致它掛著的程序跟著遭殃,別忘記它掛接的是系統進程哦,結局就是……慘不忍睹。所以寫一個能公布的DLL木馬,在排錯檢查方面做的工作要比一般的EXE木馬多,寫得多了自己都煩躁……

DLL木馬的發現和查殺

經常看看啟動項有沒有多出莫名其妙的項目,這是Loader的所在,只要殺了狼,狽就不能再狂了。而DLL木馬本體比較難發現,需要你有一定編程知識和分析能力,在Loader里查找DLL名稱,或者從進程里看多掛接了什麼陌生的DLL,可是對新手來說……總之就是比較難啊比較難,所以,最簡單的方法:殺毒軟體和防火牆(不是萬能葯,切忌長期服用)。

DLL木馬檢測與清除實例

守護者(NOIR—QUEEN)是一個典型的DLL木馬程序,其服務端以DLL文件的形式插入到系統的Lsass.exe進程中。Lsass.exe進程是一個本地的安全授權服務,並且它會為使用Winlogon服務的授權用戶生成一個進程,如果授權是成功的,Lsass就會產生用戶的進入令牌。由於Lsass.exe是系統的關鍵進程,不能被終止,那麼我們該如何清除這樣的木馬呢?
守護者木馬入侵系統後,會在服務中添加一項名為「QoSserver」的服務,並將「QoSserver.dll」文件插入到Lsass進程中,使其可以隱藏進程並自動啟動。我們利用「進程獵手」這樣的工具查看Lsass進程所調用的DLL文件,並與木馬入侵前的信息比較,可以發現Lsass進程中增加了「QoSserver.dll」文件。記錄下該文件的具體位置,本例中為「C:\Windows\system32\QoSserver.dll」。

打開WindowsXP任務管理器,切換到「進程」選項卡中,結束「QoSserver.exe」進程,同時將系統目錄下的「QoSserver.exe」文件刪除。然後運行Regedit,在注冊表編輯器中依次展開[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\QoSserver],直接刪除「QoSserver」項,重啟計算機。重啟之後,再將系統目錄下的「QoSserver.dll」文件刪除。需要注意的是,如果前面未刪除「QoSserver.exe」文件,而只刪除了QoSserver服務並重啟之後,插入到Lsass進程當中的「QoSserver.dll」又會生成另外一個名為「AppCPI」的服務。這時再次打開注冊表編輯器,展開[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppCPI],刪除AppCPI項。如果QoSserver服務同時復活,則要將該服務的啟動類型改為「禁用」。重新啟動計算機後,再刪除系統目錄下的木馬文件。
防範DLL木馬

1.安裝木馬查殺工具。對於多數人而言,要想通過手工查殺DLL木馬是不太現實的,因此安裝一款可以查殺此類木馬的反病毒軟體,是非常有必要的。這里還要提醒讀者的是,應及時升級病毒資料庫,這樣才能保證有效地查殺絕大部分木馬病毒。當然,我們也可以在計算機中安裝那些專門針對木馬的查殺工具,例如木馬剋星。

2.查看是否有不明埠開放以及對埠通信進行監控。只要木馬進行連接,接受/發送數據則必然會打開埠,DLL木馬也不例外,我們可以通過「Netstat-ano」命令來查看TCP/UDP埠的連接,以及開放埠的進程標識符,也可以直接使用進程埠查看工具Fport.exe來查看與埠對應的進程,以發現是否有不明的連接和埠開放。另外,有些DLL木馬通過埠劫持或者埠重用的方法來進行通信,所以僅是查看埠還是不夠的,有必要的話,我們可使用嗅探器來了解打開的埠到底在傳輸些什麼數據。

3.檢查系統目錄下是否有可疑的DLL文件。安裝好系統和所有應用程序之後,可對系統目錄下System32文件夾中的EXE和DLL文件作一記錄:在命令提示符下執行「dir*.exe>bak1.txt&dir*.dll>bak2.txt」,將所有的EXE和DLL文件信息導出成TXT文件保存。當日後發現異常時,可以使用相同的命令再次備份,並使用FC命令比較兩次的EXE文件和DLL文件。通過這種方法,我們可以發現可疑的EXE和DLL文件,同時通過文件的大小、創建時間來判斷是否為DLL木馬。

4.查看系統進程調用的DLL文件。當我們懷疑有DLL木馬插入到系統進程,可以使用一些第三方進程工具來查看進程所調用的DLL文件,然後進一步確認是否中了DLL木馬。此類查看工具有進程獵手、進程間諜等等。另外,我們也可以使用XP系統自帶的命令行工具TaskList,來顯示進程調用的DLL文件,並將這些信息導出成TXT文件保存,以便隨時進行比較。

但我們就要利用這種木馬 因為他比較難查殺 所以~~~~~~~~~~~~~

DLL注入木馬如是說

DLL庫鏈接文件,是Windows系統中許多驅動和程序運行時必需的文件。一般來說,這類文件無法單獨運行,必須通過某個EXE文件調用該DLL文件,從而執行相應的功能。同時,當該EXE文件正在執行時,調用的DLL文件無法被刪除。正因為由於DLL文件具有隱蔽性,並且很難刪除,因此目前許多流行的木馬程序都採用了DLL文件方式進行安裝,將木馬DLL文件載入到某個正常的系統進程中,從而達到隱藏木馬進程和保護木馬文件的目的——這就是所謂的DLL注入式木馬。

木馬是如何將DLL文件進行載入的呢?這里我們以一個黑客常用的DLL木馬「上興遠程式控制制木馬」為例進行講解。

運行「上興木馬」後,點擊界面中「配置服務端」按鈕,打開服務端生成程序。在「DNS域名解析更新IP」中輸入自己的IP地址或者動態DNS域名,在安裝名稱中輸入生成的服務端DLL文件名。木馬運行後,該DLL文件將被注入到下面「宿主進程名」中指定的系統進程中,默認為「explorer.exe」。最後點擊生成按鈕,即可生成木馬文件「rejoice_06.exe」。

將生成的木馬文件傳播,當其他用戶運行後,就可以通過上興木馬遠控客戶端進行控制了。

警報,病毒無法清除

如果系統中被植入了DLL木馬,將會出現什麼情況呢?

首先,系統被黑客遠程式控制制,出現數據丟失等情況;其次,殺毒軟體會報警系統中有病毒,但是卻無法進行清除。例如,在電腦中運行了上面製作的上興遠控木馬後,筆者電腦上安裝的殺毒軟體提示發現病毒,但是在刪除DLL病毒文件時卻失敗了。即使我們手工刪除病毒文件,也會因為DLL文件正在使用中,所以也無法徹底刪除。即使進入安全模式,得到的也是同樣的結果。
另外,由於DLL木馬是插入到系統進程中的,因此通過任務管理器等進程工具,也無法發現任何木馬進程,這給木馬的清除帶來了很大的困難!

無法刪除病毒文件,無法查找到木馬進程,那麼到底該如何清除DLL注入式木馬呢?

無所遁形,揪出木馬藏身之所

雖然木馬沒有自己的進程,但是有一個宿主進程,只要結束宿主進程,停止DLL文件的調用,就梢隕境鼶LL文件,進而清除木馬。因此,清除DLL木馬的第一步,就是找到木馬注入的宿主進程。那麼,如何才能找到木馬注入的宿主進程呢?且讓我們細細看來。

以清除「上興遠控木馬」為例,從殺毒軟體的報警提示中已經知道木馬DLL文件名為「rejoice.dll」。因此,就可以通過一些查看進程調用DLL文件的進程管理工具,找到該文件的宿主進程,此類工具很多,比如大名鼎鼎的ICESword。

運行IceSword後,點擊左側邊欄「查看→進程」,就可以在其右側窗口中看到所有進程列表。右鍵點擊某進程,在彈出菜單中選擇「模塊信息」命令,即可看到該進程調用的所有DLL文件。

提示:DLL注入式木馬通常是將DLL文件,載入到explorer.exe、svchost.exe、winlogon.exe、iexplore.exe等系統進程中的。因此在查找DLL宿主文件時,可以關閉其它無關的程序,然後依次檢查這幾個進程中的DLL文件。

不過一個一個的檢查系統進程,確實有些麻煩,如何才能快速的定位木馬的宿主進程呢?可以使用一款名為「procexp」的進程管理工具。運行procexp後,在程序界面中間顯示的是樹狀進程關系列表,下方是每個進程的詳細信息。點擊菜單「Find→Find DLL」命令,打開DLL文件查找對話框,在「DLL Substring」中輸入要查找的關鍵詞,這里輸入剛才殺毒軟體掃描出的DLL文件名「rejoice.dll」。然後點擊「Search」按鈕,在下方的列表中就可以看到該DLL文件是被哪個進程調用的了。 牛刀小試,清除普通進程DLL注入木馬

對於大部分DLL注入木馬,其注入到「iexplore.exe」和「explorer.exe」這兩個進程。對於這類普通進程的DLL木馬,清除將是非常方便的。

如果DLL文件是注入到「iexplore.exe」進程中,由於此進程就是IE瀏覽器進程,因此就需要先關掉所有IE窗口和相關程序,然後直接找到DLL文件進行刪除就可以了。

如果DLL文件是注入到「explorer.exe」進程中,那麼就略顯麻煩一些。由於此進程用於顯示桌面和資源管理器,因此,當通過任務管理器結束掉「explorer.exe」進程時,桌面無法看到,桌面上所有圖標消失掉,"我的電腦"、"網上鄰居"等所有圖標都不見了,同時,也無法打開資源管理器找到木馬文件進行刪除。怎麼辦呢?

實際上,解決的方法也很簡單。在任務管理器中點擊菜單「文件→新任務運行」,打開「創建新任務」對話框,點擊「瀏覽」按鈕,通過瀏覽對話框就可以打開DLL文件所在的路徑。然後選擇「文件類型」為「所有文件」,即可顯示並刪除DLL文件了。

在瀏覽對話框中刪除DLL文件
除惡務盡,清除特殊DLL注入木馬

除了以上所說的注入普通進程的DLL木馬之外,還有許多木馬注入到系統里關鍵進程中,比如svchost.exe、smss.exe、winlogon.exe進程。這些進程使用普通方式無法結束,使用特殊工具結束掉進程後,卻又很可能造成系統崩潰無法正常運行的情況。對於這些木馬,我們可以通過以下兩種方法進行清除。

1.使用IceSword卸載DLL文件

IceSword的功能十分強大,我們曾在以前作過介紹,在這里,就可以利用它卸載掉已經插入到正在運行的系統進程中的DLL文件。在IceSword的進程列表顯示窗口中,右鍵點擊DLL木馬宿主進程,選擇彈出命令「模塊信息」。在進程模塊信息對話框中找到DLL木馬文件,選擇文件後點擊「強制解除」命令,即可將系統進程中的DLL木馬文件卸載掉了

卸載系統進程中的DLL木馬

2.SSM終結所有DLL木馬

使用IceSword可以卸載大部分的DLL木馬文件,但還有某些特殊木馬在卸載時,卻會造成系統崩潰重啟。例如一款著名的木馬PCShare採用了注入「winlogon.exe」進程的方式運行,由於該進程是掌握Windows登錄的,因此在使用IceSword卸載時,系統將會立即異常重啟,根本來不及清除掉DLL文件,在重啟後DLL木馬又被再次載入。對於這類DLL木馬,必須在進程運行之前阻止DLL文件的載入。接下來,我們又要用到一款用於阻止DLL文件載入的安全工具——「System Safety Monitor」(簡稱SSM)。

提示:SSM是一款俄羅斯出品的系統監控軟體,通過監視系統特定的文件(如注冊表等)及應用程序,達到保護系統安全的目的。這款軟體功能非常強大,可以輔助防火牆和殺毒軟體更好的保護系統安全。

運行SSM,在程序界面中選擇「規則」選項卡,右鍵點擊中間規則列表空白處,選擇「新增」命令,彈出文件瀏覽窗口,選擇瀏覽文件類型為「DLL files」,在其中選擇指定文件路徑「C:\Windows\system32\rejoice.dll」。點擊「確定」按鈕後,即可把「rejoice.dll」文件添加到規則列表中,然後在界面下方的「規則」下拉列表中選擇「阻止(F2)」。完成添加規則設置後,點擊「應用設置」按鈕,後重啟系統。

阻止DLL文件載入到進程

提示:在重啟系統前請檢查SSM的設置,確保SSM隨系統啟動而載入運行。

當系統重啟時,SSM就會自動阻止相關進程調用「rejoice.dll」木馬文件。這樣,該木馬文件便不會被任何程序使用,在硬碟中找到它,直接刪除即可。

雁過無聲,清除木馬殘留垃圾

DLL注入型木馬並不會感染其它文件,只要結束木馬進程並刪除掉病毒文件木馬,木馬就沒有任何危害性了。剩下的工作就是清除掉木馬在注冊表和其它啟動文件中留下的項目。方法很簡單,點擊「開始→運行」,輸入「regedit」命令,就會打開「注冊表編輯器」,利用搜索功能,便可以清除木馬在注冊表中留下的垃圾;輸入「mscnofig」命令,就可以打開系統配置實用程序,清除木馬在啟動文件中的蹤影。

編後:木馬選擇注入的系統進程也不盡相同。在碰到此類木馬時,我們可以首先考慮用procexp之類的工具,查找出DLL文件的宿主進程。找到宿主進程後,如果是注入到普通可結束的進程中,可以直接將宿主進程終止後刪除DLL木馬文件即可。如果DLL文件是注入到系統關鍵進程中的話,可以考慮用IceSword卸載DLL文件;如若失敗,那麼直接用SSM建立規則,阻止DLL文件的載入就可以了。

個人強烈建議:你也可以利用一些軟體的 「粉碎文件」 工具也可以達到預期殺毒的效果.
---
回答比較長,希望你能解決問題。

⑺ 不用頭文件,能否調用dll中的導出類(每個編程人員都可能想到的問題)

這個好像不行啊,最少你需要知道類或函數的聲明啊。
無論dll中導出函數或是類。
也無論你是使用隱式搭仔調用或是顯示調用dll中的函數,你都需要先知道函數聲明,否則一切都是無用的。只不過是函數聲明由dll工程移到了調用這個dll的工程。
你說對不對。

如果要顯示調用dll中導出的類,神枝拿可以通過如下方法實現。
DLL中:
class A//此類不用導出。
{
...
};
A* create_instance()//應該定義為導出函數。

return new A();


//調用DLL的工程
A* (*ptrAInst)();
loadlibrary(...);//具體函數參見不同操作系統的編程手冊
ptrAInst = getprocaddress(「create_instance」);//具體函數參見不同操作系統的編程手冊
...//處理某些工作
freelibrary(...);/游搭/工作處理完後釋放,具體函數參見不同操作系統的編程手冊

⑻ 一個應用程序里有很多DLL是怎麼編譯出來的

DLL就是功能獨立出來的軟體包,主要就是為了實現程序功能模塊的分割,一個DLL可以同時在系統中被多個EXE進程映射,而時間上在內存中的拷貝只有一份。
DLL和EXE一樣都是PE文件。

比如你的控制台程序(EXE的)要引用第三方的軟體包,你就 可以將他們提供的lib文件加入到你的程序中,使用「#pragram comment(lib,"xxx.lib") 」——如果對方提供有.h文件,也要將其在包含在cpp的前面,或者延遲載入「LoadLibrary / GetProcAddress / FreeLibray 」,

自己也可以做個dll,導出函數、類、變數,等

任何一個程序都默認包含了系統的幾個dll庫文件。

⑼ BKGND.DLL和BKGND.ini分別是什麼是什麼意思呢

BKGND.DLL..是按鍵精靈的"動態鏈接庫"
動態鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提圓碧胡供了一種方法,使進程可以調用不屬於其可慧稿執行代碼的函數。

INI是英文「初始化(Initial)」的縮寫...
BKGND.INI..是腳本,變數參數的設置聲明。是文本模式。
某些程序包含自身的INI文件。這些文件的內容的修改通常是通過該程序的用戶界面來更改程序的特徵,並不是通過編輯文件本身來進行橘攔的。

文件名: bkgnd.dll
更新日期: 2010-01-03
文件版本: 3.1.9
佔用空間: 512 KB
所屬公司: Noromaa Solutions
編譯時間: 2004-3-9

⑽ 可以讓QT只編譯出Windows用的dll庫么這樣編譯的時間會快點吧

不論你使用預編譯/ccache/only build no rebuild等方沒州法加速編譯,都會生成.a,這弊嘩個是dll的導入庫,完整的擴租察行展名應該是.dll.a

閱讀全文

與dll里有編譯時間相關的資料

熱點內容
楚天的小說主角 瀏覽:86
重生到民國成為浙江督軍的小說 瀏覽:531
玄幻推母 瀏覽:770
周潤發黃百鳴電影 瀏覽:815
mfc列印pdf 瀏覽:522
大尺度網址 瀏覽:829
飛行中的偶遇電影 瀏覽:983
電影功夫夢演員表 瀏覽:905
128單片機中斷程序編寫 瀏覽:325
休傑克曼脖子上長蛋蛋的電影1002無標題 瀏覽:917
台灣真軍紅羊生日舞會 瀏覽:763
女主叫洛洛的補課小說 瀏覽:34
程序員溝通時笑死 瀏覽:389
易語言網路共享下載源碼 瀏覽:808
誰有那種電影你懂得 瀏覽:195
台灣男同性戀片 瀏覽:71
安卓應用包安裝程序怎麼清除數據 瀏覽:61
催眠合集txt下載 瀏覽:324
韓國車震大尺度電影有哪些 瀏覽:336
割乳酷刑電影 瀏覽:235