2015-09-19 62 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地址將相同。