2012-11-23 39 views
0

我想做一个使用SSL/TLS的协议分析,幸运的是我可以安装自己的证书,DNS部分不会成为问题。我的问题是我用什么来做到这一点。我考虑过使用paros,但它会比它的价值更麻烦。所以我想我可以写两个C#应用程序。第一个是伪服务器,另一个是伪客户端。两者之间有一个tcp连接,然后我可以使用wireshark。问题是,我对流的经验很少。所以,如果任何人都可以将我指向有用的文章,或者如果代码很短,那么示例会很棒。先进的谢谢你。.Net SSL/TLS传递

+0

我在这里看到2个问题,一个关于编写拦截SSL/TLS的程序和另一个关于如何使用流的体系结构问题。你应该弄清楚你真正想问的问题是什么,然后问这个问题。 – Aren

+0

@Aren我知道如何使用流氓DNS拦截这个协议。问题更多的是如何连接两个流,这样一个流就可以从另一个流中流出,反之亦然。 – David

回答

2

从流中读取/写入数据不是非常困难,您不能只连接流,您需要有自己的代码来执行此操作。最好在它自己的线程上(或工作进程或任务或任何你需要的线程概念)。

public void ConnectStreams(Stream inStream, Stream outStream) 
{ 
    byte[] buffer = new byte[1024]; 
    int bytesRead = 0; 

    while((bytesRead = inStream.Read(buffer, 0, 1024)) != 0) 
    { 
     outStream.Write(buffer, 0, bytesRead); 
     outStream.Flush(); 
    } 
} 

基本上流操作字节数组。当我们运行这一行:

while((bytesRead = inStream.Read(buffer, 0, 1024)) != 0) 

我们基本上是说,在inStream执行Read,把读取的字节为buffer,在指数0(缓冲区)和阅读的1024字节的最高。

然后,我们分配的返回值成bytesRead其是(在这种情况下01024之间)中读出实际的字节数,并且如果不等于0时,继续循环。

然后我们简单地将它写回outStream,缓冲区包含数据和实际读取的字节数。我们执行刷新以实际强制输出,而不是叠加在内部缓冲区中。

当流到达EOF时,.Read将返回0,循环将退出,您可以继续。这就是你在最简单​​的层面上“连接”两个数据流的方式。

+0

优秀的答案,谢谢。几个问题:while循环会一直保持,直到流被断开,在这种情况下,当tcp或s​​sl流关闭时?如果我有两个线程执行代理,它会要求我锁定流? – David

+0

我一直在处理你的代码,它直到客户端需要断开连接才能正常工作。我使用http测试了它,当Web服务器断开连接时没有问题,但是当我断开客户端连接时,它与stream.read中的一些未发送的数据一起停留在缓冲区中。 – David

+0

得到它的工作解决方案只是把while循环放入try catch中,你能编辑你的答案来反映它。 – David