多線程注入

來源:互聯網
上載者:User

Windows是一種多任務的作業系統,一方面是指它支援多進程,每個進程有獨立的地址空間,另一方面則在於Windows的多線程支援。儘管多線程常常帶來很多問題,並且在UN*X世界從來沒有成為主流,但是在並發計算越來越流行的時代,多線程還是比較有前景的。在Windows系統中,應用程式通過調用 CreateThread 就可以建立一個線程,這個線程和主線程同屬一個進程,共用著進程的所有資源,但是具有自己的堆棧和局部儲存,可以平等的獲得CPU時間,和主線程同時運行著。

遠程線程注入技術是通過調用 CreateRemoteThread 函數在別的進程中建立一個線程,因此這個線程可以稱為遠程線程,而被注入的遠程進程又稱為宿主進程。遠程線程就像是宿主進程自己調用 CreateThread 建立的線程一樣,能夠訪問宿主進程的所有資源。電腦病毒通過向宿主進程注入一個線程,就可以以宿主進程的身份訪問電腦系統,達到控制電腦的目的。
第一步,提升本進程的系統許可權。
因為我們要操作的是系統中的其他進程,沒有足夠的系統許可權是無法讀取甚至寫入其他進程的記憶體位址的。提升進程許可權可能用到以下的函數:

1.函數OpenProcessToken(
HANDLE ProcessHandle, // 進程的控制代碼
DWORD DesiredAccess, // 對進程的訪問描述
PHANDLE TokenHandle // 開啟進程令牌的控制代碼指標
);
這個函數的作用是開啟進程令牌。

2.函數LookupPrivilegeValue(
LPCTSTR lpSystemName, //系統名稱
LPCTSTR lpName, // 特權名稱
PLUID lpLuid // 本地系統唯一的ID號
);
這個函數將會返回一個本地系統內獨一無二的ID,來用於系統許可權的更改,它的第1個參數是系統名,nil表示本系統。第2個參數是特權的名字。第3個參數用來接收函數返回的ID

3.函數AdjustTokenPrivileges(
HANDLE TokenHandle, //更改許可權的令牌環控制代碼
BOOL DisableAllPrivileges, //是否修改所有許可權的標誌位
PTOKEN_PRIVILEGES NewState, //新的系統許可權資訊
DWORD BufferLength, //上一個參數的長度
PTOKEN_PRIVILEGES PreviousState, // 返回更改系統特權以前的許可權
PDWORD ReturnLength //上一個參數的長度
);
這個函數用於更改進程的系統許可權 ,第1個參數是要更改許可權的令牌環控制代碼。第2個參數如果為true表示更改所有的系統許可權 ,false表示更改部分。第3個參數是要更改的系統特權的值。第4個參數是第3個參數的大小。第5個參數返回更改系統特權以前的許可權,我們不需要就設為nil。第6個參數是第5個參數的大小。
第二步,進入宿主的記憶體空間
在擁有了進入宿主程式記憶體的許可權之後,我們所要做的是在其記憶體空間加入一些新的程式碼,或者是讓其載入一個Dll檔案裡面的函數並運行起來。加入新的代碼可以省掉一個dll檔案,而載入dll檔案可以安裝一些系統級的鉤子,如果我們的隱形程式是一個截獲密碼的程式,載入dll就是一個很好的選擇。
Kernel32.dll中的函數LoadLibraryW可以載入dll,它只需要dll檔案的檔案路徑就可以完成操作,我們可以很容易的在程式碼中實現取出一個檔案路徑的操作。但是,我們希望在宿主程式中載入,而我們取出的dll檔案路徑並不存在於宿主程式的記憶體空間裡面,所以我們需要把dll的檔案路徑寫入宿主的記憶體空間。這些操作可能用到以下的函數:
這個函數用於修改我們宿主進程的一些屬性,這些屬性放在第一個參數裡面,比如PROCESS_VM_OPERATION就是允許遠程VM操作,即允許VirtualProtectEx和WriteProcessMemory函數操作本進程記憶體空間。PROCESS_CREATE_THREAD 就是允許遠程建立線程。PROCESS_VM_WRITE就是允許遠程VM寫,即允許 WriteProcessMemory函數訪問本進程的記憶體空間。第二個參數是一個標誌參數,用來確定返回的控制代碼是否可以被新的進程繼承。我們的程式中設為False。第三個參數需要操作的進程Id,也就是我們的宿主進程的Id。
2.函數VirtualAllocEx(
HANDLE hProcess, //要進行操作的進程控制代碼,當然是我們的宿主了
LPVOID lpAddress, //分配空間的起始地址
DWORD dwSize, //分配空間的大小
DWORD flAllocationType, // 分配空間的類型
DWORD flProtect // 訪問保護類型
);
我們使用 VirtualAllocEx函數在宿主進程中開闢一塊記憶體空間,用於存放dll的檔案名稱。VirtualAllocEx的第1個參數是要操作的進程,第2個是起始地址,第3個是長度,第4,5個是巨集指令引數。其中MEM_COMMIT表示本函數分配的是實體記憶體或者是記憶體的分頁檔,PAGE_READWRITE表示分配的地區內允許讀寫。
3.函數WriteProcessMemory (
HANDLE hProcess, //所要操作進程的控制代碼
LPVOID lpBaseAddress, //開始進行些操作的起始地址
LPVOID lpBuffer, //要寫入資料的緩衝區指標
DWORD nSize, // 要寫的bytes數
LPDWORD lpNumberOfBytesWritten // 實際寫入的bytes數
);
前面在宿主記憶體中建立好空間後,現在往裡面寫入dll的名稱,而我們的WriteProcessMemory函數就可以勝任這一項工作。WriteProcessMemory函數的第一個參數 是需要往其記憶體裡面寫入dd的進程控制代碼,第二個參數是 “要進行寫操作”的目標記憶體起始地址,第三個參數是 “需要被寫入的資料”的地址,第四個參數是準備要寫入的長度,第五個參數是實際操作中寫的長度,這個參數是被函數輸出的。到這裡我們就已經能成功把dll的路徑名稱寫進了宿主的記憶體空間。

第三步,在宿主中啟動新的線程!
剛才我們已經在宿主程式中建立了一個用於存放一個dll檔案路徑的緩衝區,現在我們就要讓這個dll在宿主的記憶體空間中運行起來。我們是用LoadLibraryW函數來載入的,而使用LoadLibraryW,又需要知道LoadLibraryW函數的入口地址。所以在載入dll之前,我們要用GetProcAddress來得到LoadLibraryW的入口地址。我們來看看這幾個函數的使用方法:
1.GetProcAddress(
HMODULE hModule, //dll模組的控制代碼
LPCSTR lpProcName // 函數名稱
);
我們用這個函數主要想得到kernel32.dll中的函數LoadLibraryW的入口地址,所以
GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW')就可以了,當然有些細節得符合程式編譯器的要求,VC下使用就要改成
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW")的形式。

2.CreateRemoteThread (
HANDLE hProcess, //要進行操作的進程控制代碼,也就是我們的宿主控制代碼
LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全執行緒屬性的指標
DWORD dwStackSize, //初始化堆(stack)的大小
LPTHREAD_START_ROUTINE lpStartAddress,//建立線程函數的指標,或叫做地址
LPVOID lpParameter, //建立線程函數的參數
DWORD dwCreationFlags, //標誌位
LPDWORD lpThreadId //線程傳回值
);
這個函數就是本文的點睛之筆了,我們之前所做所有的一切,都是在為它做準備工作,它的功能就是在其他任何進程中建立新的線程,讓其他的程式或進程附加執行我們的代碼。
CreateRemoteThread函數的第一個參數是要操作的宿主進程控制代碼;第二個參數為安全執行緒參數的指標,這裡設為nil;第三個參數為初始化堆(stack)的大小,這裡設0;第四個參數為建立線程函數的指標或叫做地址或叫入口;第五個參數為建立線程函數的參數,這裡就是我們的dll路徑名稱;第六個參數是標誌位,這裡設0;第七個參數是線程傳回值。
到這裡,我們基本上把如何編寫一個能夠寄生於其他進程之中啟動並執行API函數都依次講完了,如果讀者有興趣親手試一下的話,在光碟片中可以找到已經編好的程式完整代碼和詳細的程式注釋。當然這個寄生於進程中的dll檔案還需要自己編寫,不過我寫的內容是彈出一個“Helloworld”,而寄生的宿主是我們常用的QQ。我們開啟Windows的工作管理員,看到只有QQ在運行,而我們看不到其他的東西。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.