1. 程式人生 > >gh0st原始碼分析與遠控的編寫(四)

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關閉快照控制代碼即可。

    流程圖如下:

    gh0st4.png

    下面就是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;

相關推薦

gh0st原始碼分析編寫()

  真的很久很久了,距離上一次寫gh0st的文章(http://www.mmcyy.com),過去有大半年了。總算有一個時間,我放下手裡所有的活,能夠繼續把這份努力延續下去。     以後對於gh0st的文章,就是一個一個模組的分析。原本gh

gh0st原始碼分析編寫(一)

    再過幾天期末考試了,還有好多要複習。。蛋都快碎了。最近在看老狼的gh0st核心程式設計,想了很久要不要寫文章,最後還是覺得很有必要,原因過一會講。     先送上老狼的gh0st無加密(lxe格式)視訊下載地址:

gh0st原始碼分析編寫(三)

好久不見。距離上次寫gh0st來有好久了,一是期末考試,忙不開,二是後來電腦壞了,幾天沒能上網。     昨天總算是把電腦修好了,雖說沒到一切重頭開始的地步,但是也重灌各種東西花了很久。閒下來的時間,我就來繼續分析gh0st的原始碼吧。    

gh0st原始碼分析編寫(二)

上次說了那麼多,基本上就是一個叫“大局觀”的東西,只有腦子裡有了一個軟體的設計、執行思路,才能把一個一個類寫出來,組合在一起。 Gh0st的作者是一個對程式碼有很好掌控的人,他對程式碼的組合,類之間的關係,面向物件的思想有很深入的理解。而對我們看原始碼的人

redis原始碼分析思考(十)——列表型別的命令實現(t_list.c)

    列表型別是用來存貯多個字串物件的結構。一個列表可以存貯232-1個元素,可以對列表兩端進行插入(push)、彈出(pop),還可以獲取指定範圍內的元素列表、獲取指定索引的元素等等,它可以靈活的充當棧和佇列的角色。下面列出列表的命令: 列

Nginx原始碼分析實踐---(一)編寫一個簡單的Http模組

在上一節中,我們通過修改配置檔案,便能讓nginx去訪問我們寫的html檔案,並返回給瀏覽器。問題是:nginx是如何檢測到我們寫的配置項的?檢測到後,nginx又是如何知道該進行什麼操作的? 本節通過親自實踐,寫一個經典的Hello World模組來了解相應的流程是如何進行的。我們採用自上

redis原始碼分析思考(十九)——AOF持久化

    為了解決持久化檔案很龐大以及會阻塞伺服器的 情況,redis提出一種新的持久化方案:AOF持久化。AOF持久化是redis儲存資料的另外一種方式,全稱Append Only File,與RDB持久化不同的是,AOF持久化是隻儲存從客戶端鍵入

redis原始碼分析思考(十八)——RDB持久化

    redis是一個鍵值對的資料庫伺服器,伺服器中包含著若干個非空的資料庫,每個非空資料庫裡又包含著若干個鍵值對。因為redis是一個基於記憶體存貯的資料庫,他將自己所存的資料存於記憶體中,如果不將這些資料及時的儲存在硬碟中,當電腦關機或者進行

redis原始碼分析思考(十七)——有序集合型別的命令實現(t_zset.c)

    有序集合是集合的延伸,它儲存著集合元素的不可重複性,但不同的是,它是有序的,它利用每一個元素的分數來作為有序集合的排序依據,現在列出有序集合的命令: 有序集合命令 命令 對應操作 時

redis原始碼分析思考(十六)——集合型別的命令實現(t_set.c)

    集合型別是用來儲存多個字串的,與列表型別不一樣,集合中不允許有重複的元素,也不能以索引的方式來通過下標獲取值,集合中的元素還是無序的。在普通的集合上增刪查改外,集合型別還實現了多個集合的取交集、並集、差集,集合的命令如下表所示: 集合命

redis原始碼分析思考(十五)——雜湊型別的命令實現(t_hash.c)

    雜湊型別又叫做字典,在redis中,雜湊型別本身是一個鍵值對,而雜湊型別裡面也存貯著鍵值對,其對應關係是,每個雜湊型別的值對應著一個鍵值對或多對鍵值對,如圖所示: 雜湊型別命令 命令 對應操

redis原始碼分析思考(十三)——字串型別的命令實現(t_string.c)

    在對字串操作的命令中,主要有增加刪查該、批處理操作以及編碼的轉換命令,現在列出對字串物件操作的主要常用命令: 常用命令表 命令 對應操作 時間複雜度

SpringBoot SpringApplication底層原始碼分析自動裝配

目錄 丟擲問題 @SpringBootApplication註解剖析 SpringApplication類剖析 第一步:配置SpringBoot Bean來源 第二步 :自動推斷SpringBoot的應用型別 第三步:推斷SpringBoot的引導類 第四

演算法分析設計第十次作業(leetcode中Cherry Pickup題解)

題解正文 題目描述 問題分析 此題給出一個n乘n矩陣,矩陣中值可以是0/1/-1。 要求我們找出從(0,0)出發,到(n-1,n-1),然後回到(0,0)的路徑,要求往程只能向右向下,而返程只能向左向上走,並且路徑沒有經過值為-1的位置。 然後求出符合上述要求的路徑中,所經

第07章 常用類庫API_03_StringBuffer原始碼分析常用方法

在實際開發當中,我們經常會使用到字串連線的操作,如果用String來操作,則使用“+”號完成字串的連線操作。 使用String連線字串,程式碼效能會非常低,應為String的內容不可改變,解決這個問題的方法是使用StringBuffer。     St

String.split(),StringTokenizer,StringUtils.split()的原始碼分析效能比較

他們都是用來對字串進行切割 String.split(): 從jdk1.4開始,通過正則表示式進行字串的匹配切割,有可能會丟擲 PatternSyntaxException異常,返回的是切割之後的字串陣列。 String 的split 有兩個過載的方法分別是

redis原始碼分析思考(三)——字典中鍵的兩種hash演算法

      在Redis字典中,得到鍵的hash值顯得尤為重要,因為這個不僅關乎到是否字典能做到負載均衡,以及在效能上優勢是否突出,一個良好的hash演算法在此時就能發揮出巨大的作用。而一個良好的has

《Spark核心原始碼分析開發實戰》讀書筆記之一

第1章 Spark系統概述 1.1 Spark是什麼 1. Spark比Hadoop快在哪裡 (1)Spark使用記憶體計算,而Hadoop使用IO (2)Hadoop的計算是按部就班一步一步進行的,而Spark則是提前生成了DAG,優化了運算路徑   1.2 Sp

Libevent原始碼分析-----event相關的一些函式和操作

        Libevent提供了一些與event相關的操作函式和操作。本文就重點講一下這方面的原始碼。         在Libevent中,無論是event還是event_base,都是使用指標而不會使用變數。實際上,如果檢視Libevent不同的版本,就可

redis原始碼分析思考(八)——物件

    談及物件,我們不免會立即聯想到Java、C++等面向物件的語言,而在C中是沒有物件這一說法的,為了方便管理與程式碼整體的優化,redis基於前面幾篇部落格的資料結構自建了一套物件系統。這個系統包含著字串物件、列表物件、雜湊物件、集合物件以及有序集合物件。