send()如何在omnet ++中工作

时间:2015-09-19 11:57:50

标签: omnet++ inet tcpreplay

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

我为什么要问?因为我正在尝试为执行重播攻击的恶意主机“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)Eve收到的数据包,当它正在通往合法目的地的途中。 现在,我可以稍后发送重复的数据包,它将具有原始源地址或者我应该深入挖掘层以伪造源地址以获得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()方法是否自动将传出数据包的源地址设置为当前主机地址?如果是这样,那么我的重播尝试不起作用......

1 个答案:

答案 0 :(得分:0)

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

另一方面,模块下方标准主机中的模块可以在数据包发送到网络之前执行任何操作。现在在这种实际情况下,源IP地址由附加到数据包的控制信息确定。 dup() - 数据包也会复制该信息,因此IP地址也是一样的。