首页
社区
课程
招聘
[求助]64 NDIS 驱动 获取并访问TCP头问题
2013-9-5 16:06 14443

[求助]64 NDIS 驱动 获取并访问TCP头问题

2013-9-5 16:06
14443
64 NDIS 驱动 获取并访问TCP头问题

            if((Length - HeaderLength) < TCP_HEADER_LENGTH)
                        {
                                //
                                // if Buffer is NULL or Invalid Address, It can bring a bug check
                                // 0x1e.
                                //
                                NdisGetNextBuffer(Buffer, &Buffer);
                                if(Buffer == NULL) return STATUS_PASS;
                                NdisQueryBufferSafe(Buffer, &VirtualAddress, &Length, HighPagePriority);
                                if(VirtualAddress != NULL && Length >= TCP_HEADER_LENGTH)
                                {
                                        pTcpHeader = (PTCP_HEADER)(VirtualAddress);
                                }
                                else
                                {
                                        return STATUS_PASS;
                                }
                        }
                        else
                        {
                                pTcpHeader = (PTCP_HEADER)((DWORD)pIPHeader + HeaderLength);
                        }

    访问时系统崩溃!
    pTcpHeader->SourcePort ,pTcpHeader->DestinationPort


   32位下没有问题?

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 0
打赏
分享
最新回复 (7)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seaching 2013-9-5 17:01
2
0
kd> !analyze -v
ERROR: FindPlugIns 80070015
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: 000000000259afca, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff88004cbde7d, address which referenced memory

Debugging Details:
------------------

READ_ADDRESS: GetPointerFromAddress: unable to read from fffff800040cf0e8
000000000259afca

CURRENT_IRQL:  2

FAULTING_IP:
passthru!AnalysisPacket+4cd [f:\work_ndis\sys\analysispacket.c @ 335]
fffff880`04cbde7d 440fb74002      movzx   r8d,word ptr [rax+2]

CUSTOMER_CRASH_COUNT:  1

DEFAULT_BUCKET_ID:  VISTA_DRIVER_FAULT

BUGCHECK_STR:  0xD1

PROCESS_NAME:  svchost.exe

LAST_CONTROL_TRANSFER:  from 0000000000000000 to 0000000000000000

STACK_TEXT:  
00000000`00000000 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : 0x0

STACK_COMMAND:  .bugcheck ; kb

FOLLOWUP_IP:
passthru!AnalysisPacket+4cd [f:\work_ndis\sys\analysispacket.c @ 335]
fffff880`04cbde7d 440fb74002      movzx   r8d,word ptr [rax+2]

FAULTING_SOURCE_CODE:  
   331:                         pBiosBuffer = (void*)VirtualAddress;
   332:                         }
   333:                         }*/
   334:
>  335:                         DbgPrint(" ### SourcePort=%u  DestinationPort=%u" ,pTcpHeader->SourcePort ,pTcpHeader->DestinationPort);
   336:
   338:
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seaching 2013-9-5 17:03
3
0
32位下访问没有问题,64位下崩溃,有没有搞过NDIS 64 的高手呀,帮忙指定一下,谢了!
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
SilentGamb 1 2013-9-5 17:21
4
0
zhouws 真厉害~
雪    币: 3054
活跃值: (1194)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
zhouws 2 2013-9-5 17:26
5
0
pTcpHeader = (PTCP_HEADER)((DWORD)pIPHeader + HeaderLength);
貌似是强制转成DWORD后,把高位地址丢掉了。。
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seaching 2013-9-5 17:49
6
0
谢谢各位回复,

zhouws 说的对!

改成:
  pTcpHeader = (PTCP_HEADER)((char*)pIPHeader + HeaderLength);

可以了!
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
SilentGamb 1 2013-9-5 17:54
7
0
(DWORD)pIPHeader + HeaderLength, 在x86下,取的地址也是错的. 为什么不崩溃?
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
mccoysc 2013-9-5 20:00
8
0
先搞清楚基本原理好不……32位下指针长度本来就是DWORD长度,所以以DWORD方式加减当然没问题,64位下,指针是QWORD长度,人家实际是8字节,你非得只处理4字节,为什么不出问题?
游客
登录 | 注册 方可回帖
返回