fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
阅读:4493回复:29

问一个关于数据包分析、加密的处理问题。

楼主#
更多 发布于:2002-11-27 17:38
对于防火墙或其他的VPN来说,如果不是在TDI层以上拦截的话,不管是Ndis Wrapper还是Passthru,通常拦截的到的都是用NDIS_PACKET结构来描述的数据包。而NDIS_PACKET是由一系列的NDIS_BUFFER串到一起形成的,每个NDIS_BUFFER是一个MDL(NT以上是这样的,95/98又有所不同了),那么我要问问做过防火墙的兄弟,对于一个IP包NDIS_PACKET,包含NDIS_BUFFER分别有A,B,C,D,去取IP地址的时候,一般是定义一个IP头的结构IpHead,然后定义一个指针IpHead pIpHdr,最后将pIpHdr指向IP头所在的内存,问题是那个内存不一定是连续的,可能IP头的前面部分在B,后面部分在C,那么pIpHdr后面的部分不是就无效了吗?

[编辑 -  11/27/02 by  fracker]

最新喜欢:

myelanmyelan
ftbk86
驱动牛犊
驱动牛犊
  • 注册日期2005-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望402点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-03-15 12:07
回 3楼(mikeluo) 的帖子
那你的解密包是怎么处理的呢?
vipfengxiao
驱动牛犊
驱动牛犊
  • 注册日期2009-12-29
  • 最后登录2011-12-21
  • 粉丝1
  • 关注0
  • 积分79分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-03-06 17:17
我刚做的加密解密 是先copy出来再加密解密 没想到还有什么别的方法
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-30 16:36
彼此彼此:)
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-30 14:25
呵呵,这个俺就不懂了:)
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-30 14:17
IFS Kit
不是2k ddk
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-30 13:14
可是我在 2000 DDK 的头文件中找不到它的定义啊
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
7楼#
发布于:2002-11-30 11:59
fracker,_EPROCESS 结构是未公开的吗?

不是,在IFS Kit里面已经有了。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-30 10:56
fracker,_EPROCESS 结构是未公开的吗?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2002-11-29 16:04
我想是不是要改页表才能实现 fracker 的想法啊?

可能吧,不过对那些东西控制不大清楚。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-29 16:00
我想是不是要改页表才能实现 fracker 的想法啊?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
11楼#
发布于:2002-11-29 15:40
呵呵,想出来对你们有好处阿,对我是没有什么用处的,我的工作这些东西是用不上的。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-29 15:36
俺想了半天,没有发现什么蛛丝马迹可以解决fracker的想法,:(

既然胡版主已经发话了,俺就先不想了,免的浪费脑细胞,

改别人的程序真痛苦吖,尤其是这个程序还很大的时候,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
13楼#
发布于:2002-11-29 15:26
胡大侠都说了只能Copy出来,那看来是没什么办法了。话题结束,结账。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2002-11-29 14:46
ps:如果要在9x下使用,把QueryBufferSafe改为QueryBuffer。

在2k下也可以使用QueryBuffer。


[quote]都没有说到有意义的东西,其实我的想法是,是否存在这种可能,通过一些函数调用,使本来不连续的各段内存映射到同一个地址开始,从而变成连续的?我认为研究一下Windows的内存管理,也许可以实现呢?


这种情况必须把mdl那个内存链分别取出来放到一个大buf里面,
然后才能进行加密,例如调用
do_3des(buf,buflen);



这两个函数随便你用哪个。
//////////////////////////////////////////////////////////////////////////////
// 描述:
// 把一个NDIS_PACKET结构中包含的数据拷贝到一个预先分配的缓冲区中,该
// 缓冲区必须足够大,否则会导致非法内存访问。调用者如果不能肯定包长度
// 可以调用NdisQueryPacket(Packet,NULL,NULL,&PacketSize)得到。或者分配
// 一个超过最大长度的内存。
// write by huyg
// 参数:
// Packet:
// pPacketContent:
// pPacketSize:
///////////////////////////////////////////////////////////////////////////////
UINT
CopyPacket2Buf(
IN PNDIS_PACKET Packet,
OUT PUCHAR pPacketContent,
OUT UINT* pPacketSize)
{
UINT  bufLength;
MDL* pNext;
UINT i;
PUCHAR pbuf;

NdisQueryPacket(Packet,NULL,NULL,NULL,pPacketSize);

NdisQueryBufferSafe(Packet->Private.Head,&pbuf,&bufLength, 32 );
NdisMoveMemory(pPacketContent,pbuf,bufLength);
i=bufLength;
pNext=Packet->Private.Head;  // next 是一个mdl

for(;;)
{
// if(pNext==Packet->Private.Tail)
// break;
pNext=pNext->Next;  // next 是一个mdl
if (pNext==NULL)  break;
NdisQueryBufferSafe(pNext,&pbuf,&bufLength,32);
NdisMoveMemory(pPacketContent+i,pbuf,bufLength);
i+=bufLength;
}
ASSERT(*pPacketSize == i);
return *pPacketSize;
}

/////////////////////////////////////
// just like CopyPacket2Buf,write by yq
/////////////////////////////////////
UINT
CopyPacketToBuffer(
    IN OUT PUCHAR Buf,              // destination
    IN PNDIS_PACKET Packet,         // source packet
    IN UINT Offset,                 // offset in packet
    IN UINT Length                  // number of bytes to copy
    )

/*++

Routine Description:

    Copies bytes from a packet into a buffer. Used to copy data
    out of a packet during loopback indications.

Arguments:

    Buf - the destination buffer
    Packet - the source packet
    Offset - the offset in the packet to start copying at
    Length - the number of bytes to copy

Return Value:

    The actual number of bytes copied; will be less than Length if
    the packet length is less than Offset+Length.

--*/

{
    PNDIS_BUFFER CurBuffer;
    UINT BytesCopied;
    PUCHAR BufVA;
    UINT BufLen;
    UINT ToCopy;
    UINT CurOffset;

    BytesCopied = 0;

    //
    // First find a spot Offset bytes into the packet.
    //

    CurOffset = 0;

    NdisQueryPacket(Packet, NULL, NULL, &CurBuffer, NULL);

    while (CurBuffer != (PNDIS_BUFFER)NULL) {

        NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen);

        if (CurOffset + BufLen > Offset) {

            break;

        }

        CurOffset += BufLen;

        NdisGetNextBuffer(CurBuffer, &CurBuffer);

    }

    //
    // See if the end of the packet has already been passed.
    //

    if (CurBuffer == (PNDIS_BUFFER)NULL) {

        return 0;

    }

    //
    // Now copy over Length bytes.
    //

    BufVA += (Offset - CurOffset);

    BufLen -= (Offset - CurOffset);

    for (;;) {

        ToCopy = (BytesCopied+BufLen > Length) ? Length - BytesCopied : BufLen;

        NdisMoveMemory(Buf+BytesCopied, BufVA, ToCopy);

        BytesCopied += ToCopy;

        if (BytesCopied == Length) {

            return BytesCopied;

        }

        NdisGetNextBuffer(CurBuffer, &CurBuffer);

        if (CurBuffer == (PNDIS_BUFFER)NULL) {

            break;

        }

NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen);

    }

    return BytesCopied;

}
 [/quote]
不再回忆从前,我已经生活在幸福当中。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
15楼#
发布于:2002-11-29 14:43
都没有说到有意义的东西,其实我的想法是,是否存在这种可能,通过一些函数调用,使本来不连续的各段内存映射到同一个地址开始,从而变成连续的?我认为研究一下Windows的内存管理,也许可以实现呢?


这种情况必须把mdl那个内存链分别取出来放到一个大buf里面,
然后才能进行加密,例如调用
do_3des(buf,buflen);

这两个函数随便你用哪个。
//////////////////////////////////////////////////////////////////////////////
// 描述:
// 把一个NDIS_PACKET结构中包含的数据拷贝到一个预先分配的缓冲区中,该
// 缓冲区必须足够大,否则会导致非法内存访问。调用者如果不能肯定包长度
// 可以调用NdisQueryPacket(Packet,NULL,NULL,&PacketSize)得到。或者分配
// 一个超过最大长度的内存。
// write by huyg
// 参数:
// Packet:
// pPacketContent:
// pPacketSize:
///////////////////////////////////////////////////////////////////////////////
UINT
CopyPacket2Buf(
IN PNDIS_PACKET Packet,
OUT PUCHAR pPacketContent,
OUT UINT* pPacketSize)
{
UINT  bufLength;
MDL* pNext;
UINT i;
PUCHAR pbuf;

NdisQueryPacket(Packet,NULL,NULL,NULL,pPacketSize);

NdisQueryBufferSafe(Packet->Private.Head,&pbuf,&bufLength, 32 );
NdisMoveMemory(pPacketContent,pbuf,bufLength);
i=bufLength;
pNext=Packet->Private.Head;  // next 是一个mdl

for(;;)
{
// if(pNext==Packet->Private.Tail)
// break;
pNext=pNext->Next;  // next 是一个mdl
if (pNext==NULL)  break;
NdisQueryBufferSafe(pNext,&pbuf,&bufLength,32);
NdisMoveMemory(pPacketContent+i,pbuf,bufLength);
i+=bufLength;
}
ASSERT(*pPacketSize == i);
return *pPacketSize;
}

/////////////////////////////////////
// just like CopyPacket2Buf,write by yq
/////////////////////////////////////
UINT
CopyPacketToBuffer(
    IN OUT PUCHAR Buf,              // destination
    IN PNDIS_PACKET Packet,         // source packet
    IN UINT Offset,                 // offset in packet
    IN UINT Length                  // number of bytes to copy
    )

/*++

Routine Description:

    Copies bytes from a packet into a buffer. Used to copy data
    out of a packet during loopback indications.

Arguments:

    Buf - the destination buffer
    Packet - the source packet
    Offset - the offset in the packet to start copying at
    Length - the number of bytes to copy

Return Value:

    The actual number of bytes copied; will be less than Length if
    the packet length is less than Offset+Length.

--*/

{
    PNDIS_BUFFER CurBuffer;
    UINT BytesCopied;
    PUCHAR BufVA;
    UINT BufLen;
    UINT ToCopy;
    UINT CurOffset;

    BytesCopied = 0;

    //
    // First find a spot Offset bytes into the packet.
    //

    CurOffset = 0;

    NdisQueryPacket(Packet, NULL, NULL, &CurBuffer, NULL);

    while (CurBuffer != (PNDIS_BUFFER)NULL) {

        NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen);

        if (CurOffset + BufLen > Offset) {

            break;

        }

        CurOffset += BufLen;

        NdisGetNextBuffer(CurBuffer, &CurBuffer);

    }

    //
    // See if the end of the packet has already been passed.
    //

    if (CurBuffer == (PNDIS_BUFFER)NULL) {

        return 0;

    }

    //
    // Now copy over Length bytes.
    //

    BufVA += (Offset - CurOffset);

    BufLen -= (Offset - CurOffset);

    for (;;) {

        ToCopy = (BytesCopied+BufLen > Length) ? Length - BytesCopied : BufLen;

        NdisMoveMemory(Buf+BytesCopied, BufVA, ToCopy);

        BytesCopied += ToCopy;

        if (BytesCopied == Length) {

            return BytesCopied;

        }

        NdisGetNextBuffer(CurBuffer, &CurBuffer);

        if (CurBuffer == (PNDIS_BUFFER)NULL) {

            break;

        }

NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen);

    }

    return BytesCopied;

}
不再回忆从前,我已经生活在幸福当中。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
16楼#
发布于:2002-11-29 11:15
都没有说到有意义的东西,其实我的想法是,是否存在这种可能,通过一些函数调用,使本来不连续的各段内存映射到同一个地址开始,从而变成连续的?我认为研究一下Windows的内存管理,也许可以实现呢?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-28 23:17
哈哈,mikeluo,你也换头像了

好啊,贴出来啊
leepyzh
禁止发言
禁止发言
  • 注册日期2001-04-27
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分3668分
  • 威望18340点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2002-11-28 23:03
用户被禁言,该主题自动屏蔽!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-28 14:39
我现在跟的都是4个buffer,不过都是ping的包
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
上一页
游客

返回顶部