リプレイ攻撃を行う悪意のあるノードで AODV ネットワークをシミュレートする C++ コードのスニペットが必要です。これを OMNet++ プロジェクトに埋め込む必要があります。
OMNet++ のサンプル プロジェクトで元のコードを変更しようとしましたが、出発点に戻ってしまいました。
助けを見つけるのは素晴らしいことです。
文字数がかなり長いため、サンプル コードを含めることはできません。これまでの試行を確認する必要がある場合は、プロジェクトを共有できる場所を教えてください。
OPの質問には詳細が欠けているため、ウィキペディアの記事のリプレイ攻撃の例に従って、模擬的な解決策を提供します。
アリスが自分の身元をボブに証明したいとします。ボブは身元の証明として自分のパスワードを要求し、アリスはそれを忠実に提供します (おそらくハッシュ関数のような変換の後)。その間、Eve は会話を盗聴し、パスワード (またはハッシュ) を保持します。インターチェンジが終了すると、イブ (アリスのふりをして) がボブに接続します。ID の証明を求められると、Eve は最後のセッションから読み取った Alice のパスワード (またはハッシュ) を送信し、Bob はこれを受け入れて Eve へのアクセスを許可します。
UDPPacket に送信元フィールドと宛先フィールドを追加して、特定のアプリケーションの目標を達成するために、新しいパケット (UDPPacket を拡張) を作成します。
cplusplus {{
#include "<directory_path_for_the_udp_packet_goes_here>/UDPPacket_m.h" // inheriting the parent class
}}
class ExtendedUDPPacket; // you can call it whatever you want
message ExtendedUDPPacket extends UDPPacket
{
string sourceNode; // name of the sender
string destinationNode; // name of the receiver
}
与えられた例の 3 つの異なるロールを見てみましょう。
各ノードがその名前を保持する特定の ID を持っていると考える場合、各ロールに対して次のことができます。
アリス:
void MalAODVRouter::handleMessage(cMessage *msg)
{
ExtendedUDPPacket *eUDPmsg = dynamic_cast<UDPPacket *>(msg);
if (this->myID == eUDPmsg->getDestinationNode()) // myID is "Alice"
{
ExtendedUDPPacket *ExtendedUDPPacket= new UDPPacket();
ExtendedUDPPacket->setSourceAddress(myID.c_str());
ExtendedUDPPacket->setDestinationAddress(std::string("Bob").c_str());
send(udpPacket, "ipOut");
}
}
イブ:
void MalAODVRouter::handleMessage(cMessage *msg)
{
ExtendedUDPPacket *eUDPmsg = dynamic_cast<UDPPacket *>(msg);
if (this->myID != eUDPmsg->getDestinationNode()) // myID is "Eve"
{
ExtendedUDPPacket *ExtendedUDPPacket= new UDPPacket();
ExtendedUDPPacket->setSourceAddress(std::string("Alice").c_str()); // fake the message
ExtendedUDPPacket->setDestinationAddress(std::string("Bob").c_str());
send(udpPacket, "ipOut");
}
}
ボブ:
void MalAODVRouter::handleMessage(cMessage *msg)
{
ExtendedUDPPacket *eUDPmsg = dynamic_cast<UDPPacket *>(msg);
if (eUDPmsg->getSourceNode() == 'Alice')
{
ExtendedUDPPacket *ExtendedUDPPacket= new UDPPacket();
ExtendedUDPPacket->setSourceAddress(std::string("Bob").c_str());
ExtendedUDPPacket->setDestinationAddress(std::string("Alice").c_str());
send(udpPacket, "ipOut");
}
}
これはモックの実装であることに注意してください。よりスマートな条件チェックを追加して、アプリケーションの動作を改善できます。