rocketma
驱动牛犊
驱动牛犊
  • 注册日期2007-06-15
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1896回复:8

购买HOOK方式修改数据报的代码(已经自行解决)

楼主#
更多 发布于:2008-05-02 22:35
以下问题已经自行解决,此帖取消,至于2楼说的以下代码处处是BUG,我检查了一下,发现tempBuL = CurrentBufferLength;为错误,修改为tempBuL += CurrentBufferLength;其他问题没发现,现在完整代码已经自行解决并通过测试,确实HOOK NDIS.SYS的加密与解密与直接的IMD驱动方式不一样,其余部分代码恕不公布,谢谢各位.






查了不少修改数据报的资料, 都是IMD的, 移植到HOOK NDIS方式总不断蓝屏, 即使看了本论坛里面对IMD修改数据报的解答也总是非常简单, 提问的人只希望得到别人的解答,解决了的人也不愿意提供分享
所以我决定放弃自己的盲目努力, 希望通过购买了获得学习的机会, 以下为详细要求,

以下为ndishook.c中的相关代码, 在未使用MyPacket前驱动正常运行
现在要求根据以下代码修改和补充(包括补充ndishook.h等文件中的增加部分),
将MPSendPacket(HookSendPacket)发送的Packet读入到pPacketContent(修改用), 重新构造成MyPacket, 将MyPacket发送
将PtReceivePacket(HookReceivePacket)接收的Packet读入到pPacketContent(修改用), 重新构造成MyPacket, 将MyPacket上指, 完成各类资源释放
将PtReceive(HookReceive)接收的数据读入到pPacketContent(修改用), 重新构造成MyPacket, 将MyPacket上指, 完成各类资源释放

NDIS_HANDLE                        m_hTcpipHandle = NULL;
PNDIS_SEND                        m_pNdisSend    = NULL;
NDIS_REGISTER_PROTOCOL            m_pNdisRegisterProtocol = NULL;
RECEIVE_HANDLER                    m_pNdisReceive = NULL;
NDIS_OPEN_ADAPTER                m_pNdisOpenAdapter = NULL;
OPEN_ADAPTER_COMPLETE_HANDLER    m_pOpenAdapterComplete = NULL;
TRANSFER_DATA_HANDLER            m_pTransferDataHandler = NULL;
NDIS_DEREGISTER_PROTOCOL        m_pNdisDeregisterProtocol = NULL;
BIND_HANDLER                    m_pBindAdapter = NULL;

NDIS_HANDLE                        m_hTcpIpWanHandle = NULL;
RECEIVE_PACKET_HANDLER            m_pWanReceivePacket = NULL;
SEND_PACKETS_HANDLER            m_pWanSendPackets = NULL;
OPEN_ADAPTER_COMPLETE_HANDLER    m_pWanOpenAdapterComplete = NULL;

SEND_HANDLER                    m_pSendHandler = NULL;
RECEIVE_PACKET_HANDLER            m_pReceivePacket = NULL;


NDIS_STATUS NDIS_API
HookReceive(
    IN NDIS_HANDLE NdisBindingContext,
    IN NDIS_HANDLE MacReceiveContext,
    IN PVOID HeaderBuffer,
    IN UINT HeaderBufferSize,
    IN PVOID LookAheadBuffer,
    IN UINT LookaheadBufferSize,
    IN UINT PacketSize
)
{
    NDIS_STATUS status;
    // 补充代码, 构造新MyPacket, 将MyPacket发送


    return NDIS_STATUS_SUCCESS;
}

VOID HookLocalSend()
{
    if(m_hTcpipHandle == NULL)
        return;

    HookSendFunction(m_hTcpipHandle, HookSendPacket, (PVOID*)&m_pSendHandler, HOOK_SEND);
    HookTransferDataFunction(m_hTcpipHandle,HookTransferData,(PVOID*)&m_pTransferDataHandler);
}

NDIS_STATUS NDIS_API
HookSendPacket(
    IN    NDIS_HANDLE                MacBindingHandle,
    IN    PNDIS_PACKET            Packet
)
{
    PNDIS_PACKET    MyPacket = NULL;
    PNDIS_BUFFER    MyBuffer = NULL;
    PUCHAR            pPacketContent = NULL;
    PRECV_RSVD        RecvRsvd;
    PUCHAR            pBuf;
    UINT            BufLength;
    ULONG PacketLength = 0;
    ULONG BufferCount = 0;
    PNDIS_BUFFER CurrentBuffer;
    ULONG tempBuL = 0;
    ULONG CurrentBufferLength;
    PVOID CurrentBufferVA = NULL;

    NDIS_STATUS        Status = NDIS_STATUS_SUCCESS;

    NdisQueryPacket(Packet,NULL,&BufferCount,&CurrentBuffer,&PacketLength);
    if(!BufferCount)
        return NDIS_STATUS_SUCCESS;

    // 分配缓冲区pPacketContent
    Status = NdisAllocateMemoryWithTag((PVOID *)&pPacketContent, PacketLength, 'maDN');
    if (Status!=NDIS_STATUS_SUCCESS )
        return NDIS_STATUS_SUCCESS;

    // 读取所有数据到pPacketContent
    NdisZeroMemory (pPacketContent, PacketLength);
    NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength);

    while(CurrentBuffer != NULL)
    {
        NdisMoveMemory(pPacketContent+tempBuL, CurrentBufferVA, CurrentBufferLength);
        tempBuL += CurrentBufferLength;
        NdisGetNextBuffer(CurrentBuffer, &CurrentBuffer);
        if(CurrentBuffer == NULL)
            break;
        NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength);
    }
    // 以下由pPacketContent组报由m_pSendHandler发送

..........................................




}

INT NDIS_API
HookReceivePacket(
    IN    NDIS_HANDLE                ProtocolBindingContext,
    IN    PNDIS_PACKET            Packet
)
{
    PNDIS_PACKET    MyPacket = NULL;
    PNDIS_BUFFER    MyBuffer = NULL;
    PUCHAR            pPacketContent = NULL;
    PRECV_RSVD        RecvRsvd;
    PUCHAR            pBuf;
    UINT            BufLength;
    ULONG PacketLength = 0;
    ULONG BufferCount = 0;
    PNDIS_BUFFER CurrentBuffer;
    ULONG tempBuL = 0;
    ULONG CurrentBufferLength;
    PVOID CurrentBufferVA = NULL;

    NDIS_STATUS        Status = NDIS_STATUS_SUCCESS;

    NdisQueryPacket(Packet,NULL,&BufferCount,&CurrentBuffer,&PacketLength);
    if(!BufferCount)
        return NDIS_STATUS_SUCCESS;

    // 分配缓冲区pPacketContent
    Status = NdisAllocateMemoryWithTag((PVOID *)&pPacketContent, PacketLength, 'maDN');
    if (Status!=NDIS_STATUS_SUCCESS )
        return NDIS_STATUS_SUCCESS;

    // 读取所有数据到pPacketContent
    NdisZeroMemory (pPacketContent, PacketLength);
    NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength);

    while(CurrentBuffer != NULL)
    {
        NdisMoveMemory(pPacketContent+tempBuL, CurrentBufferVA, CurrentBufferLength);
        tempBuL += CurrentBufferLength;
        NdisGetNextBuffer(CurrentBuffer, &CurrentBuffer);
        if(CurrentBuffer == NULL)
            break;
        NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength);
    }
    // 以下由pPacketContent组报由m_pReceivePacket上指
..........................................








}

VOID NDIS_API
HookNdisRegisterProtocol(
    OUT PNDIS_STATUS  Status,
    OUT PNDIS_HANDLE  NdisProtocolHandle,
    IN PNDIS_PROTOCOL_CHARACTERISTICS  ProtocolCharacteristics,
    IN UINT  CharacteristicsLength
)
{
    BOOLEAN bHookedTcp = FALSE;
    BOOLEAN bHookedWan = FALSE;
    UNICODE_STRING  usTcpName = UNICODE_STRING_CONST("TCPIP");
    UNICODE_STRING  usTcpIpWanName = UNICODE_STRING_CONST("TCPIP_WANARP");

    if(m_pNdisRegisterProtocol == NULL)
        return;

    //
    // 判断是否是TCP/IP协议
    //
    if(usTcpName.Length == ProtocolCharacteristics->Name.Length
        && memcmp(ProtocolCharacteristics->Name.Buffer, usTcpName.Buffer, usTcpName.Length) == 0)
    {
        bHookedTcp = TRUE;
        m_pOpenAdapterComplete = ProtocolCharacteristics->OpenAdapterCompleteHandler;
        ProtocolCharacteristics->OpenAdapterCompleteHandler = HookOpenAdapterComplete;

        //
        if(ProtocolCharacteristics->MajorNdisVersion >= 3
            && ProtocolCharacteristics->ReceiveHandler != NULL)
        {
            m_pNdisReceive = ProtocolCharacteristics->ReceiveHandler;
            ProtocolCharacteristics->ReceiveHandler = HookReceive;
        }

        if(ProtocolCharacteristics->MajorNdisVersion >= 4
            && ProtocolCharacteristics->ReceivePacketHandler != NULL)
        {
            m_pReceivePacket = ProtocolCharacteristics->ReceivePacketHandler;
            ProtocolCharacteristics->ReceivePacketHandler = HookReceivePacket;
        }

    }

    //
    m_pNdisRegisterProtocol(
        Status,
        NdisProtocolHandle,
        ProtocolCharacteristics,
        CharacteristicsLength
    );

    if(bHookedTcp)
        m_hTcpipHandle = *NdisProtocolHandle;
}
zhanSL
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2010-07-13
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望273点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-05-04 11:16
这代码处处都是bug,还不如某些公开的ndis hook代码。

建议还是从passthru中间层
rocketma
驱动牛犊
驱动牛犊
  • 注册日期2007-06-15
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-05-04 15:50
引用第1楼zhanSL于2008-05-04 11:16发表的  :
这代码处处都是bug,还不如某些公开的ndis hook代码。

建议还是从passthru中间层


谢谢回答, 能和我联系吗? QQ6886603
rocketma
驱动牛犊
驱动牛犊
  • 注册日期2007-06-15
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-05-10 13:53
想在这个论坛学点东西可真难, 我从第一页开始到50页,再从最后一页到第90页,差不多每个帖子都看了,真的没看到一个帖子是在帮提问的人真正解决问题的
虽然说没有义务帮助别人, 但作为一个技术论坛, 这样似乎很悲哀
我倒觉得不如解答问题采用明码标价来得痛快,如果提问者愿意,就当交学费学技术也比解决不;了问题强
哈哈!
jrdeng
驱动牛犊
驱动牛犊
  • 注册日期2008-03-31
  • 最后登录2008-05-17
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-05-11 20:43
是这样的拉。这世道。呵呵
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2008-05-21 17:04
似乎没有必要如此悲观,
估计现在研究ndis hook的人很少了吧,
大概3,4年前研究这个的人很多,那个时候论坛上解答问题的人也很多。
高手靠的是不断学习和进步来拉开与别人的距离,而不是靠闭嘴。
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2008-05-22 07:55
同情楼主,呵呵!不过还是赞一个,我也是自己研究的,本想公布的,但是由于代码是给公司做的,出于职业道德不公布。
cheng_5103
驱动牛犊
驱动牛犊
  • 注册日期2003-10-06
  • 最后登录2012-03-21
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望228点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-05-22 09:46
我有很完整很稳定的HOOK方法代码等..可以讨论下吗?
cheng
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
8楼#
发布于:2008-05-22 12:29
一直在linux模块游荡,好久没有到ndis模块来了。真的感觉现在论坛没有以前的热闹了。

ndis hook有两种方式:一种直接hook Ndis库, 一种添加伪协议。

我曾经做的是直接Hook ndis库,并用流算法加密。还算稳定。只是后来和卡巴的高版本有些冲突。

如果技术相同,有时间可以讨论问题。

研究问题真的很枯燥,当时我是从头到尾看遍了每个帖子阿,一个字累。

所以现在喜欢开源的。因为感觉开源的思想比较好,就是大家努力解决新的问题,新的技术,新的内容。

而不是像这样跟着ms屁股跑,都是研究些他的技术,可是他的技术已经有了,人家已经开始研究新的技术了,而我们刚开始研究它已有的技术,it怎么发展起来啊?在已有基础上不断hook,hook的,想想这样对创新技术感觉不到太大的意义,很没成就感。

唉,就在大家还对技术藏着掖着的时候,还是去开源吧。
走走看看开源好 Solaris vs Linux
游客

返回顶部