首页
社区
课程
招聘
[旧帖] [讨论][讨论]关于 另类挂钩-RING3数据包监视 如何修改数据发送的问题 0.00雪花
发表于: 2012-7-20 14:50 995

[旧帖] [讨论][讨论]关于 另类挂钩-RING3数据包监视 如何修改数据发送的问题 0.00雪花

2012-7-20 14:50
995
看了 qihoocom 另类挂钩-RING3数据包监视,确实很高深,
就想来试试把截获的数据包进行修改,但是在数据拷贝的时候经常挂掉
在网查也没有找到相关解释,看到有人说是得先修改数据,再调用原函数,
我也试过但还是没有成功,这里好像收包的时候有点问题把,下面贴出我的源码

#define LONG_BUFFER 5120

NTSTATUS __stdcall NewNtDeviceIoControlFile(
        HANDLE FileHandle,
        HANDLE Event OPTIONAL,
        PVOID ApcRoutine OPTIONAL,
        PVOID ApcContext OPTIONAL,
        PVOID IoStatusBlock,
        ULONG IoControlCode,
        PVOID InputBuffer OPTIONAL,
        ULONG InputBufferLength,
        PVOID OutputBuffer OPTIONAL,
        ULONG OutputBufferLength
        )
{
        //先调用原始函数
        LONG stat = 0;
        //如果原始函数失败了(例如RECV无数据)

        //检查是否为TCP收发指令
        if (IoControlCode != AFD_SEND && IoControlCode != AFD_RECV)
        {
              // 如果不是TCP包调用原函数发送
                __asm
                {
                        push  OutputBufferLength
                        push  OutputBuffer
                        push  InputBufferLength
                        push  InputBuffer
                        push  IoControlCode
                        push  IoStatusBlock
                        push  ApcContext
                        push  ApcRoutine
                        push  Event
                        push  FileHandle
                        call  pNtDeviceIoControl
                        mov   stat,eax
                }
                if (!NT_SUCCESS(stat))
                {
                        return stat;
                }
                return stat;
        }
        //访问AFD INFO结构,获得SEND或RECV的BUFFER信息
        //这里可能是有问题的BUFFER,因此我们要加TRY EXCEPT
        __try
        {
                //从InputBuffer得到Buffer和Len

                PAFD_INFO AfdInfo = (PAFD_INFO)InputBuffer;
                PVOID Buffer = AfdInfo->BufferArray->buf;
                ULONG Len = AfdInfo->BufferArray->len;

                if (IoControlCode == AFD_SEND)
                {
                        if (LookupSendPacket(Buffer , Len))
                        {
                                //输出包内容
                                //这里输出调试信息,可以用DbgView查看,如果有UI可以做成SendMessage形式~
                                OutputDebugStringA("SendPacket!\n");
                                OutputDebugStringA((char*)Buffer);
                               // 比如要将baidu 替换成google
                                TCHAR szErrorUNC[100] = {_T("baidu")};
                                TCHAR szRightUNC[100] = {_T("google")};

                                char szBuf[LONG_BUFFER] = {0};
                                strcpy_s(szBuf, sizeof(szBuf), (char*)Buffer);
                                // 查找是否存在错误字段
                                char* p_unc = strstr(szBuf, szErrorUNC);
                                if (p_unc != NULL)
                                {
                                        // 修改数据包, 字符串替换
                                        StrReplace(szBuf, sizeof(szBuf), szRightUNC, szErrorUNC);
                                        int iSize = _tcslen(szBuf);
                                        AfdInfo->BufferArray->len = _tcslen(szBuf);

                                        // 现在这里就是要修改数据包,然后调用原函数发送数据,但是拷贝的时候会挂掉
                                        //memcpy(AfdInfo->BufferArray->buf, szBuf, iSize);
                                        //memcpy(InputBuffer, AfdInfo, sizeof(AfdInfo));
                                        // 修改完调用原函数
                                        __asm
                                        {
                                        push  OutputBufferLength
                                        push  OutputBuffer
                                        push  InputBufferLength
                                        push  InputBuffer
                                        push  IoControlCode
                                        push  IoStatusBlock
                                        push  ApcContext
                                        push  ApcRoutine
                                        push  Event
                                        push  FileHandle
                                        call  pNtDeviceIoControl
                                        mov   stat,eax
                                        }
                                }
                        }
                }
                else
                {
                         // 如果改成发送后调用原函数,就收不到数据包了
                        if (LookupRecvPacket(Buffer , Len))
                        {
                                OutputDebugStringA("RecvPacket!\n");
                                OutputDebugStringA((char*)Buffer);
                        }
                }
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                return stat;
        }
        return stat;
}
不知道大家有没有这样去试过,帮帮忙看有什么办法能解决,先谢谢各位了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//