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

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



    再過幾天期末考試了,還有好多要複習。。蛋都快碎了。最近在看老狼的gh0st核心程式設計,想了很久要不要寫文章,最後還是覺得很有必要,原因過一會講。

    先送上老狼的gh0st無加密(lxe格式)視訊下載地址:

    http://phith0n.400gb.com/u/29415/3193732

    其中包含的gh0st原始碼(亂七八糟的被我的卡巴斯基殺過一遍,僅僅是原始碼):http://www.400gb.com/file/23820009

    在寫東西前我要說一下,我雖然說研究遠控的原始碼,但我告訴你我以前包括以後從未也從不想使用遠控來控制中國人的電腦。我希望你們大家也一樣,僅僅只是對程式設計感興趣,而不是為了違法的目的去使用程式碼。


    好了,進入主題。老狼的gh0st核心程式設計教程,我認為是國內絕無僅有的一套比較全的遠控編寫的教程,它很詳細,基本上就是教你重新打造一款遠控,使用gh0st核心。

    但是為什麼我還要寫這一套文章,既然教程都有了。我認為這套教程有一些很致命的問題:

    1.不想吐槽老狼英語口語水平

    2.老狼在教程伊始沒有系統地給大家介紹遠控的概念。什麼是服務端,什麼是客戶端之類的問題。(好像老狼在他之前其他教程裡講過,但在網上傳的最多的只有這個教程,所以很多朋友看教程的時候還是一知半解)

    3.主控端程式碼在vs2010中編寫,但被控端程式碼卻在古老的VC6下建立。不知道老狼為什麼這麼做,使用VC6還得下載sdk。所以我在編寫的時候,是將主控端、被控端這些工程放在VS2010下同一個解決方案中,方便程式碼的管理。

    4.老狼的程式碼與教程有一些錯誤,而且他遇到問題、解決問題的方法不太符合面向物件的思想,還有些問題的解決只是解決了表面的問題,並沒有真正找到問題的根源。這也是很多軟體漏洞多發的關鍵,一個漏洞如果不從根源上修復,可能在其他程式碼中存在一個新的漏洞。

    5.教程中很多地方(可以說大部分地方)只是複製的gh0st程式碼,並沒有詳細的講解。

    當然這只是我的見解,不是說我可以做的更好,只是我在學習過程中發現的問題。我的能力不可能做出這樣一套完善的教程,我寫文章的目的只是像一個批註,在大家觀看教程的過程中給大家一點幫助。我的文章不能替代老狼的教程。

    

    在這裡,先給大家一個大局觀:gh0st是什麼,大概原理是什麼。

    gh0st是一款基於C/S架構的遠端管理軟體(我只是就事論事,不想討論C/S架構過時或不過時)。所謂遠端管理,就是我在我的電腦上通過一些手段,可以操作其他電腦。什麼是C/S架構,C表示Client,S表示Server,也就是客戶端和服務端的意思。可以這樣理解C/S,現在有兩臺電腦,一臺是Server,一臺是Client,server電腦就會開啟一個埠,並一直監聽這個埠中的資訊。client來連線這個埠,連線成功後,兩臺機器就能互相傳送資訊了。(具體的原理建議大家去看socket通訊)

    gh0st用的是C/S架構中的反向連線。我用主控端和被控端來稱呼黑客的電腦和肉雞的電腦。反向連線的意思就是我主控端作為server,被控端作為client,主控端監聽一個固定的埠,並有一個固定的IP。然後被控端來連線這個IP的該埠,這就是所謂的上線。

    在實際情況中,黑客的電腦並不是都有固定的IP,我在我們寢室使用的是一個路由器,於是我的IP只是內網IP,192.168.x.x。而且,如果我換一個地方上網,IP也會變。這樣我的被控端是找不到我的IP的。所以很多遠控對待該問題,有兩個解決方案:

    1.DNS上線

    花生殼、3322提供了免費的動態域名服務,其實就是提供了DNS服務。我們把自己的IP繫結到DNS伺服器上,被控端通過對DNS的解析,找到主控端的IP,再連線。下次換地方上網了,只需要更改自己繫結到DNS上的IP即可。

    2.FTP(HTTP)上線

    我們把自己的IP寫入一個文字檔案1.txt,放在ftp(http)伺服器上,比如ftp://leavesongs.com/1.txt。被控端去下載該txt,在其中找到主控端的IP。再連線。

    當然gh0st對他們都是支援的。

    再講講gh0st這個軟體的組成。老狼給的gh0st最終編譯好就是一個exe檔案,點選開啟後是一個主控端的樣子:

    20130510_173103.jpg

    在build選項卡中,填好相關資訊,可以生成一個exe檔案,這就是所謂的被控端。

    但是我們開啟原始碼看,其實它是主要由三個部分組成,一是帶介面的主控端,一個是動態連結庫dll,一個是載入dll的exe。我們被控端的所有功能都是寫在dll當中的。而並不是寫在exe檔案中。


    大局觀大概就是這些。再說一下gh0st核心內容。

    在傳輸資料方面,主控端使用IOCP模型,關於該模型請google。在主控端中,由CIOCPServer類實現。在被控端中,資料傳輸使用CClientSocket類實現。資料傳輸是遠控的核心,所以這兩個類也就成了gh0st的核心類。當然,在傳輸過程中,gh0st使用zlib進行壓縮,減小資料包的大小。

    在被控端管理方面,gh0st使用了一個很好的方案。先做了一個CManager類,作為所有管理功能的基類,其他的比如系統管理類CSystenManager就繼承了CManager。大大地增加了程式碼的重用性。

    在主控端方面,有這樣一個回撥函式NotifyProc,所有被控端發來的訊息,都會經過此函式,在該函式中使用switch語句,處理各個訊息。使得程式碼看起來井井有條。

    在穩定性方面,被控端宿主為svchost以系統服務啟動,並有守護執行緒,用心跳包機制防止以外掉線。


    說了半天了……西安這又是一個炎熱的下午。希望你能看懂我的文章,並對遠控有一個更深的理解。下次我會開始寫一些gh0st的原始碼,和老狼視訊裡一些難以理解的地方。再次強調,本文不能替代老狼的視訊,想學習的同學務必認真地看老狼的教程,你會受益良多。

    再過幾天期末考試了,還有好多要複習。。蛋都快碎了。最近在看老狼的gh0st核心程式設計,想了很久要不要寫文章,最後還是覺得很有必要,原因過一會講。

    先送上老狼的gh0st無加密(lxe格式)視訊下載地址:

    http://phith0n.400gb.com/u/29415/3193732

    其中包含的gh0st原始碼(亂七八糟的被我的卡巴斯基殺過一遍,僅僅是原始碼):http://www.400gb.com/file/23820009

    在寫東西前我要說一下,我雖然說研究遠控的原始碼,但我告訴你我以前包括以後從未也從不想使用遠控來控制中國人的電腦。我希望你們大家也一樣,僅僅只是對程式設計感興趣,而不是為了違法的目的去使用程式碼。


    好了,進入主題。老狼的gh0st核心程式設計教程,我認為是國內絕無僅有的一套比較全的遠控編寫的教程,它很詳細,基本上就是教你重新打造一款遠控,使用gh0st核心。

    但是為什麼我還要寫這一套文章,既然教程都有了。我認為這套教程有一些很致命的問題:

    1.不想吐槽老狼英語口語水平

    2.老狼在教程伊始沒有系統地給大家介紹遠控的概念。什麼是服務端,什麼是客戶端之類的問題。(好像老狼在他之前其他教程裡講過,但在網上傳的最多的只有這個教程,所以很多朋友看教程的時候還是一知半解)

    3.主控端程式碼在vs2010中編寫,但被控端程式碼卻在古老的VC6下建立。不知道老狼為什麼這麼做,使用VC6還得下載sdk。所以我在編寫的時候,是將主控端、被控端這些工程放在VS2010下同一個解決方案中,方便程式碼的管理。

    4.老狼的程式碼與教程有一些錯誤,而且他遇到問題、解決問題的方法不太符合面向物件的思想,還有些問題的解決只是解決了表面的問題,並沒有真正找到問題的根源。這也是很多軟體漏洞多發的關鍵,一個漏洞如果不從根源上修復,可能在其他程式碼中存在一個新的漏洞。

    5.教程中很多地方(可以說大部分地方)只是複製的gh0st程式碼,並沒有詳細的講解。

    當然這只是我的見解,不是說我可以做的更好,只是我在學習過程中發現的問題。我的能力不可能做出這樣一套完善的教程,我寫文章的目的只是像一個批註,在大家觀看教程的過程中給大家一點幫助。我的文章不能替代老狼的教程。

    

    在這裡,先給大家一個大局觀:gh0st是什麼,大概原理是什麼。

    gh0st是一款基於C/S架構的遠端管理軟體(我只是就事論事,不想討論C/S架構過時或不過時)。所謂遠端管理,就是我在我的電腦上通過一些手段,可以操作其他電腦。什麼是C/S架構,C表示Client,S表示Server,也就是客戶端和服務端的意思。可以這樣理解C/S,現在有兩臺電腦,一臺是Server,一臺是Client,server電腦就會開啟一個埠,並一直監聽這個埠中的資訊。client來連線這個埠,連線成功後,兩臺機器就能互相傳送資訊了。(具體的原理建議大家去看socket通訊)

    gh0st用的是C/S架構中的反向連線。我用主控端和被控端來稱呼黑客的電腦和肉雞的電腦。反向連線的意思就是我主控端作為server,被控端作為client,主控端監聽一個固定的埠,並有一個固定的IP。然後被控端來連線這個IP的該埠,這就是所謂的上線。

    在實際情況中,黑客的電腦並不是都有固定的IP,我在我們寢室使用的是一個路由器,於是我的IP只是內網IP,192.168.x.x。而且,如果我換一個地方上網,IP也會變。這樣我的被控端是找不到我的IP的。所以很多遠控對待該問題,有兩個解決方案:

    1.DNS上線

    花生殼、3322提供了免費的動態域名服務,其實就是提供了DNS服務。我們把自己的IP繫結到DNS伺服器上,被控端通過對DNS的解析,找到主控端的IP,再連線。下次換地方上網了,只需要更改自己繫結到DNS上的IP即可。

    2.FTP(HTTP)上線

    我們把自己的IP寫入一個文字檔案1.txt,放在ftp(http)伺服器上,比如ftp://leavesongs.com/1.txt。被控端去下載該txt,在其中找到主控端的IP。再連線。

    當然gh0st對他們都是支援的。

    再講講gh0st這個軟體的組成。老狼給的gh0st最終編譯好就是一個exe檔案,點選開啟後是一個主控端的樣子:

    20130510_173103.jpg

    在build選項卡中,填好相關資訊,可以生成一個exe檔案,這就是所謂的被控端。

    但是我們開啟原始碼看,其實它是主要由三個部分組成,一是帶介面的主控端,一個是動態連結庫dll,一個是載入dll的exe。我們被控端的所有功能都是寫在dll當中的。而並不是寫在exe檔案中。


    大局觀大概就是這些。再說一下gh0st核心內容。

    在傳輸資料方面,主控端使用IOCP模型,關於該模型請google。在主控端中,由CIOCPServer類實現。在被控端中,資料傳輸使用CClientSocket類實現。資料傳輸是遠控的核心,所以這兩個類也就成了gh0st的核心類。當然,在傳輸過程中,gh0st使用zlib進行壓縮,減小資料包的大小。

    在被控端管理方面,gh0st使用了一個很好的方案。先做了一個CManager類,作為所有管理功能的基類,其他的比如系統管理類CSystenManager就繼承了CManager。大大地增加了程式碼的重用性。

    在主控端方面,有這樣一個回撥函式NotifyProc,所有被控端發來的訊息,都會經過此函式,在該函式中使用switch語句,處理各個訊息。使得程式碼看起來井井有條。

    在穩定性方面,被控端宿主為svchost以系統服務啟動,並有守護執行緒,用心跳包機制防止以外掉線。


    說了半天了……西安這又是一個炎熱的下午。希望你能看懂我的文章,並對遠控有一個更深的理解。下次我會開始寫一些gh0st的原始碼,和老狼視訊裡一些難以理解的地方。再次強調,本文不能替代老狼的視訊,想學習的同學務必認真地看老狼的教程,你會受益良多。