0

さて、私はファイルシステム、レジストリ、およびネットワークアクティビティを監視するユーティリティを構築しています(プロセスごとに、選択したプロセスによるアクティビティのみ)。ミニフィルター ドライバーを開発することで、ファイル システムとレジストリ アクティビティの部分を完成させました。ただし、ネットワークに対してどのようにすればよいかわかりません。私がやりたいことは、sysinternal の TCPView が行うこととよく似ていますが、選択したプロセスによって ESTABLISHED 接続を監視したいだけです。接続ごとにリアルタイムで取得したいものは次のとおりです。

-プロトコル (TCP または UDP)

-送信元ポート

-リモート IP とポート

-[オプション] 監視が開始されてから特定の接続で転送されたバイト数

何を使えばいいですか?LSP について聞いたことがありますが、もう少し詳しく読んでみると、適切に機能する LSP を作成するのは非常に難しいことに気付きました。また、それらが時代遅れになっていること。問題は、このモジュールを学習して書くのに約 2 ~ 3 週間しかないことです。時間制限があるため、WFP のようなものには行きたくありません。ただし、非常に優れたチュートリアルがない限り、MSDN のドキュメントについて話しているわけではありません。これが NDIS などを使用して「簡単に」実行できるかどうかはわかりません。

とにかく、どうしよう、どこに力を注げばいいのか。LSP について学ぶことでリスクを負うべきか、それとも NDIS がタスクを達成するか、または何か他のことを行うべきでしょうか。私は今、ちょっと無知です。ここで私を助けて!

4

2 に答える 2

2

と を見てGetExtendedTcpTableくださいGetExtendedUdpTable。これらの API は、必要なもののほとんどを取得します。しかし、興味深いことに、私が書いたデモ コードではGetTcp6Table2代わりに を使用しています。

#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE

#include <windows.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <iphlpapi.h>
#include <Tcpestats.h>
#include <Tcpmib.h>
#include <Mstcpip.h>
#include <stdlib.h>
#include <stdio.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

PCWSTR
StringFromState(MIB_TCP_STATE State)
{
    switch (State)
    {
        case MIB_TCP_STATE_CLOSED:
            return L"CLOSED";
        case MIB_TCP_STATE_LISTEN:
            return L"LISTEN";
        case MIB_TCP_STATE_SYN_SENT:
            return L"SYN_SENT";
        case MIB_TCP_STATE_SYN_RCVD:
            return L"SYN_RCVD";
        case MIB_TCP_STATE_ESTAB:
            return L"ESTAB";
        case MIB_TCP_STATE_FIN_WAIT1:
            return L"FIN_WAIT1";
        case MIB_TCP_STATE_FIN_WAIT2:
            return L"FIN_WAIT2";
        case MIB_TCP_STATE_CLOSE_WAIT:
            return L"CLOSE_WAIT";
        case MIB_TCP_STATE_CLOSING:
            return L"CLOSING";
        case MIB_TCP_STATE_LAST_ACK:
            return L"LAST_ACK";
        case MIB_TCP_STATE_TIME_WAIT:
            return L"TIME_WAIT";
        case MIB_TCP_STATE_DELETE_TCB:
            return L"DELETE_TCB";
        default:
            return L"[Unknown]";
    }
}

LPWSTR (NTAPI *pRtlIpv6AddressToStringW)(const IN6_ADDR *, LPWSTR);

int __cdecl main()
{
    ULONG r;

    // We need to load this dynamically, because ntdll.lib doesn't export it
    HMODULE ntdll = LoadLibrary(L"ntdll");
    pRtlIpv6AddressToStringW = (decltype(pRtlIpv6AddressToStringW))GetProcAddress(ntdll, "RtlIpv6AddressToStringW");

    // Initial guess for the table size
    ULONG cbTable = 100;
    MIB_TCP6TABLE2 *table = nullptr;
    while (true)
    {
        table = (MIB_TCP6TABLE2*)malloc(cbTable);
        if (!table)
            return 1;
        r = GetTcp6Table2(table, &cbTable, FALSE);
        if (ERROR_INSUFFICIENT_BUFFER == r)
        {
            // Try again with bigger buffer
            free(table);
            continue;
        }
        else if (ERROR_SUCCESS == r)
        {
            break;
        }
        else
        {
            free(table);
            wprintf(L"GetTcp6Table2 = %u\n", r);
            return 1;
        }
    }

    // Print table heading
    wprintf(L"%56s %56s %10s %6s\n", L"Local endpoint", L"Remote endpoint", L"State", L"PID");
    for (ULONG i = 0; i < table->dwNumEntries; i++)
    {
        MIB_TCP6ROW2 const &entry = table->table[i];

        WCHAR localAddr[46];
        WCHAR remoteAddr[46];
        pRtlIpv6AddressToStringW(&entry.LocalAddr, localAddr);
        pRtlIpv6AddressToStringW(&entry.RemoteAddr, remoteAddr);

        WCHAR localEndpoint[56];
        WCHAR remoteEndpoint[56];
        swprintf_s(localEndpoint,  L"[%s]:%-5u", localAddr,  ntohs(entry.dwLocalPort));
        swprintf_s(remoteEndpoint, L"[%s]:%-5u", remoteAddr, ntohs(entry.dwRemotePort));

        wprintf(L"%56s %56s %10s %6u\n",
                localEndpoint, remoteEndpoint,
                StringFromState(entry.State),
                entry.dwOwningPid);
    }

    free(table);
    return 0;
}

出力例 (実際のアドレスは匿名化):

C:\>test.exe
                              Local endpoint                              Remote endpoint     State  PID
                                  [::]:80                                      [::]:0        LISTEN    4
                                  [::]:135                                     [::]:0        LISTEN  980
                                  [::]:445                                     [::]:0        LISTEN    4
                                  [::]:1025                                    [::]:0        LISTEN  692
[2001:xxxx:x:xxx:x:xxxx:xxx.xx.xxx.xx]:6044                 [xxxx:xxx:xxxx:xxxx::x]:443       ESTAB 3248
[2001:xxxx:x:xxx:x:xxxx:xxx.xx.xxx.xx]:6045                 [xxxx:xxx:xxxx:xxxx::x]:443       ESTAB 3248
  [2001:xxxx:xx:x:xxxx:xxxx:xxxx:xxxx]:53759 [2001:xxxx:xx:xxxx:xxx:xxxx:xxxx:xxxx]:135   TIME_WAIT    0
于 2013-02-14T21:14:55.247 に答える
0

Wireshark が使用する winpcap のようなものが必要なように思えます。

http://www.winpcap.org/

また、ReactOS の netstat コードも興味深いかもしれません

http://doxygen.reactos.org/dd/d3f/netstat_8c_source.html

于 2013-02-12T17:09:53.860 に答える