




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、QQ聊天程序的網(wǎng)絡(luò)通信原理盧平(通信工程(2)班E09680220)QQ的通信協(xié)議QQ的通信協(xié)議是一套基于二進(jìn)制數(shù)據(jù)的自己開發(fā)的應(yīng)用層網(wǎng)絡(luò)協(xié)議。其中使用一些公司的加密算法。QQ基本通信協(xié)議支持udp和tcp兩種基本協(xié)議方式。兩種方式的基本數(shù)據(jù)結(jié)構(gòu)是一樣的。只是tcp包多了一個(gè)描述長度的頭部。QQ的通信原理QQ聊天程序采用的是C/S通信模式,即客戶/服務(wù)模式,它把一個(gè)應(yīng)用劃分成功能不同的兩個(gè)部分,分別在不同的計(jì)算機(jī)上運(yùn)行,其中一個(gè)為服務(wù)端程序,用來響應(yīng)和提供固定的服務(wù),一個(gè)為客戶端程序,用來向服務(wù)端提出請求和要求某種服務(wù)。在數(shù)量關(guān)系上,通常,也有一對(duì)多的(即一個(gè)服務(wù)有一對(duì)一的(即一個(gè)服務(wù)端程序和
2、一個(gè)客戶端程序之間通信)端程序和多個(gè)客戶端程序之間通信),也有多對(duì)多的(即多個(gè)服務(wù)端程序和多個(gè)客戶端程序之間通信)。所謂服務(wù)端程序、客戶端程序也是相對(duì)的概念,有時(shí)在一個(gè)程序中既有服務(wù)端又有客戶端的功能。QQ聊天程序分成了兩個(gè)程序,一個(gè)安裝在騰訊公司的服務(wù)器上,我們稱之為服務(wù)端程序,一個(gè)安裝在QQ用戶的計(jì)算機(jī)上,我們稱之為客戶端程序。在許多介紹網(wǎng)絡(luò)通信編程的書籍中有關(guān)網(wǎng)絡(luò)聊天的例子,當(dāng)一個(gè)客戶要與另一個(gè)客戶聊天時(shí),第一個(gè)客然后服務(wù)器再把聊天數(shù)據(jù)轉(zhuǎn)發(fā)給第二個(gè)客戶,服務(wù)器還能承受,在客戶數(shù)量比較多時(shí),服務(wù)器肯定要服務(wù)器好像一戶先把聊天數(shù)據(jù)發(fā)送給服務(wù)器,個(gè)中轉(zhuǎn)站,這在客戶數(shù)量比較少時(shí),癱瘓。何況客戶之
3、間還要傳送文件、語音聊天、視頻聊天等等,為了減少服務(wù)器的壓力,各客戶端之間需要直接通信。1。在服務(wù)端和客戶端之間(一對(duì)多)用于客戶端程序登錄,驗(yàn)證用戶密碼,獲取其它在線好友信息等等。2。在客戶端和客戶端之間(多對(duì)多)用于在線好友間直接通信聊天。此時(shí)每個(gè)客戶端程序上既有實(shí)現(xiàn)服務(wù)端功能的部分,又有實(shí)現(xiàn)客戶端功能的部分,前者用于接收聊天數(shù)據(jù),后者用于發(fā)送聊天數(shù)據(jù)。在用C/S模式進(jìn)行通信時(shí),作為客戶端在請求與服務(wù)端連接時(shí)需要知道服務(wù)端的IP地址,騰訊公司的服務(wù)器具有固定的公網(wǎng)地址,這沒有問題。但是在客戶端和客戶端之間通信時(shí),每個(gè)用戶的IP地址都是ISP所給的臨時(shí)地址,無法固定,那么某個(gè)用戶要與另一個(gè)用
4、戶連接時(shí),怎么知道對(duì)方的IP地址呢?當(dāng)一個(gè)用戶連接到Internet后,獲得了一個(gè)臨時(shí)的公網(wǎng)地址,當(dāng)?shù)卿浀絈Q時(shí),QQ服務(wù)端會(huì)獲得該上線用戶的IP地址,然后告知其他要與該上線用戶聊天的用戶,其他用戶就可以連接該用戶與之直接通信了。在Win32平臺(tái)上,對(duì)于眾多的基層網(wǎng)絡(luò)協(xié)議,Winsock是訪問它們的首選接口。如果想從頭開發(fā)一個(gè)網(wǎng)絡(luò)通信應(yīng)用程序,TCP/IP就是首選協(xié)議之一。為了保證可靠的數(shù)據(jù)傳輸,宜選擇TCP協(xié)議。在開發(fā)工具方面,VC是我的首選,但VB可能擁有更多的使用者,所以VC的的讀者要將其我用VB6。0作為開發(fā)工具編程實(shí)現(xiàn),以便更多的讀者能夠理解。喜歡轉(zhuǎn)化成VC下的代碼也很容易。在VB中
5、有一個(gè)Winsock控件,它為VB網(wǎng)絡(luò)編程提供了一條便捷的途徑。QQ的登陸驗(yàn)證過程首先QQ客戶端向服務(wù)器發(fā)送一個(gè)請求登錄令牌的數(shù)據(jù)包,服務(wù)器返回登錄令牌。這個(gè)令牌是在服務(wù)器端生成的,和客戶端的IP地址,版本信息等數(shù)據(jù)相關(guān)。以后會(huì)用到這個(gè)令牌去進(jìn)行其他操作。在QQ客戶端得到登錄令牌之后。就會(huì)向服務(wù)器發(fā)送一個(gè)包含登錄信息的登錄請求,要求登錄。服務(wù)順會(huì)首先看看客戶端的號(hào)碼,守址和版本是否可以在本服務(wù)器上,就驗(yàn)證客戶端的登錄信息是否與服務(wù)器上保存的登錄信息進(jìn)行比較,匹配的就向客戶端返回一個(gè)登錄成功的數(shù)據(jù)包;不匹配返回登錄失敗。因?yàn)檫M(jìn)行登錄。如果可以的話QQ的服務(wù)器有很多臺(tái),可能要分管不同的QQ版本、I
6、P等。所以如果客戶端的號(hào)碼、IP地址和版本無法在本服務(wù)器進(jìn)行登錄,服務(wù)器就返回一個(gè)重定向包,讓客戶端去另外一臺(tái)服務(wù)器登錄。實(shí)整個(gè)QQ登錄過程就是這么簡單的兩個(gè)步驟。(1)監(jiān)聽先在窗體上加一個(gè)Winsock控件,名稱設(shè)為“WinsockServer”。由于服務(wù)端需要和所有客戶端通信,需要很多Winsock控件,因此把剛加入的Winsock控件WinsockServer改為數(shù)組,只要將Winsock控件的Index屬性設(shè)為0即可,此時(shí)個(gè)元素,以后可根據(jù)需要?jiǎng)討B(tài)增減。當(dāng)窗體載入時(shí),只會(huì)創(chuàng)建WinsockServer數(shù)組只有一WinsockServer(O)這一個(gè)Winsock控件實(shí)例。作為服務(wù)端程序
7、,WinsockServer(O)作為監(jiān)聽首先要有一個(gè)Winsock用于監(jiān)聽客戶端的連接請求,自然就用Winsock,所以先要設(shè)置其通信協(xié)議為TCP,然后設(shè)置本地端口,以便客戶端通過該端口與服務(wù)端連接,最后通過PrivateSubForm_Load()ConDB自定義函數(shù)WinsockServer(0)。WinsockServer(0)。WinsockServer(0)。EndSub(2)請求與服務(wù)端程序建立連接ConDB用于和存儲(chǔ)用戶信息的數(shù)據(jù)庫連接,具體實(shí)現(xiàn)見源程序。Listen方法監(jiān)聽。Protocol=sckTCPProtocol設(shè)置通信協(xié)議為LocalPort=8888設(shè)置本地端口L
8、isten監(jiān)聽當(dāng)用戶輸入用戶名和密碼單擊登錄按鈕后,在用戶機(jī)上的客戶端程序所做的事情是先請求與服務(wù)端程序建立連接,這需要先在客戶端程序的登錄窗體上加一個(gè)稱設(shè)為“WinsockClient”。然后設(shè)置通信協(xié)議,要連接的服務(wù)器TCPWinsock控件,名IP地址,遠(yuǎn)程端口號(hào)要與服務(wù)端監(jiān)聽所設(shè)置的本地端口一致,最后通過Connect方法請求與服務(wù)端程序建立連接。PrivateSubCommand1_Click()單擊登錄按鈕事件WinsockClient。Protocol=WinsockClient。RemoteHostsckTCPProtocol設(shè)置通信協(xié)議為=127。0。0。1要設(shè)置正確的服務(wù)器
9、TCPIP地址WinsockClient。RemotePort=8888遠(yuǎn)程端口WinsockClient。Connect請求與服務(wù)端程序建立連接EndSub(3)接受客戶端程序連接請求當(dāng)客戶端請求與服務(wù)端程序建立連接時(shí),處于監(jiān)聽狀態(tài)的服務(wù)端會(huì)收到消息觸發(fā)ConnectionRequest事件,所以服ConnectionRequest事件方法中完成。個(gè)Winsock控件與該客戶端通信由于端程序接受客戶端程序連WinsockServer(O)專用于監(jiān)聽,所以要新加載一了保留每個(gè)在線客戶的信息,我定義了一個(gè)OnlineUserInfo,它和Winsock控件數(shù)組相對(duì)應(yīng),WinsockServer(
10、i)通信客戶端的信息,其中OnlineUserInformation結(jié)構(gòu)類型的數(shù)組比如OnlineUserInfo(i)中存放的是與OnlineUserInfo(i)。bUsed表示W(wǎng)insockServer(i)控件是否已被載入在與某個(gè)客戶端通信WinsockServer(i)控件動(dòng)態(tài)載入,隨后調(diào)用MaxOnlineUser是一個(gè)常量,表示最大在線用戶數(shù)量。使用,如未使用,則通過Load方法將Accept方法接受客戶端程序連接請求。其中TypeOnlineUserInformationbUsedAsBoolean對(duì)應(yīng)下標(biāo)的Winsock控件是否已被載入在用UserIDAsString對(duì)應(yīng)的用
11、戶IDIPAddrAsString對(duì)應(yīng)的客戶機(jī)IP地址bLoginedAsBoolean對(duì)應(yīng)的用戶是否登錄EndTypeQQ密碼的破解:QQ密碼相關(guān)的DOODOOQQ密碼來說,最重要的就是這個(gè)登錄包。在這里包含了和信息。QQ登錄包里面還有一些諸如登錄狀態(tài),登錄令版和很其中初始密鑰是一個(gè)16字節(jié)的隨機(jī)數(shù)加密的一個(gè)空字符串。所謂密碼密鑰就是用QQ口呤進(jìn)行兩次鑰去加密一個(gè)空字符串,這次加密使用了反饋的器去驗(yàn)證,由于qqo加密算法使用特殊的填充機(jī)制使用正確,這個(gè)會(huì)在后面進(jìn)行詳細(xì)的解釋。,用于本身的加密。這里最重要的就是密碼密鑰MD5加密后得到的密文,然后以這個(gè)密文作為密TEA算法,加密結(jié)果放在QQ登錄
12、包里,讓服務(wù)QQ服務(wù)器可以驗(yàn)證出用戶密碼是否多未知的內(nèi)容。但是這些對(duì)于我們破解QQ密碼來說都沒有什么太大的作用。需要特別提到的是,前面的請求登錄令牌包是不加密的,而這個(gè)登錄包除了初始密鑰本身以外的部分都要用初始密鑰進(jìn)行加密,加密算法同樣是反饋的TEA。QQ服務(wù)器在收到這個(gè)登錄包之后,首先要用初始密鑰解密登錄包后面的部分,如果解密成功,就會(huì)用保存在服務(wù)器上的密信息去解密密碼密鑰加密的那個(gè)空字符串密文,我現(xiàn)在還不確定QQ服務(wù)器上保存的是密碼明文還是密碼密鑰。猜測是密碼密鑰。這樣服務(wù)器就用密碼密鑰去解密那段16位密文,如果用戶提交的密碼是正確的。才可以解密成功。否則解密函數(shù)會(huì)返回空,認(rèn)證就失敗了。當(dāng)
13、驗(yàn)證QQ客戶端密碼準(zhǔn)確無誤后。就返回一個(gè)登錄成功包。QQ的加密算法了解了上面的QQ登錄的通信協(xié)議之后還不足以破解QQ密碼,我們還需要掌握QQ的加密算法。前面提到了,密碼密鑰是用戶密碼進(jìn)行兩次MD5加密之后得到的結(jié)果。然后再用空個(gè)結(jié)果作為密鑰使用TEA算法進(jìn)行加密。TEAOTinyEncryptArithmetic的縮寫。顧名思義就是一種比較簡單的小型加密算法。它用一個(gè)16字節(jié)的密鑰去加密一個(gè)8字節(jié)的明文。得到一個(gè)8字節(jié)的密文。也可以反向從密文解密出明文。具體的算法可以到網(wǎng)上搜索查閱。這里就不在贅述了。但是QQ使用的TEADOODOOTEADOOQQ卻使用了一種自己特殊的填充反饋機(jī)制,QQ消息被
14、分為多個(gè)加密單元。每一個(gè)加密單元都O8字節(jié)。使用TEA進(jìn)行加密。加密結(jié)果再作為下一個(gè)單元的密鑰。如果明文本身的長度不O8的倍數(shù)。那么還要進(jìn)行填充。使其成為8的倍數(shù)。填充的時(shí)候會(huì)用一個(gè)32位隨機(jī)數(shù)存放于明文的開始位置。再在明文的最后用0填充為整個(gè)長度是8的倍數(shù)。由于會(huì)向后反饋這樣即使對(duì)于相同的明文,因?yàn)槭褂昧瞬煌碾S機(jī)數(shù)。也會(huì)產(chǎn)生完全不同的密文。使用這種特殊的填充反饋算法所導(dǎo)致的結(jié)果就是,一段密文只能用加密它的密鑰進(jìn)行解密。如果使用不正確的密鑰。就無法得到正確的填充結(jié)果。最常見的就是解密后得到的填充數(shù)值不是0,這樣就判斷解密失敗。服務(wù)器正式根據(jù)這種機(jī)制來確定客戶端口的密碼是否正確的。這也是我們破
15、解QQ密的原理所在。窮舉破解QQ密碼有了以上的思路。只要寫出程序就可以實(shí)現(xiàn)QQ密碼的破解了。首先是抓包。可以使用winpcap來抓包。這樣在HUB環(huán)境下可以抓到所有的QQ包。在交換環(huán)境中。我們可以使用一些ARP欺騙工具。同樣可以抓到特定IP所發(fā)出的包。還有QQ的加密算法的實(shí)現(xiàn)。參考網(wǎng)上的perl-oicq和lumaqq等代碼也可以輕易實(shí)現(xiàn)。然后用字典或者暴力破解的方法對(duì)密文進(jìn)行解密即可。解密的過程用偽代碼表示如下:結(jié)果=decrypt(密文,MD5(MD5(密碼),如果結(jié)果不為空的時(shí)候就是正確的密碼。QQ的聊天(1)發(fā)送信息。一般而言,QQ最主要的功能就是聊天。這樣傳送數(shù)據(jù)就是其中的一個(gè)重要途
16、徑。在QQ用戶發(fā)送聊天數(shù)據(jù)以前,需要在列表框中選擇與之通信的好友信息如ID及IP地址等。而當(dāng)服務(wù)器程序根據(jù)所選好友的具體位置以及列表框中找到有關(guān)控件數(shù)據(jù)下標(biāo)值,其實(shí)也就是目標(biāo)ID及IP、時(shí)間、內(nèi)容等分別宣示于發(fā)送端的聊天窗口中,進(jìn)而實(shí)現(xiàn)聊天雙方信息的交換。(2)接收信息。如前面所述,接收信息成為了QQ的又一重要途徑。一般情況下,QQ用戶在接收時(shí),都會(huì)逐一讀取每條聊天的數(shù)據(jù)資料,并根據(jù)發(fā)送方的IP地址以及所在數(shù)組中找到發(fā)送方的ID,然后再利用自定義的方式與過程,把發(fā)送信息方的聊天雙方的ID及IP、時(shí)間、內(nèi)容等顯示在接收端的聊天窗口中。QQ文件/自定義表情傳送大家都知道,QQ可以傳送文件,可以發(fā)送
17、自定義表情。先說官方表情。官方表情實(shí)際發(fā)送的是命令字,而沒有發(fā)送表情??蛻舳耸盏矫钭趾?,會(huì)自動(dòng)解釋為對(duì)應(yīng)的表情。因此,QQ2012正式版的客戶端發(fā)出的新版表情,在就無法解釋,看到的就會(huì)是空白信息,但查聊天記錄就會(huì)有QQ2011及以前的版本無法找到相對(duì)應(yīng)的表情,表情字樣。自定義表情的傳送是以文件傳輸方式進(jìn)行的。下面說文件傳輸方式:A要向B發(fā)送一個(gè)文件,于是發(fā)出一個(gè)文件傳送請求。服務(wù)器收到這個(gè)文件傳送請求后,轉(zhuǎn)發(fā)給B,同時(shí)或者在B應(yīng)答后,將A的IP地址同時(shí)發(fā)送給B。這個(gè)時(shí)候就得到了A的真實(shí)IP。這里的IP是你的本機(jī)IP。也就是說,如果A處在內(nèi)網(wǎng),得到的地址就是一個(gè)內(nèi)網(wǎng)地址。B得到了A的地址之后,
18、就會(huì)嘗試去連接A。如果B0D0內(nèi)網(wǎng),那么,顯然A跟B之間的連接是無法建立的。這個(gè)時(shí)候,客戶端就會(huì)請求服務(wù)器進(jìn)行文件中轉(zhuǎn)。因?yàn)榉?wù)器具有公網(wǎng)IP,處在內(nèi)網(wǎng)的A跟B都是可以連接到服務(wù)器的,于是,跟B的文件傳送就通過服務(wù)器中轉(zhuǎn)的方式,順利進(jìn)行。QQ是一個(gè)基于那么QQ是如何通訊的呢?在TCP/UDP協(xié)議的通訊軟件,而TCP/IP協(xié)議中,唯一標(biāo)識(shí)一個(gè)應(yīng)用進(jìn)程的是MSN000TCP協(xié)議的通訊軟件。socket,它通過網(wǎng)絡(luò)層的IP地址和傳輸層的端口號(hào)來實(shí)現(xiàn),對(duì)與同一個(gè)IP地址的內(nèi)部網(wǎng)絡(luò),通過不同的端口號(hào)來標(biāo)識(shí)不同的QQ進(jìn)程;當(dāng)你登陸QQ游戲服務(wù)器的時(shí)候,服務(wù)器會(huì)保留你的保留IP地址和端口號(hào)信息,并在你的好友的QQ進(jìn)程中進(jìn)行列表顯示,然后兩個(gè)進(jìn)程就可以通信了。通常,發(fā)送文件的計(jì)算機(jī)首先要通過消息服務(wù)器將其IP地址發(fā)送給接收計(jì)算機(jī),當(dāng)接收計(jì)算機(jī)同意接收的確認(rèn)消息反饋到消
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建護(hù)坡加固施工方案
- 房屋買賣合同預(yù)售合同
- 中華傳統(tǒng)美文鑒賞教學(xué)方法:古詩解析與創(chuàng)作訓(xùn)練
- 屋面漏水導(dǎo)流施工方案
- 阜陽別墅木屋施工方案
- 接戶線施工方案
- 塔吊安裝專項(xiàng)施工方案
- 漢口閣樓安裝施工方案
- 鍋爐除渣干式排渣施工方案
- 年產(chǎn)12000噸聚羧酸高性能減水劑復(fù)配液及3000噸水泥助磨劑復(fù)配液項(xiàng)目環(huán)評(píng)報(bào)告表
- 2024年全國英語競賽《B類英語專業(yè)》初賽試題真題及答案
- 小學(xué)生中國舞課件大全
- 2025年南京信息職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫完整
- 《Spring框架》教學(xué)課件
- 2025年中考英語時(shí)文閱讀 6篇有關(guān)電影哪吒2和 DeepSeek的英語閱讀(含答案)
- 客戶溝通技巧與客戶投訴處理培訓(xùn)課件
- 完整版臨時(shí)用水用電施工方案
- 江蘇省南通市2025屆高三第一次調(diào)研測試數(shù)學(xué)試題(南通一模)(含答案)
- 【課件】進(jìn)出口貨物報(bào)關(guān)單填制
- Codesys培訓(xùn)課件教學(xué)課件
- 2024-2030年中國菊粉行業(yè)發(fā)展?fàn)顩r及競爭力研究報(bào)告
評(píng)論
0/150
提交評(píng)論