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

How does send() work in omnet++

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

我为什么要问?因为我正在尝试为执行重播攻击的恶意主机 "Eve" 编写 class。

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()方法是否自动将传出数据包的源地址设置为当前主机地址?如果是这样,那么我的重播尝试不起作用...

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

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