阅读:1291回复:3
对17那段程序中的发送函数有些疑问,向mikeluo及诸位同仁请教!
程序如下:
// send函数开始 VOID _stdcall NSHIM_Send( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_PACKET Packet ) { USHORT sndkeyno; //传送密钥 UCHAR i; // 通过循环来找出那个visual adapter被绑定 for(i=0;i<BindingAdapterNum;i++){ if(BindingAdapterInfo.BindingHandle==NdisBindingHandle&& BindingAdapter Info.CtrlActived) // BindingAdapterInfo.CtrlActived什莫意思? break; } if(i==BindingAdapterNum) goto forward; // 没有绑定的visual adapter // NdisQueryPacket自己定义,返回当前发送包的长度 NdisQueryPacket(Packet, NULL, NULL, NULL, &CurSendPktLen); if(CurSendPktLen>MaxSendPktLen) MaxSendPktLen=CurSendPktLen; //SendBuffer是不是发送缓存的标示符?和CurSendBuffer有什莫区别? if(SendBuffer!=NULL){ // 为什莫要+1500* SendPktListHead?SendPktListHead是什莫含义? CurSendBuffer=SendBuffer+1500*SendPktListHead; SendMACHeader=(PMAC_HEADER)CurSendBuffer;// SendMACHeader什莫意思? SendIPHeader=(PIP_HEADER)(CurSendBuffer+MAC_HEADER_LEN); // CopyPacketToBuffer是不是把包的数据复制到CurSendBuffer所指的地址上? CopiedLen=CopyPacketToBuffer( CurSendBuffer, Packet, 0, MAC_HEADER_LEN //+IP_HEADER_LEN /*这个参数不知道什莫意思啊? ); if(SendMACHeader->ProtocolType==IP_PROTOCOL){ CopiedLen = CopyPacketToBuffer( CurSendBuffer+MAC_HEADER_LEN,//+IP_HEADER_LEN, Packet, MAC_HEADER_LEN, //+IP_HEADER_LEN, CurSendPktLen-MAC_HEADER_LEN //-IP_HEADER_LEN ); switch( QueryAccessList(SendIPHeader,QUERY_SEND_PACKET,&sndkeyno) ){ case PACKET_REFUSE : *Status=NDIS_STATUS_SUCCESS; return; case PACKET_CLEAR : break; case PACKET_MUD : CurSendPktLen = Encrypt_reg( (PUCHAR)SendIPHeader+IP_HEADER_LEN, CurSendPktLen-MAC_HEADER_LEN-IP_HEADER_LEN, sndkeyno ); CurSendPktLen += (MAC_HEADER_LEN+IP_HEADER_LEN); Old_cksum = SendIPHeader->HeaderCRC; SendIPHeader->HeaderCRC = 0; SendIPHeader->LengthL = (CurSendPktLen-MAC_HEADER_LEN)&0xff; SendIPHeader->LengthU = ((CurSendPktLen-MAC_HEADER_LEN)&0xff00)>>8; New_cksum = In_cksum((PUCHAR)SendIPHeader,20); SendIPHeader->HeaderCRC = New_cksum; break; } NdisQueryPacket(SendPktList[SendPktListHead], NULL, NULL, &BUFFER, NULL); if(BUFFER!=NULL){ NdisUnchainBufferAtBack( SendPktList[SendPktListHead],&BUFFER); NdisFreeBuffer(BUFFER); } NdisAllocateBuffer( &ReturnStatus, &BUFFER, SendBufferPoolHandle, CurSendBuffer, //VirtualAddress, CurSendPktLen //Length ); NdisChainBufferAtBack( SendPktList[SendPktListHead],BUFFER); SendPktList[SendPktListHead]->ProtocolReserved[0]=SendPktListHead; ReservedPkt[SendPktListHead]=Packet; NdisSendAddr( Status, NdisBindingHandle, SendPktList[SendPktListHead] ); if(*Status!=NDIS_STATUS_SUCCESS){ SendPktListHead++; if(SendPktListHead==MAX_SEND_PKT_LIST) SendPktListHead=0; } return; } } forward: _asm pop edi _asm pop esi _asm pop ebx //_asm pop ebp _asm leave _asm jmp [NdisSendAddr] } // send 函数结束 代码中的注释是一些我的理解和一些不明白的地方,我认为主要是有几个变量的含义不明白如: BindingAdapterInfo.CtrlActived MaxSendPktLen SendBuffer,CurSendBuffer SendPktList SendMACHeader,SendIPHeader |
|
沙发#
发布于:2003-10-16 13:00
17的代码我没有仔细的看过,对你有用的也就是hook的流程,如果你不用hook的话也就没有太大的用处了。他的那个代码是做vpn的,不过和你们要设计的结构肯定是千差万别的,贴出来的那部分代码也就是让你能了解一些hook的流程,对你做vpn没有什么帮助的。
|
|
|
板凳#
发布于:2003-10-16 13:01
17的代码我没有仔细的看过,对你有用的也就是hook的流程,如果你不用hook的话也就没有太大的用处了。他的那个代码是做vpn的,不过和你们要设计的结构肯定是千差万别的,贴出来的那部分代码也就是让你能了解一些hook的流程,对你做vpn没有什么帮助的。而且那是17在97年的时候写的,vpn的发展和现在也不可同日而语。
|
|
|
地板#
发布于:2003-10-16 13:10
谢谢斑竹了,看来还要在前进的道路上摸索!
|
|