隨著Internet網(wǎng)絡的普及 , 各個中大型公司均建立了自己的局域網(wǎng)絡 。而公司內(nèi)部人員上網(wǎng)的限制也逐漸成為一個大家關心的話題 。目前最為流行的網(wǎng)絡工具大多是基于TCP/IP協(xié)議的 , 而其中最主要的兩個協(xié)議就是TCP和UDP協(xié)議 。HTTP , FTP等上層協(xié)議均是建立在TCP協(xié)議之上了 , 而DNS , ICQ , TFTP等則是建立在UDP協(xié)議之上的 。往往我們會遇到這樣情況:公司禁止了UDP協(xié)議 , 因為很大一部分的網(wǎng)絡通訊軟件都是建立在UDP協(xié)議之上的 , 而開通了TCP協(xié)議 。這樣 , 我們就可以通過TCP協(xié)議來為我們轉(zhuǎn)發(fā)UDP數(shù)據(jù)報 , 具體實現(xiàn)原理可以參看eyas的《突破TCP-IP過濾/防火墻進入內(nèi)網(wǎng)》 , 里面詳細討論了如何實現(xiàn)TCP與UDP數(shù)據(jù)報之間的相互轉(zhuǎn)發(fā) , 也可以參看本文相關軟件T-QQ的源代碼 , 里面也包含了TCP與UDP相互轉(zhuǎn)發(fā)的功能 , 在此就不多說了 ?,F(xiàn)在進入正題 , 如何實現(xiàn)用ICMP數(shù)據(jù)報來突破網(wǎng)關的限制?
ICMP協(xié)議(Internet Control Messages Protocol, 網(wǎng)際控制報文協(xié)議)是一種多功能的協(xié)議 , 在網(wǎng)絡上有很多用處 , 比如ICMP掃描 , 拒絕服務(Dos)攻擊 , 隧道攻擊 , 以及我們最常用到的PING程序 。而我們就是利用ICMP協(xié)議來為我們傳送(TCP/UDP)數(shù)據(jù) 。大家知道一般的防火墻都是過濾了來自外部主機的回送請求(echo Request)報文 , 但為了是自己能夠探測外部主機的當前狀態(tài) , 防火墻都不會過濾掉回送應答(echo Reply)數(shù)據(jù)報 , 而且ICMP報文可以在廣域網(wǎng)上傳送 , 這樣我們就可以利用它來突破網(wǎng)關的種種限制 。本文主要針對使用ICMP協(xié)議來轉(zhuǎn)發(fā)UDP數(shù)據(jù)報的功能 , 并以OICQ為背景 , 至于突破TCP的限制 , 也大同小異 。
以下是QQicmp的工作原理:----->----- ----->----- ----->-----
QQ客戶端 < UDP > QQicmp(l) < ICMP > QQicmp(g) < UDP >Tencent服務器
-----<----- -----<----- -----<-----其中QQ客戶端和QQicmp(l)都運行在本機上 , 而QQicmp(g)則是運行在網(wǎng)關上(QQicmp(l) 與 QQicmp(g)均是同一程序 , 只是運行模式不同:-l 運行于本地主機 , -g 運行于網(wǎng)關上) , Tencent服務器我想大家都清楚吧 。QQ客戶端與QQicmp(l),QQicmp(g)與Tencent服務器之間以UDP通信 , QQicmp(l)與QQicmp(g)之間則是以ICMP通信 。Win2000/xp都提供了自己構(gòu)造數(shù)據(jù)報的功能 , 也就是我們可以自己定義發(fā)送數(shù)據(jù)報的各項內(nèi)容 , 當然也可以監(jiān)聽通過主機的基于IP協(xié)議的各種數(shù)據(jù)報 。為了發(fā)送ICMP數(shù)據(jù)報及接收所有的IP數(shù)據(jù)報 , 我們必須自定義數(shù)據(jù)報的格式及校驗和的求解:
typedef struct ipheader
{
unsigned char h_lenver; //頭部長度及版本
unsigned char tos; //服務類型
unsigned short total_len; //報文總長度
unsigned short ident; //信息包標志
unsigned short frag_and_flags; //標志及分段偏移量
unsigned char ttl; //生命周期
unsigned char proto; //協(xié)議類型
unsigned short checksum; //IP校驗和
unsigned int sourceip; //源IP地址
unsigned int destip; //目的IP地址
}ipheader;typedef struct icmpheader
{
unsigned char type; //ICMP類型 0->回送應答 8->回送請求
unsigned char code; //代碼
unsigned short checksum; //校驗和
unsigned short seq; //序號
unsigned short id; //標識符
}icmpheader;unsigned short checksum(unsigned short *buffer,int size)
{
unsigned long cksum=0;
while(size>0) //各位求和
{
cksum =*buffer;
size-=sizeof(unsigned short);
}
if(size)
cksum =*(unsigned char *)buffer;
cksum=(cksum>>16) (cksum & 0xffff);
cksum =(cksum>>16);
return (unsigned short)(~cksum); //再求補
}首先 , 我們更改QQ客戶端里的服務器地址為127.0.0.1 , 端口改為QQicmp(l)的監(jiān)聽QQ客戶端端口 , 當然你也可以保持默認的8000 ,
這樣QQicmp(l)就應該在8000端口監(jiān)聽QQ客戶端的數(shù)據(jù) 。
推薦閱讀
- 英華OK OK318短信功能篇
- K750C試飛之無限連接篇
- 小匯m66的缺點
- 商務伴侶,影音隨行--A100之手寫篇
- A728試飛手記-屏幕篇:效果與保護
- 商務伴侶,影音隨行--A100之缺憾篇
- 東信ES1009試飛手記——資料初識篇
- 諾基亞6030購買使用感受
- 軟件篇 索尼愛立信J300C評測
- 東信ES1009試飛手記——ES1009與A780資料對比篇
