2015-09-19 51 views
0

omnet ++中的send()是否将数据包的源地址设置为当前主机地址?send()如何在omnet ++中工作

我为什么要问?因为我试图编写一个类来执行重播攻击的恶意主机“Eve”。

void MalAODVRouter::handleMessage(cMessage *msg) 
{ 

    cMessage *ReplayMsg = msg->dup(); 
    AODVRouting::handleMessage(msg); 

    capturedMsgs++; 
    if (capturedMsgs==10) // One out of every 10 packets (frequency of replay) 
    { 
      //we can add a delay before sending the copy of the message again (1 time unit) 
      sendDelayed(ReplayMsg, 1,"ipOut"); 
      ReplayedMsgs++; 
      std::cout<<"Launched Replay Packet!\n"; 
      ev<<"Launched Replay Packet!\n"; 

      this->capturedMsgs=0; 
     // } 
    } 

} 

你可以在我的代码片段开始时我使用功能dup()复制数据包(msg)试图看到夏娃的接收,而其在它的道路上的合法目的。 现在,我可以稍后发送复制的数据包,它会有原始的源地址,或者我应该深入挖掘层以伪造源地址以获得Bob的地址而不是Eve的地址?象下面这样:

/*UDPPacket *udpPacket = dynamic_cast<UDPPacket *>(msg); 
      AODVControlPacket *ctrlPacket = check_and_cast<AODVControlPacket *>(udpPacket->decapsulate()); 
      IPv4ControlInfo *udpProtocolCtrlInfo = dynamic_cast<IPv4ControlInfo *>(udpPacket->getControlInfo()); 
      ASSERT(udpProtocolCtrlInfo != NULL); 
      IPv4Address sourceAddr = udpProtocolCtrlInfo->getSrcAddr();   //get Source Address 
      IPv4Address destinationAddr = udpProtocolCtrlInfo->getDestAddr(); //get Destination Address 
      IPv4Address addr = getSelfIPAddress(); 
      if (addr != destinationAddr)  // if it is not destined for "Eve" 
      { 
       UDPPacket *ReplayUDPPacket = udpPacket; 
       AODVControlPacket *ReplayCtrlPacket = check_and_cast<AODVControlPacket *>(ReplayUDPPacket->decapsulate()); 
       IPv4ControlInfo *ReplayUDPProtocolCtrlInfo = dynamic_cast<IPv4ControlInfo *>(ReplayUDPPacket->getControlInfo()); 
       ASSERT(ReplayUDPProtocolCtrlInfo != NULL); 
       ReplayUDPProtocolCtrlInfo->setSrcAddr(sourceAddr);   //Forge Source 
       ReplayUDPProtocolCtrlInfo->setDestAddr(destinationAddr); //Keep Destination 

    */ 

       //we can add a delay before sending the copy of the message again (1 time unit) 
       sendDelayed(ReplayMsg, 1,"ipOut"); 
       ReplayedMsgs++; 
       std::cout<<"Launched Replay Packet!\n"; 
       ev<<"Launched Replay Packet!\n"; 

       this->capturedMsgs=0; 

是否send()方法自动设置输出数据包的源地址到当前主机地址?如果是这样,那么我的重播尝试不起作用...

回答

0

send()是一个OMNeT ++ API调用。由于OMNeT ++只是一个通用的离散事件模拟框架,它并不知道模型代码的任何内容(所以它不能也不应该操纵它)。 IP地址是在INET框架中定义的,因此只有来自INET框架的代码才能更改它。

另一方面,在模块下面的标准主机中的模块可以在数据包发送到网络之前做他们想做的任何事情。现在在这种情况下,源IP地址由附加到数据包的控制信息决定。 dup() - 数据包也复制该信息,因此IP地址将相同。