阅读:1706回复:19
再问关于IMD中网络加解密的问题。
UINT
CopyPacketData( PNDIS_PACKET pPacket, char * pData, UINT iSize ) { UINT iLength; UINT iPos; PNDIS_BUFFER pNextBuffer; char * pBuffer; iPos = 0; NdisQueryPacket( pPacket, NULL, NULL, &pNextBuffer, &iLength ); if( iLength > iSize ) return iPos; while( pNextBuffer ) { NdisQueryBuffer( pNextBuffer, &pBuffer, &iLength ); if( iLength > iSize - iPos || !pBuffer ) break; NdisMoveMemory( pData + iPos, pBuffer, iLength ); NdisGetNextBuffer( pNextBuffer, &pNextBuffer ); iPos += iLength; } return iPos; } 上面的函数是把一个packet内容拷贝到一块连续的缓冲里,如果我要进行加密处理,是不是只要解析出包头,如ethernet,ip,tcp,然后对包头后面的数据进行加密就行了。谢谢了! |
|
|
沙发#
发布于:2003-06-30 14:15
可能要还要计算校验码,加密之后还要重新封装,好象听麻烦的。我也是新手,上来之后听说的,没这么作国。
|
|
板凳#
发布于:2003-06-30 14:22
能不能具体一点,你是要加密IP层数据,TRANSPORT数据,还是APP的
数据?或者说只要做修改地址后CHECKSUM? 如果真正要加密的话比较麻烦 特别是如果要转发数据那更麻烦。因为加密的话,数据的长度会改变 但是packet中那个buffer描述符里面已经将数据长度定好了。 你修改后,将数据copy回去,就会有大问题。比如当你的情况恰好 是在ptreceive中NDISGETPACKET不为空的情况,实际上包的数据在miniport中,你copy回去的时候,因为数据长度变长了,你就越界 对内存进行了写操作。呵呵:)等待你的就是BSOD了 还有一种可能你可能没考虑到。那就是PKT=NDIS-GET-ORIGINAL-PAKCET,而PKT!=NULL时,你的哪个CopyPacketDatacopy的数据 实际上只有transferdata的数据,也就是说可能里面根本就没有 ,ether头、IP头 TCP头。等等。那些头可能在ORIGINALPACKET中。 我现在也有个疑问,那就是在 ORIGINALPACKET 中 是不是还有 ORIGINALPACKET ?以至与可以嵌套N次。这样的话处理后的 数据在copy回去就很麻烦,也许可以考虑递归。 |
|
|
地板#
发布于:2003-06-30 14:33
楼上的大侠,我是想加密transport数据。我是这样做的,把packet拷到pData后,然后
NdisDprAllocatePacket(&Status, &MyPacket, pAdapt- >RecvPacketPoolHandle); mdl = IoAllocateMdl(pData,iTotal,FALSE,FALSE,NULL); MmProbeAndLockPages(mdl,KernelMode,IoReadAccess|IoWriteAccess|IoModifyAccess); NdisChainBufferAtBack(MyPacket,mdl); 把MyPacket链到pData,我这样做只是一个框架。 关于越界的问题很麻烦,现在暂时还没考虑到:)是不是我只要把pData里的数据全部加密,这样的话就不能被目标机器识别了;还是要解析出包头然后加密数据。 |
|
|
地下室#
发布于:2003-06-30 14:38
你要加密那岂不是要在驱动里做C/S结构?
如果你只要发送数据的话,可能要好处理点。 还有就是,是一个真正的菜鸟。 能把你的项目背景介绍一下吗?你只加密TRANSPORT的数据吗? 也就是说TCP/UDP头以后所有的数据? [编辑 - 6/30/03 by antspower] |
|
|
5楼#
发布于:2003-06-30 15:17
我的原理是:两台机器在应用层进行通讯,client发出数据,经过IMD自动进行加密,然后到达server后,自动进行解密。我只想加密transport数据。
|
|
|
6楼#
发布于:2003-06-30 15:24
或者app的也行
|
|
|
7楼#
发布于:2003-06-30 16:49
刚刚帮你做了实验,在mpsendonepacket加入以下
pkt = Packet; while(pkt) { pkt = NDIS_GET_ORIGINAL_PACKET(pkt); ++i; } 结果很令人郁闷,结果居然是个死循环。 不知有没有高手参与讨论 可能我也要放分了 flywithlove,你可能没有看清我的第一段话。有一个情况非常重要 那就是如果先传上来的数据在在ORIGINALpacket中的,你的那个处理是完全不行的! 按照我的理解:在上例中应该I=2时就退出。 因为当数据只有一部分传上来时,那么先上来的数据放在packet 的ORIGINAL PACKET中,后上来的放在packet中BUFFER中。 也就是说:一个packet可能有一个ORIGINAL PACKET pkt, 但是pkt没有ORIGINAL PACKET了。 现在回到你的问题上:如果你约定一个统一的机密/解密算法。把上面的问题也解决好了,那么对TCP/UDP后的数据进行加密是可以了 但不能对ETHER/IP头后的数据加密。why?因为如果加密了 你的server将不在认得什么是TCP/IP头了。 |
|
|
8楼#
发布于:2003-06-30 16:51
你要加密那岂不是要在驱动里做C/S结构? 还有就是,是一个真正的菜鸟。 //这句话,少了一个“我”字,不要意思。 |
|
|
9楼#
发布于:2003-06-30 16:53
刚刚帮你做了实验,在mpsendonepacket加入以下 因为当数据只有一部分传上来时,那么先上来的数据放在packet 的ORIGINAL PACKET中,后上来的放在packet中BUFFER中。 也就是说:一个packet可能有一个ORIGINAL PACKET pkt, 但是pkt没有ORIGINAL PACKET了。 不懂是什么意思。 |
|
|
10楼#
发布于:2003-06-30 17:21
mike我现在只考虑一中情况:
1。当在ptreceive中,当packet==NULL,并且要transferdata时, 我们是不是先用一个packet来保存lookasidebuffer的数据。 然再申请一个包,来存放ndistransferdata上来的数据。 最后用第二个包的protocolresvd,强制类型转换为: PRSVD,然后PRSVD->originalpacket等于第一个包。 对不对? 所以组包的时候肯定要考虑pkt = NDIS_GET_ORIGINAL_PACKET(packet)是不是? 现在的问题是:pkt还有没有original packet |
|
|
11楼#
发布于:2003-07-01 16:51
for(i=strLen1;i<strLen2;i++)
*((char *)pData+i)+=1; 请问我可以用这种方法加解密吗,pData是packet拷贝的一个缓冲,strLen1是包头的长度(Ethe,IP,TCP),strlen2是packet总长减去Ethernet尾的长度。 |
|
|
12楼#
发布于:2003-07-01 17:10
mike我现在只考虑一中情况: 这个时候你可以先分配一块内存,保存headbuffer和lookaheadbuffer,然后把这个内存挂在packet的保留域里面,然后在分配一个buffer,去transferdate,然后再把原先的那快内存挂到一个ndisbuffer上,再chainfront。 或者你也可以让transferdate从0开始给你传送数据, 或者更直接一点,直接从lookaheadbuffer里面copy出来packedtsize的数据。 总之这里完全没有必要要用两个packet。 |
|
|
13楼#
发布于:2003-07-01 17:11
还有就是,是一个真正的菜鸟。 “不要意思”是什么意思? |
|
|
14楼#
发布于:2003-07-01 17:44
靠,楼主贴的代码我怎么这么眼熟?
|
|
15楼#
发布于:2003-07-01 17:50
有人回答我的问题吗 :)
|
|
|
16楼#
发布于:2003-07-01 17:58
to fracker:胡老大的代码
:D |
|
|
17楼#
发布于:2003-07-01 18:12
靠,楼主贴的代码我怎么这么眼熟? hahahah |
|
|
18楼#
发布于:2003-07-01 20:26
[quote] 还有就是,是一个真正的菜鸟。 “不要意思”是什么意思? [/quote] 错别字很害人啊,本来是解释的,结果又造成新的误解。 :“不好意思啊” |
|
|
19楼#
发布于:2003-07-02 09:31
兄弟们,这个帖子过两天就给分,这里对antspower的无私帮助表示感谢。
|
|
|