httptunnel
2007-11-20 10:05
253 查看
// * @author Kamlesh Singh, Copyright (C) 2006, All Rights Reserved
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace HTTP_TUNNEL
{
/// <summary>
/// Summary description for httptunnel.
/// </summary>
public class httptunnel
{
public httptunnel()
{
//
// TODO: Add constructor logic here
//
}
private IPHostEntry proxyentry ;
private IPAddress proxyip ;
private IPEndPoint proxyendpoint;
public static Socket mysocket;
public socket createHttpTunnel(string proxyipadd,string port,string struid,string strpwd,string destip,string destport)
{
proxyentry = Dns.Resolve(proxyipadd);
proxyip = proxyentry.AddressList[0];
int iPORT = Int32.Parse(port);
proxyendpoint = new IPEndPoint(proxyip,iPORT);
mysocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
mysocket.Connect(proxyendpoint);
string EncodedData = encodeUIDPWD(struid.ToString(),strpwd.ToString());
string proxymsgmsg = "CONNECT " + destip +":" + destport +" HTTP/1.0\nProxy-Authorization:Basic " + EncodedData + "\n\n" ;
byte[] buffer = Encoding.ASCII.GetBytes(proxymsgmsg);
byte[] buffer12 = new byte[500];
mysocket.Send(buffer,buffer.Length,0);
int msg = mysocket.Receive(buffer12,500,0);
string data;
data = Encoding.ASCII.GetString(buffer12);
int index = data.IndexOf("200");
if(index == -1)
{
// return 0;
}
else
{
//return 1;
return mysocket;
}
}
public string encodeUIDPWD(string uid, string pwd)
{
string uidpwd = uid + ":" + pwd;
byte[] data = System.Text.UnicodeEncoding.UTF8.GetBytes(uidpwd);
Base64Encoder myEncoder = new Base64Encoder(data);
StringBuilder sb = new StringBuilder();
sb.Append(myEncoder.GetEncoded());
return (sb.ToString());
}
}
}
using System;
namespace HTTP_TUNNEL
{
/// <summary>
/// Summary description for Base64Encoder.
/// </summary>
public class Base64Encoder
{
byte[] source;
int length,length2;
int blockCount;
int paddingCount;
public Base64Encoder(byte[] input)
{
source=input;
length=input.Length;
if((length % 3)==0)
{
paddingCount=0;
blockCount=length/3;
}
else
{
paddingCount=3-(length % 3);//need to add padding
blockCount=(length+paddingCount) / 3;
}
length2=length+paddingCount;//or blockCount *3
}
public char[] GetEncoded()
{
byte[] source2;
source2=new byte[length2];
//copy data over insert padding
for (int x=0; x<length2;x++)
{
if (x<length)
{
source2[x]=source[x];
}
else
{
source2[x]=0;
}
}
byte b1, b2, b3;
byte temp, temp1, temp2, temp3, temp4;
byte[] buffer=new byte[blockCount*4];
char[] result=new char[blockCount*4];
for (int x=0;x<blockCount;x++)
{
b1=source2[x*3];
b2=source2[x*3+1];
b3=source2[x*3+2];
temp1=(byte)((b1 & 252)>>2);//first
temp=(byte)((b1 & 3)<<4);
temp2=(byte)((b2 & 240)>>4);
temp2+=temp; //second
temp=(byte)((b2 & 15)<<2);
temp3=(byte)((b3 & 192)>>6);
temp3+=temp; //third
temp4=(byte)(b3 & 63); //fourth
buffer[x*4]=temp1;
buffer[x*4+1]=temp2;
buffer[x*4+2]=temp3;
buffer[x*4+3]=temp4;
}
for (int x=0; x<blockCount*4;x++)
{
result[x]=sixbit2char(buffer[x]);
}
//covert last "A"s to "=", based on paddingCount
switch (paddingCount)
{
case 0:break;
case 1:result[blockCount*4-1]='=';break;
case 2:result[blockCount*4-1]='=';
result[blockCount*4-2]='=';
break;
default:break;
}
return result;
}
private char sixbit2char(byte b)
{
char[] lookupTable=new char[64]
{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'};
if((b>=0) &&(b<=63))
{
return lookupTable[(int)b];
}
else
{
//should not happen;
return ' ';
}
}
}
}
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace HTTP_TUNNEL
{
/// <summary>
/// Summary description for httptunnel.
/// </summary>
public class httptunnel
{
public httptunnel()
{
//
// TODO: Add constructor logic here
//
}
private IPHostEntry proxyentry ;
private IPAddress proxyip ;
private IPEndPoint proxyendpoint;
public static Socket mysocket;
public socket createHttpTunnel(string proxyipadd,string port,string struid,string strpwd,string destip,string destport)
{
proxyentry = Dns.Resolve(proxyipadd);
proxyip = proxyentry.AddressList[0];
int iPORT = Int32.Parse(port);
proxyendpoint = new IPEndPoint(proxyip,iPORT);
mysocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
mysocket.Connect(proxyendpoint);
string EncodedData = encodeUIDPWD(struid.ToString(),strpwd.ToString());
string proxymsgmsg = "CONNECT " + destip +":" + destport +" HTTP/1.0\nProxy-Authorization:Basic " + EncodedData + "\n\n" ;
byte[] buffer = Encoding.ASCII.GetBytes(proxymsgmsg);
byte[] buffer12 = new byte[500];
mysocket.Send(buffer,buffer.Length,0);
int msg = mysocket.Receive(buffer12,500,0);
string data;
data = Encoding.ASCII.GetString(buffer12);
int index = data.IndexOf("200");
if(index == -1)
{
// return 0;
}
else
{
//return 1;
return mysocket;
}
}
public string encodeUIDPWD(string uid, string pwd)
{
string uidpwd = uid + ":" + pwd;
byte[] data = System.Text.UnicodeEncoding.UTF8.GetBytes(uidpwd);
Base64Encoder myEncoder = new Base64Encoder(data);
StringBuilder sb = new StringBuilder();
sb.Append(myEncoder.GetEncoded());
return (sb.ToString());
}
}
}
using System;
namespace HTTP_TUNNEL
{
/// <summary>
/// Summary description for Base64Encoder.
/// </summary>
public class Base64Encoder
{
byte[] source;
int length,length2;
int blockCount;
int paddingCount;
public Base64Encoder(byte[] input)
{
source=input;
length=input.Length;
if((length % 3)==0)
{
paddingCount=0;
blockCount=length/3;
}
else
{
paddingCount=3-(length % 3);//need to add padding
blockCount=(length+paddingCount) / 3;
}
length2=length+paddingCount;//or blockCount *3
}
public char[] GetEncoded()
{
byte[] source2;
source2=new byte[length2];
//copy data over insert padding
for (int x=0; x<length2;x++)
{
if (x<length)
{
source2[x]=source[x];
}
else
{
source2[x]=0;
}
}
byte b1, b2, b3;
byte temp, temp1, temp2, temp3, temp4;
byte[] buffer=new byte[blockCount*4];
char[] result=new char[blockCount*4];
for (int x=0;x<blockCount;x++)
{
b1=source2[x*3];
b2=source2[x*3+1];
b3=source2[x*3+2];
temp1=(byte)((b1 & 252)>>2);//first
temp=(byte)((b1 & 3)<<4);
temp2=(byte)((b2 & 240)>>4);
temp2+=temp; //second
temp=(byte)((b2 & 15)<<2);
temp3=(byte)((b3 & 192)>>6);
temp3+=temp; //third
temp4=(byte)(b3 & 63); //fourth
buffer[x*4]=temp1;
buffer[x*4+1]=temp2;
buffer[x*4+2]=temp3;
buffer[x*4+3]=temp4;
}
for (int x=0; x<blockCount*4;x++)
{
result[x]=sixbit2char(buffer[x]);
}
//covert last "A"s to "=", based on paddingCount
switch (paddingCount)
{
case 0:break;
case 1:result[blockCount*4-1]='=';break;
case 2:result[blockCount*4-1]='=';
result[blockCount*4-2]='=';
break;
default:break;
}
return result;
}
private char sixbit2char(byte b)
{
char[] lookupTable=new char[64]
{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'};
if((b>=0) &&(b<=63))
{
return lookupTable[(int)b];
}
else
{
//should not happen;
return ' ';
}
}
}
}
相关文章推荐
- 几种建立http-tunnel的方法
- Android studio出现 Error:Unable to tunnel through proxy. Proxyreturns "HTTP/1.1 400 Bad Request"
- AndroidStudio问题Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request解决方法
- ActionScript 3的HTTPTunnel的实现
- HttpTunnel技术介绍
- HttpTunnel解读和防御
- Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解决办法
- Http Tunnel 小记
- HTTP隧道工具HTTPTunnel
- 在导入新项目之后出现Error:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad Request”的错误
- ErrorUnable to tunnel through proxy. Proxy returns HTTP1.1 400 Bad Reques
- http tunnel 原理 及 穿透防火墙方法-1
- 防火墙穿透学习--HttpTunnel工作原理与程序结构分析
- HttpTunnel解读和防御
- HTTP 隧道通讯库 HTTPTunnel
- Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"
- Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"
- HttpTunnel防火墙穿透指南
- HTTP隧道工具HTTPTunnel
- 几种建立http-tunnel的方法