リミット値の書き換え手順は、以下の通りです。

1. EnumDeviceDrivers()とGetDeviceDriverBaseName() APIにて、TCPIP.SYSファイルのロード・アドレス(dwDriverLoadAddress)とパスを求める。

2. TCPIP.SYSファイルのファイル・バージョンを取得し、テーブルから「mov _ActiveOpenProgressThreshold, 0Ah」命令のオフセット・アドレス(dwInstructionOffset)を取得する。

3. TCPIP.SYSファイルを開き、PEヘッダをパースしてイメージ・ベース・アドレス(dwImageBase)を求める。

4. mov命令の第一オペランド(dwInstructionOffset + 2)から、_ActiveOpenProgressThresholdの相対アドレス(dwOffset_Target) を求める。

5. リミット値が格納されているアドレス(dwThresholdAddr = dwOffset_Target - dwImageBase + dwDriverLoadAddress)を求める。

6. dwThresholdAddrと新しいリミット値を、動的に生成したカーネル・メモリ書き換え用ドライバに渡し、書き換えを実行する。

 TCP同時接続数がリミットに達すると、以下のようなシステム・イベントが発生します。


図3 TCP同時接続数が制限数に達すると発生するシステム・イベント

 以下のように、ノンブロッキングのTCPソケットを作成し、存在しないホストの適当なポートに一斉接続してみると、このイベントを発生させることができます。TCP同時接続数制限の回避がうまく動作している場合は、以下のようなコードを実行しても、このイベントは発生しなくなります。

for (i=0;i<4096;i++){
    sock[i]=socket(AF_INET,SOCK_STREAM,0);
    if (sock[i]==INVALID_SOCKET) break;
    ioctlsocket(sock[i],FIONBIO,&on);
    addr.sin_family = AF_INET;
    addr.sin_port = htons((USHORT)atoi(TARGET_PORT));
    addr.sin_addr.s_addr = htonl(ntohl(inet_addr(TARGET_ADDR))+i);
    connect(sock[i],(struct sockaddr *)&addr, sizeof(addr));
}

さいごに

 前述したように、リミット値を大きくすると、そのマシンが万一ワームなどに感染した場合でも、他のマシンへの攻撃が抑制されません。Biotをお使いになる場合は、くれぐれもその点に気をつけてください。また、TCP同時接続数制限をアプリケーションで回避する場合は、ユーザーにその旨を十分に説明しておく必要があるでしょう。

この先は会員の登録が必要です。有料会員(月額プラン)は申し込み初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら