flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1706回复:19

再问关于IMD中网络加解密的问题。

楼主#
更多 发布于:2003-06-30 14:01
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,然后对包头后面的数据进行加密就行了。谢谢了!
痛并快乐着!
tsinghui
驱动牛犊
驱动牛犊
  • 注册日期2003-04-23
  • 最后登录2003-07-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-30 14:15
可能要还要计算校验码,加密之后还要重新封装,好象听麻烦的。我也是新手,上来之后听说的,没这么作国。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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回去就很麻烦,也许可以考虑递归。
放弃瘟草,现吃李草
flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于: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里的数据全部加密,这样的话就不能被目标机器识别了;还是要解析出包头然后加密数据。
痛并快乐着!
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-30 14:38
你要加密那岂不是要在驱动里做C/S结构?
如果你只要发送数据的话,可能要好处理点。
还有就是,是一个真正的菜鸟。
能把你的项目背景介绍一下吗?你只加密TRANSPORT的数据吗?
也就是说TCP/UDP头以后所有的数据?

[编辑 -  6/30/03 by  antspower]
放弃瘟草,现吃李草
flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-30 15:17
我的原理是:两台机器在应用层进行通讯,client发出数据,经过IMD自动进行加密,然后到达server后,自动进行解密。我只想加密transport数据。
痛并快乐着!
flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-30 15:24
或者app的也行
痛并快乐着!
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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头了。
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-30 16:51
你要加密那岂不是要在驱动里做C/S结构?
如果你只要发送数据的话,可能要好处理点。
还有就是,是一个真正的菜鸟。
能把你的项目背景介绍一下吗?你只加密TRANSPORT的数据吗?
也就是说TCP/UDP头以后所有的数据?

[编辑 -  6/30/03 by  antspower]

还有就是,是一个真正的菜鸟。
//这句话,少了一个“我”字,不要意思。

放弃瘟草,现吃李草
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-30 16:53
刚刚帮你做了实验,在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头了。
 


因为当数据只有一部分传上来时,那么先上来的数据放在packet 的ORIGINAL PACKET中,后上来的放在packet中BUFFER中。
也就是说:一个packet可能有一个ORIGINAL PACKET pkt,
但是pkt没有ORIGINAL PACKET了。

不懂是什么意思。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
放弃瘟草,现吃李草
flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
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尾的长度。
痛并快乐着!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-07-01 17:10
mike我现在只考虑一中情况:
1。当在ptreceive中,当packet==NULL,并且要transferdata时,
我们是不是先用一个packet来保存lookasidebuffer的数据。
然再申请一个包,来存放ndistransferdata上来的数据。
最后用第二个包的protocolresvd,强制类型转换为:
PRSVD,然后PRSVD->originalpacket等于第一个包。
对不对?
所以组包的时候肯定要考虑pkt = NDIS_GET_ORIGINAL_PACKET(packet)是不是?
现在的问题是:pkt还有没有original packet
 


这个时候你可以先分配一块内存,保存headbuffer和lookaheadbuffer,然后把这个内存挂在packet的保留域里面,然后在分配一个buffer,去transferdate,然后再把原先的那快内存挂到一个ndisbuffer上,再chainfront。
或者你也可以让transferdate从0开始给你传送数据,

或者更直接一点,直接从lookaheadbuffer里面copy出来packedtsize的数据。

总之这里完全没有必要要用两个packet。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-07-01 17:11
 
还有就是,是一个真正的菜鸟。
//这句话,少了一个“我”字,不要意思。


“不要意思”是什么意思?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
14楼#
发布于:2003-07-01 17:44
靠,楼主贴的代码我怎么这么眼熟?
flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-07-01 17:50
有人回答我的问题吗 :)
痛并快乐着!
flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-07-01 17:58
to fracker:胡老大的代码
 :D
痛并快乐着!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-07-01 18:12
靠,楼主贴的代码我怎么这么眼熟?


hahahah
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-07-01 20:26
[quote] 还有就是,是一个真正的菜鸟。
//这句话,少了一个“我”字,不要意思。


“不要意思”是什么意思? [/quote]

错别字很害人啊,本来是解释的,结果又造成新的误解。
:“不好意思啊”
放弃瘟草,现吃李草
flywithlove
驱动小牛
驱动小牛
  • 注册日期2002-11-05
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-07-02 09:31
兄弟们,这个帖子过两天就给分,这里对antspower的无私帮助表示感谢。

痛并快乐着!
游客

返回顶部