科技生活動態:windows任務管理器中隱藏進程的方法

導讀跟大家講解下有關windows任務管理器中隱藏進程的方法,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說windows任務管理器中隱

跟大家講解下有關windows任務管理器中隱藏進程的方法,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說windows任務管理器中隱藏進程的方法,小編也收集到了有關windows任務管理器中隱藏進程的方法的相關資料,希望大家看到了會喜歡。

在WinNT下"真正隱藏進程"這一說法,可以講是根本不可能實現,只要我們的程序是以進程內核的形式運行,都是不可能逃離CTRL+ALT+DEL的法眼。那么奇怪了,這豈不是與我們的標題《WinNT & Win2K下實現進程的完全隱藏》相矛盾嗎?是的,實際上應該是:以非進程方式執行目標代碼,而逃避進程查看器的檢查,從而達到"進程隱藏"的目的。 我們這里用的,是在宿主進程中,以線程的方式執行我們的代碼。實現起來非常簡單。首先,我們先建立一個不執行任何語句的線程

復制代碼 代碼如下:

DWORD stdcall ThreadProc(LPVOID *lpVoid){ return 0; }

然后,將線程代碼拷備至宿主進程所能夠執行的任何地方(即頁面屬性為PAGGE_EXECUTE_READWRITE),如:共享內存影射區、宿主進程內。這里我們選擇宿主進程,拷備的時侯,我們需要先在宿主進程中使用VirtualAllocEx函數申請一段內存,然后再使用WriteProcessMemory將線程體寫入宿主進程中。 以上工作完成后,我們便可CreateRemoteThread函數激活其執行。下面給出一個完整的例子

復制代碼 代碼如下:

//遠程線程執行體 DWORD __stdcall ThreadProc (void *lpPara){ return 0; } int main(int argc, char* argv[]){ const DWORD THREADSIZE=1024*4;//暫定線程體大小為4K,實際上沒這么大,稍后我將會介紹 DWORD byte_write; //獲得指定進程ID句柄,并設其權限為PROCESS_ALL_ACCESS,992是宿進程的ID號,獲取ID號的方法這里我就不多講了 HANDLE hWnd = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,992); if(!hWnd)return 0; void *pRemoteThread =::VirtualAllocEx(hWnd,0,THREADSIZE,MEM_COMMIT| MEM_RESERVE,PAGE_EXECUTE_READWRITE);//申請 if(!pRemoteThread)return 0; if(!::WriteProcessMemory(hWnd,pRemoteThread,&ThreadProc,THREADSIZE,0))//寫入進程 return 0; //啟動線程 HANDLE hThread = ::CreateRemoteThread (hWnd ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,NULL,0,&byte_write); if(!hThread){ //還有內存分配未釋放 return 0; } return 0; }

到這里,對于隱藏的方法就算告一段落,相信看過的朋友對這個思路有個非常明確的概念了吧。

在理解隱藏的方法后,我們著重開始寫線程的執行部分了。如下:

復制代碼 代碼如下:

DWORD __stdcall ThreadProc(void *lpPara){ MessageBox(NULL,"hello","hello",0); return 0; }

編譯執行后,你會發現出現一個非法操作錯誤,為什么呢?在我們以段頁式內存管理的win2K操作系統中,編譯時會把所有的常量編譯在PE文件的.data節中,而代碼段則在.text中,所以,我們拷備到宿主進程中的代碼是在.text中的代碼,MessageBox(NULL,(char *)指針,p,0);所指向的地址是本進程的內存虛擬地址。而在宿主進程中是無法訪問的。解決的方法很簡單,按舊照搬的將"hello"也拷備到目標進程中,然后再引用。同理,MessageBox函數地址編譯時,也是保存在.Import中,寫過Win2k病毒的朋友都知道,所有常量與函數入口地址都需在代碼段定義與得出,我們這里也與他有點類似。言歸正傳,同樣情況我們也把函數的入口地址一起寫入目標進程中。

復制代碼 代碼如下:

//先定義參數結構 typedef struct _RemotePara{//參數結構 char pMessageBox[12]; DWORD dwMessageBox; }RemotePara; //付值 RemotePara myRemotePara; ::ZeroMemory(&myRemotePara,sizeof(RemotePara)); HINSTANCE hUser32 = ::LoadLibrary ("user32.dll"); myRemotePara.dwMessageBox =(DWORD) ::GetProcAddress (hUser32 ,"MessageBoxA"); strcat(myRemotePara.pMessageBox,"hello/0");

來源:卡飯網

免責聲明:本文由用戶上傳,如有侵權請聯系刪除!