能力值:
( LV2,RANK:10 )
|
-
-
2 楼
WS2_32!send是要调用NtDeviceIoControlFile的
|
能力值:
( 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)
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
IoControlCode 要变化
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
#define AFD_RECV 0x12017
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
看错内容。。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
有人知道吗?
|
能力值:
( 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;
}
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
楼主可以跟踪一下.net程序中的socket的实现,那里面有大量的未定义的IoControlCode来实现那些公开的socket函数。也就是说,对应一个公开的socket函数,可能有不同的IoControlCode都可以实现。当然这只是我观察到一个结果,具体的对IoControlCode的解析应该要进入到ring0来考察具体的代码才能确定这种一对多的关系。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
老老实实把mj的那个代码调顺了再来改
if (!NT_SUCCESS(stat))
{
break;
}
这么多break,这都是神马......
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
楼上的,我是设计为单入口,单出口,所以使用了break
|
能力值:
( 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);
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
代码没错,只是异步模式下的recv是不会经过NtDeviceIoControlFile
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
搞定了,跟recv是在同步模式还是异步模式下无关,跟PAFD_INFO结构有关,结贴!
|
|
|