gh0st源码分析与远控的编写(一)
? ? 再過幾天期末考試了,還有好多要復(fù)習(xí)。。蛋都快碎了。最近在看老狼的gh0st內(nèi)核編程,想了很久要不要寫文章,最后還是覺得很有必要,原因過一會(huì)講。
? ? 先送上老狼的gh0st無加密(lxe格式)視頻下載地址:
????http://phith0n.400gb.com/u/29415/3193732
? ? 其中包含的gh0st源碼(亂七八糟的被我的卡巴斯基殺過一遍,僅僅是源碼):http://www.400gb.com/file/23820009
????在寫東西前我要說一下,我雖然說研究遠(yuǎn)控的源碼,但我告訴你我以前包括以后從未也從不想使用遠(yuǎn)控來控制中國人的電腦。我希望你們大家也一樣,僅僅只是對編程感興趣,而不是為了違法的目的去使用代碼。
? ? 好了,進(jìn)入主題。老狼的gh0st內(nèi)核編程教程,我認(rèn)為是國內(nèi)絕無僅有的一套比較全的遠(yuǎn)控編寫的教程,它很詳細(xì),基本上就是教你重新打造一款遠(yuǎn)控,使用gh0st內(nèi)核。
? ? 但是為什么我還要寫這一套文章,既然教程都有了。我認(rèn)為這套教程有一些很致命的問題:
? ? 1.不想吐槽老狼英語口語水平
? ? 2.老狼在教程伊始沒有系統(tǒng)地給大家介紹遠(yuǎn)控的概念。什么是服務(wù)端,什么是客戶端之類的問題。(好像老狼在他之前其他教程里講過,但在網(wǎng)上傳的最多的只有這個(gè)教程,所以很多朋友看教程的時(shí)候還是一知半解)
? ? 3.主控端代碼在vs2010中編寫,但被控端代碼卻在古老的VC6下創(chuàng)建。不知道老狼為什么這么做,使用VC6還得下載sdk。所以我在編寫的時(shí)候,是將主控端、被控端這些工程放在VS2010下同一個(gè)解決方案中,方便代碼的管理。
? ? 4.老狼的代碼與教程有一些錯(cuò)誤,而且他遇到問題、解決問題的方法不太符合面向?qū)ο蟮乃枷?#xff0c;還有些問題的解決只是解決了表面的問題,并沒有真正找到問題的根源。這也是很多軟件漏洞多發(fā)的關(guān)鍵,一個(gè)漏洞如果不從根源上修復(fù),可能在其他代碼中存在一個(gè)新的漏洞。
? ? 5.教程中很多地方(可以說大部分地方)只是復(fù)制的gh0st代碼,并沒有詳細(xì)的講解。
? ? 當(dāng)然這只是我的見解,不是說我可以做的更好,只是我在學(xué)習(xí)過程中發(fā)現(xiàn)的問題。我的能力不可能做出這樣一套完善的教程,我寫文章的目的只是像一個(gè)批注,在大家觀看教程的過程中給大家一點(diǎn)幫助。我的文章不能替代老狼的教程。
????
? ? 在這里,先給大家一個(gè)大局觀:gh0st是什么,大概原理是什么。
? ? gh0st是一款基于C/S架構(gòu)的遠(yuǎn)程管理軟件(我只是就事論事,不想討論C/S架構(gòu)過時(shí)或不過時(shí))。所謂遠(yuǎn)程管理,就是我在我的電腦上通過一些手段,可以操作其他電腦。什么是C/S架構(gòu),C表示Client,S表示Server,也就是客戶端和服務(wù)端的意思。可以這樣理解C/S,現(xiàn)在有兩臺(tái)電腦,一臺(tái)是Server,一臺(tái)是Client,server電腦就會(huì)開啟一個(gè)端口,并一直監(jiān)聽這個(gè)端口中的信息。client來連接這個(gè)端口,連接成功后,兩臺(tái)機(jī)器就能互相發(fā)送信息了。(具體的原理建議大家去看socket通信)
? ? gh0st用的是C/S架構(gòu)中的反向連接。我用主控端和被控端來稱呼黑客的電腦和肉雞的電腦。反向連接的意思就是我主控端作為server,被控端作為client,主控端監(jiān)聽一個(gè)固定的端口,并有一個(gè)固定的IP。然后被控端來連接這個(gè)IP的該端口,這就是所謂的上線。
? ? 在實(shí)際情況中,黑客的電腦并不是都有固定的IP,我在我們寢室使用的是一個(gè)路由器,于是我的IP只是內(nèi)網(wǎng)IP,192.168.x.x。而且,如果我換一個(gè)地方上網(wǎng),IP也會(huì)變。這樣我的被控端是找不到我的IP的。所以很多遠(yuǎn)控對待該問題,有兩個(gè)解決方案:
? ? 1.DNS上線
? ? 花生殼、3322提供了免費(fèi)的動(dòng)態(tài)域名服務(wù),其實(shí)就是提供了DNS服務(wù)。我們把自己的IP綁定到DNS服務(wù)器上,被控端通過對DNS的解析,找到主控端的IP,再連接。下次換地方上網(wǎng)了,只需要更改自己綁定到DNS上的IP即可。
? ? 2.FTP(HTTP)上線
? ? 我們把自己的IP寫入一個(gè)文本文件1.txt,放在ftp(http)服務(wù)器上,比如ftp://leavesongs.com/1.txt。被控端去下載該txt,在其中找到主控端的IP。再連接。
? ? 當(dāng)然gh0st對他們都是支持的。
? ? 再講講gh0st這個(gè)軟件的組成。老狼給的gh0st最終編譯好就是一個(gè)exe文件,點(diǎn)擊打開后是一個(gè)主控端的樣子:
????
? ? 在build選項(xiàng)卡中,填好相關(guān)信息,可以生成一個(gè)exe文件,這就是所謂的被控端。
? ? 但是我們打開源碼看,其實(shí)它是主要由三個(gè)部分組成,一是帶界面的主控端,一個(gè)是動(dòng)態(tài)鏈接庫dll,一個(gè)是加載dll的exe。我們被控端的所有功能都是寫在dll當(dāng)中的。而并不是寫在exe文件中。
? ? 大局觀大概就是這些。再說一下gh0st核心內(nèi)容。
? ? 在傳輸數(shù)據(jù)方面,主控端使用IOCP模型,關(guān)于該模型請google。在主控端中,由CIOCPServer類實(shí)現(xiàn)。在被控端中,數(shù)據(jù)傳輸使用CClientSocket類實(shí)現(xiàn)。數(shù)據(jù)傳輸是遠(yuǎn)控的核心,所以這兩個(gè)類也就成了gh0st的核心類。當(dāng)然,在傳輸過程中,gh0st使用zlib進(jìn)行壓縮,減小數(shù)據(jù)包的大小。
? ? 在被控端管理方面,gh0st使用了一個(gè)很好的方案。先做了一個(gè)CManager類,作為所有管理功能的基類,其他的比如系統(tǒng)管理類CSystenManager就繼承了CManager。大大地增加了代碼的重用性。
? ? 在主控端方面,有這樣一個(gè)回調(diào)函數(shù)NotifyProc,所有被控端發(fā)來的消息,都會(huì)經(jīng)過此函數(shù),在該函數(shù)中使用switch語句,處理各個(gè)消息。使得代碼看起來井井有條。
? ? 在穩(wěn)定性方面,被控端宿主為svchost以系統(tǒng)服務(wù)啟動(dòng),并有守護(hù)線程,用心跳包機(jī)制防止以外掉線。
? ? 說了半天了……西安這又是一個(gè)炎熱的下午。希望你能看懂我的文章,并對遠(yuǎn)控有一個(gè)更深的理解。下次我會(huì)開始寫一些gh0st的源碼,和老狼視頻里一些難以理解的地方。再次強(qiáng)調(diào),本文不能替代老狼的視頻,想學(xué)習(xí)的同學(xué)務(wù)必認(rèn)真地看老狼的教程,你會(huì)受益良多。
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的gh0st源码分析与远控的编写(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL之函数对象
- 下一篇: gh0st源码分析与远控的编写(二)