1

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

4

1 回答 1

1

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

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

于 2015-09-21T08:48:34.780 回答