Как send() работает в omnet++
Ли 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
) Ева получает, пока она на пути к законному месту назначения. Теперь я могу отправить дублированный пакет позже, и он будет иметь исходный адрес источника ИЛИ я должен копать глубже в слои, чтобы подделать адрес источника, чтобы вместо адреса Евы был адрес Боба? как ниже:
/*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 ответ
send()
это вызов API OMNeT++. Поскольку OMNeT++ - это просто универсальная среда моделирования дискретных событий, она ничего не знает о коде модели (поэтому она не может и не должна манипулировать им). IP-адрес определен в инфраструктуре INET, поэтому только код из инфраструктуры INET может его изменить.
С другой стороны, модули на стандартном хосте ниже вашего модуля могут делать все, что захотят, до того, как пакет будет отправлен в сеть. Теперь в этом фактическом случае IP-адрес источника определяется управляющей информацией, которая прикреплена к пакету. dup()
-ing пакет также копирует эту информацию, поэтому IP-адрес будет таким же.