首页
社区
课程
招聘
[求助]WS2_32!recv接收到的数据包好像没有走NtDeviceIoControlFile
发表于: 2012-7-19 15:34 9895

[求助]WS2_32!recv接收到的数据包好像没有走NtDeviceIoControlFile

2012-7-19 15:34
9895
http://bbs.pediy.com/showthread.php?t=81204
在大牛的文章中说,WS2_32!recv也走NtDeviceIoControlFile,但是,实际情况是:WS2_32!recv接收到的数据包,而hook NtDeviceIoControlFile的例程,没有收到!为什么?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
WS2_32!send是要调用NtDeviceIoControlFile的
2012-7-19 15:35
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
typedef struct  _AFD_RECV_INFO {
    PAFD_WSABUF                                BufferArray;
    ULONG                                BufferCount;
    ULONG                                AfdFlags;
    ULONG                                TdiFlags;
} AFD_RECV_INFO , *PAFD_RECV_INFO ;

#define FSCTL_AFD_BASE                  FILE_DEVICE_NETWORK
#define AFD_RECV                        5
#define METHOD_NEITHER            3

#define _AFD_CONTROL_CODE(Operation,Method) \
  ((FSCTL_AFD_BASE)<<12 | (Operation<<2) | Method)

#define IOCTL_AFD_RECV \
  _AFD_CONTROL_CODE(AFD_RECV, METHOD_NEITHER)
2012-7-19 16:07
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
IoControlCode 要变化
2012-7-19 16:09
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
#define AFD_RECV 0x12017
2012-7-19 16:35
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看错内容。。
2012-7-19 16:57
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有人知道吗?
2012-7-20 09:34
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
代码如下:
                __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
                }

                //如果原始函数失败了(例如RECV无数据)

                if (!NT_SUCCESS(stat))
                {
                        break;
                }

                //检查是否为TCP收发指令

                if ( IoControlCode != AFD_SEND
                        && IoControlCode != AFD_RECV)
                {
                        _stprintf_s( szOut , 10240 , _T("IoControlCode = 0X%X\n") ,  IoControlCode );
                        OutputDebugString(szOut);
                        break;
                }

                //访问AFD INFO结构,获得SEND或RECV的BUFFER信息
                //这里可能是有问题的BUFFER,因此我们要加TRY EXCEPT
                //

                if ( CheckReadMemory( InputBuffer ,  sizeof(PAFD_INFO)) )
                {
                        break;
                }

                //从InputBuffer得到Buffer和Len

                AfdInfo = (PAFD_INFO)InputBuffer ;
                if( AfdInfo == NULL )
                {
                        _stprintf_s( szOut , 10240 , _T("[fdInfo == NULL] IoControlCode = 0X%X\n") ,  IoControlCode );
                        OutputDebugString(szOut);
                        break;
                }

                if ( CheckReadMemory( AfdInfo->BufferArray->buf ,  AfdInfo->BufferArray->len ) )
                {
                        break;
                }

                Buffer = AfdInfo->BufferArray->buf ;
                Len = AfdInfo->BufferArray->len;

                if ( CheckReadMemory( AfdInfo->BufferArray->buf ,  Len ) )
                {
                        break;
                }

                memset( szOut , 0 , 10240 );

                switch( IoControlCode )
                {
                case AFD_SEND:
                        {
                                sprintf_s( szOut , 10240 , "%u_AFD_SEND" , GetCurrentProcessId() );
                        }
                        break;
                case AFD_RECV:
                        {
                                sprintf_s( szOut , 10240, "%u_AFD_RECV" , GetCurrentProcessId() );
                        }
                        break;
                default:break;
                }
2012-7-21 09:53
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
楼主可以跟踪一下.net程序中的socket的实现,那里面有大量的未定义的IoControlCode来实现那些公开的socket函数。也就是说,对应一个公开的socket函数,可能有不同的IoControlCode都可以实现。当然这只是我观察到一个结果,具体的对IoControlCode的解析应该要进入到ring0来考察具体的代码才能确定这种一对多的关系。
2012-7-21 10:43
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
老老实实把mj的那个代码调顺了再来改
if (!NT_SUCCESS(stat))
    {
      break;
    }
这么多break,这都是神马......
2012-7-21 11:26
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼上的,我是设计为单入口,单出口,所以使用了break
2012-7-21 15:14
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
do
        {
                __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
                }

                //如果原始函数失败了(例如RECV无数据)

                if (!NT_SUCCESS(stat))
                {
                        break;
                }

                //检查是否为TCP收发指令

                if ( IoControlCode != AFD_SEND
                        && IoControlCode != AFD_RECV)
                {
                        _stprintf_s( szOut , 10240 , _T("IoControlCode = 0X%X\n") ,  IoControlCode );
                        OutputDebugString(szOut);
                        break;
                }

                //访问AFD INFO结构,获得SEND或RECV的BUFFER信息
                //这里可能是有问题的BUFFER,因此我们要加TRY EXCEPT
                //

                if ( CheckReadMemory( InputBuffer ,  sizeof(PAFD_INFO)) )
                {
                        break;
                }

                //从InputBuffer得到Buffer和Len

                AfdInfo = (PAFD_INFO)InputBuffer ;
                if( AfdInfo == NULL )
                {
                        _stprintf_s( szOut , 10240 , _T("[fdInfo == NULL] IoControlCode = 0X%X\n") ,  IoControlCode );
                        OutputDebugString(szOut);
                        break;
                }

                if ( CheckReadMemory( AfdInfo->BufferArray->buf ,  AfdInfo->BufferArray->len ) )
                {
                        break;
                }

                Buffer = AfdInfo->BufferArray->buf ;
                Len = AfdInfo->BufferArray->len;

                if ( CheckReadMemory( AfdInfo->BufferArray->buf ,  Len ) )
                {
                        break;
                }

                memset( szOut , 0 , 10240 );

                switch( IoControlCode )
                {
                case AFD_SEND:
                        {
                                sprintf_s( szOut , 10240 , "%u_AFD_SEND" , GetCurrentProcessId() );
                        }
                        break;
                case AFD_RECV:
                        {
                                sprintf_s( szOut , 10240, "%u_AFD_RECV" , GetCurrentProcessId() );
                        }
                        break;
                default:break;
                }
        } while (0);
2012-7-21 15:16
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
代码没错,只是异步模式下的recv是不会经过NtDeviceIoControlFile
2012-7-21 15:22
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
搞定了,跟recv是在同步模式还是异步模式下无关,跟PAFD_INFO结构有关,结贴!
2012-7-23 06:54
0
游客
登录 | 注册 方可回帖
返回
//