这个问题很奇怪,在测试只是用PROTOCOL_RDP进行加密通信的过程中,程序莫名其妙的崩溃了。
崩溃不可怕,只要可以重现就知道崩溃点在哪里,还是很好解决的。
最后定位到的原因是,在进行RC4的密钥交换时,无法Decode Server的Certificate,从而造成没法把ClientRandom用Server的Public Key加密之后发给Server。最后整个RDP的流程就在这里停止了。
至于为什么崩溃,是直到这个问题解决的时候才明白的,反正就是在读取Certificate的时候用到的一块malloc出来的内存,在最后程序的退出free的时候,莫名其妙的崩溃了。
解决方法很笨拙,就是把MSTSC和FreeRDP的连接的包都抓下来一点点的对比。
总结一下吧,为了和标题对上我们就按标题顺序来描述这个问题:
- 在原来的网络层(当然不是我写的了)Recv的时候使用了固定大小的内存。原先想当然的用了4096这个大小。在XP上测试的时候一点问题没有,因为XP的证书不是X509格式的,所以很小,才200 Bytes左右。而在2008上测试时就有问题了,内存不够用了。一般发过来的证书都要将近5000 bytes
- 那么网络层Recv的数据超过了固定内存的大小就导致有一部分的数据写到了这个数组之外,这些数据随时可能被其它的代码给覆盖掉。最后将数据送到gcc模块进行解析的时候,大概率这部分被覆盖的数据会导致解析错误。
- 至于为什么崩溃,因为那部分数据不属于这个动态分配的数据,在free的时候必然引起SegmentFault
- 这是一个人为的、为了方便的、不顾扩展性的、自以为是的坑。。。。。