gh0st原始碼分析與遠控的編寫(四)
真的很久很久了,距離上一次寫gh0st的文章(http://www.mmcyy.com),過去有大半年了。總算有一個時間,我放下手裡所有的活,能夠繼續把這份努力延續下去。
以後對於gh0st的文章,就是一個一個模組的分析。原本gh0st就是由很多功能組成的一個強大的遠控,但有些東西並不是功能越強大越好。我們到最後,會做一個gh0st的精簡,留下最重要的功能,淘汰一些龐大而容易暴露的功能。所以,只有我們模組化了一個軟體之後,我們才能更方便地去刪除或增加一個功能,否則刪除掉某個模組之後導致整個gh0st執行不了了,得不償失。
今天帶來的是程序管理模組,這個模組檔案是SystemManager.cpp。
我們先來看被控端,一個獲取當前程序列表的模組。呼叫的相關api是CreateToolhelp32Snapshot -> Process32First -> OpenProcess -> EnumProcessModules -> GetModuleFileNameEx -> Process32Next -> CloseHandle
首先呼叫CreateToolhelp32Snapshot 建立當前程序列表的快照,再呼叫Process32First獲得快照中第一個程序控制代碼,OpenProcess開啟此程序,EnumProcessModules列舉這個程序引用的模組(第一個模組就是程序自身,原本這個函式應該返回該程序所有模組的一個數組,但因為我只需要第一個模組,所以傳入一個HMODULE型地址即可)。得到他自身的模組後,GetModuleFileNameEx獲得其完整名稱。此時就算獲取到了程序列表中一個程序資訊,再使用Process32Next獲得下一個程序,重複以上步驟。
最後當Process32Next獲取不到程序後,就算將整個程序列表快照遍歷完了,呼叫CloseHandle關閉快照控制代碼即可。
流程圖如下:
下面就是gh0st中,獲取程序列表的程式碼:
01 |
LPBYTE CSystemManager::getProcessList() |
02 |
{ |
03 |
HANDLE hSnapshot = NULL; |
04 |
HANDLE hProcess = NULL; |
05 |
HMODULE hModules = NULL; |
06 |
PROCESSENTRY32 pe32 = {0}; |
07 |
DWORD cbNeeded; |
08 |
char strProcessName[MAX_PATH] = {0}; |
09 |
LPBYTE lpBuffer = NULL; |
10 |
DWORD dwOffset = 0; |
11 |
DWORD dwLength = 0; |