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

gh0st原始碼分析與遠控的編寫(三)

好久不見。距離上次寫gh0st來有好久了,一是期末考試,忙不開,二是後來電腦壞了,幾天沒能上網。

    昨天總算是把電腦修好了,雖說沒到一切重頭開始的地步,但是也重灌各種東西花了很久。閒下來的時間,我就來繼續分析gh0st的原始碼吧。

    上次我們把gh0st的上線給研究了一下,跟著老狼的視訊,繼續我們的步伐。開始實現gh0st中具體的功能。最簡單的一個是“終端管理”,就是一個cmdshell。

    什麼是cmdshell,相當於是一個cmd命令列的後門,我在主控端中寫下cmd命令,然後傳給被控端,被控端執行後將結果再發給主控端。

    這是整個遠控中比較簡單的部分,我們從被控端開始看起:(原始碼在附件中可以下載)


    在MainDll工程中,開啟類檢視,找到CShellManager這個類,這就是我們“終端管理”功能用到的類。

    在看程式碼之前,我先說一下cmdshell的原理。為什麼我們這個程式能執行cmd命令並且把執行結果得到並返回。這裡用到管道技術,管道是為了程序間通訊而存在的,如下圖:

    03.jpg

    我們在gh0st程序中,開啟一個cmd程序,並使用管道,向cmd.exe傳送資訊,而cmd.exe也利用管道將資訊傳送給gh0st的程序。管道通訊又分三種,雙管道、單管道與無管道。gh0st裡面用的雙管道後門,也就是說,我們在gh0st.exe和cmd.exe之間建立了兩根傳輸資料的管道,原因可想而知:a管道接受gh0st的命令,併發送給cmd,b管道接受cmd的執行結果,併發送給gh0st。

    理解了這個就方便了。首先看到它的建構函式:

01 if (!CreatePipe(&m_hReadPipeShell, &m_hWritePipeDll, &sa, 0)) //該管道為程式寫,cmd讀
02 {
03
    CloseHandle(m_hReadPipeShell);
04     CloseHandle(m_hWritePipeDll);
05     return ;
06 }
07  
08 if (!CreatePipe(&m_hReadPipeDll, &m_hWritePipeShell, &sa, 0)) //該管道為cmd寫,程式讀
09 {
10     CloseHandle(m_hReadPipeDll);
11     CloseHandle(m_hWritePipeShell);
12 }

    建立了兩根管道,使用的API就是CreatePipe,m_hReadPipeShell其實就是一個控制代碼。CreatePipe這個API前兩個引數是該管道的讀控制代碼和寫控制代碼。讀控制代碼就是該管道的入口,寫控制代碼就是該管道的出口。管道這個名字很恰當,就像一根管子,資料從一個方向流入,從另一個方向流出。


    sa是安全屬性的一個結構,沒有太大作用,初始化一下傳入地址進去就行了。

    再往下看,

相關推薦

gh0st原始碼分析編寫()

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

gh0st原始碼分析編寫(一)

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

gh0st原始碼分析編寫(四)

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

gh0st原始碼分析編寫(二)

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

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

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

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

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

XSS的原理分析解剖:第章(技巧篇)**************未看*****************

第二章 != chrom 插入 是把 調用 bject innerhtml ats ??0×01 前言: 關於前兩節url: 第一章:http://www.freebuf.com/articles/web/40520.html 第二章:http://www.free

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_list.c)

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

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

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

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

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

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

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

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

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

《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基於前面幾篇部落格的資料結構自建了一套物件系統。這個系統包含著字串物件、列表物件、雜湊物件、集合物件以及有序集合物件。