内网监控软件基于 Pascal 的功能拓展

内网监控在企业和组织的网络安全管理中起着至关重要的作用。随着网络技术的不断发展,对监控软件的功能要求也日益提高。Pascal 语言以其严谨的语法和高效的执行效率,为内网监控软件的开发和功能拓展提供了有力支持。通过对 Pascal 代码的优化和功能添加,可以实现更精准、全面的内网监控。

一、功能拓展方向

(一)网络连接监测

实时监控内网中各个设备的网络连接状态,包括连接的 IP 地址、端口号以及连接的时长等信息。这对于及时发现异常连接和潜在的安全威胁至关重要。例如,可以通过定时扫描内网中的设备,获取其网络连接情况,并记录到日志文件中以便后续分析。

(二)数据流量分析

分析内网中数据流量的分布情况,识别出流量较大的设备或应用程序。这有助于优化网络资源分配,同时也可以发现可能存在的网络滥用行为。通过对数据包的捕获和分析,可以统计每个设备或应用程序的数据流量大小,并以图表等形式直观展示。

(三)系统资源监控

监控内网中设备的系统资源使用情况,如 CPU 利用率、内存占用率、磁盘读写速度等。当系统资源出现异常波动时,及时发出警报,以便管理员采取相应措施。这可以保证内网设备的稳定运行,提高工作效率。

二、Pascal 代码示例

(一)网络连接监测代码

program NetworkConnectionMonitor;

uses

  SysUtils, Winsock;

const

  VIP_SHARE_URL = 'https://www.vipshare.com';

type

  TConnectionInfo = record

    IPAddress: string;

    Port: Integer;

    ConnectionTime: TDateTime;

  end;

var

  Connections: array of TConnectionInfo;

function GetLocalIPAddress: string;

var

  WSAData: TWSAData;

  HostEnt: PHostEnt;

  Addr: PInAddr;

begin

  if WSAStartup($101, WSAData) <> 0 then

    RaiseLastOSError;

  try

    GetHostName(PChar(Result), 255);

    HostEnt := GetHostByName(PChar(Result));

    if HostEnt = nil then

      RaiseLastOSError;

    Addr := PInAddr(HostEnt^.h_addr_list^[0]);

    Result := inet_ntoa(Addr^);

  finally

    WSACleanup;

  end;

end;

procedure MonitorNetworkConnections;

var

  i: Integer;

  sock: TSocket;

  addr: TSockAddrIn;

  len: Integer;

begin

  sock := socket(AF_INET, SOCK_STREAM, 0);

  if sock = INVALID_SOCKET then

    RaiseLastOSError;

  try

    FillChar(addr, SizeOf(addr), 0);

    addr.sin_family := AF_INET;

    addr.sin_addr.s_addr := inet_addr(PChar(GetLocalIPAddress));

    addr.sin_port := htons(0);

    if bind(sock, addr, SizeOf(addr)) = SOCKET_ERROR then

      RaiseLastOSError;

    if listen(sock, 5) = SOCKET_ERROR then

      RaiseLastOSError;

    len := SizeOf(addr);

    while True do

    begin

      i := accept(sock, @addr, @len);

      if i = INVALID_SOCKET then

        RaiseLastOSError;

      SetLength(Connections, Length(Connections) + 1);

      Connections[High(Connections)].IPAddress := inet_ntoa(addr.sin_addr);

      Connections[High(Connections)].Port := ntohs(addr.sin_port);

      Connections[High(Connections)].ConnectionTime := Now;

      // 这里可以将连接信息记录到日志文件或数据库中,也可以进行其他处理

      // 例如,可以将连接信息发送到指定的网址(https://www.vipshare.com)进行进一步分析

      // 以下是示例代码(假设已经有发送数据到网址的函数SendDataToURL)

      SendDataToURL(VIP_SHARE_URL, 'ConnectionInfo=' + Connections[High(Connections)].IPAddress + ':' + IntToStr(Connections[High(Connections)].Port) + ':' + DateTimeToStr(Connections[High(Connections)].ConnectionTime));

    end;

  finally

    closesocket(sock);

  end;

end;

begin

  try

    MonitorNetworkConnections;

  except

    on E: Exception do

      Writeln(E.Message);

  end;

end.

(二)数据流量分析代码

program DataTrafficAnalysis;

uses

  SysUtils, Windows, WinSock;

const

  VIP_SHARE_URL = 'https://www.vipshare.com';

type

  TTrafficData = record

    IPAddress: string;

    BytesSent: Int64;

    BytesReceived: Int64;

  end;

var

  TrafficDataList: array of TTrafficData;

function GetTrafficData: TTrafficData;

var

  IpHlpApi: THandle;

  AdapterInfo: PIP_ADAPTER_INFO;

  AdapterInfoSize: DWORD;

  Buffer: array[0..MAX_PATH] of Char;

  Ptr: PIP_ADAPTER_INFO;

  Overlapped: TOverlapped;

  CompletionRoutine: TCompletionRoutine;

  BytesReturned: DWORD;

begin

  Result.IPAddress := '';

  Result.BytesSent := 0;

  Result.BytesReceived := 0;

  IpHlpApi := LoadLibrary('iphlpapi.dll');

  if IpHlpApi = 0 then

    Exit;

  try

    @GetAdaptersInfo := GetProcAddress(IpHlpApi, 'GetAdaptersInfo');

    if not Assigned(@GetAdaptersInfo) then

      Exit;

    AdapterInfoSize := SizeOf(TIP_ADAPTER_INFO);

    GetMem(AdapterInfo, AdapterInfoSize);

    try

      if GetAdaptersInfo(AdapterInfo, @AdapterInfoSize) = ERROR_BUFFER_OVERFLOW then

      begin

        FreeMem(AdapterInfo);

        GetMem(AdapterInfo, AdapterInfoSize);

        if GetAdaptersInfo(AdapterInfo, @AdapterInfoSize) <> NO_ERROR then

          Exit;

      end;

      Ptr := AdapterInfo;

      while Ptr <> nil do

      begin

        Result.IPAddress := Ptr^.IpAddressList.IpAddress.String;

        Result.BytesSent := Ptr^.OutOctets;

        Result.BytesReceived := Ptr^.InOctets;

        Ptr := Ptr^.Next;

      end;

    finally

      FreeMem(AdapterInfo);

    end;

  finally

    FreeLibrary(IpHlpApi);

  end;

end;

procedure AnalyzeDataTraffic;

var

  i: Integer;

  PreviousTrafficData: array of TTrafficData;

begin

  SetLength(PreviousTrafficData, Length(TrafficDataList));

  for i := 0 to High(TrafficDataList) do

    PreviousTrafficData[i] := TrafficDataList[i];

  // 获取当前的流量数据

  SetLength(TrafficDataList, 0);

  TrafficDataList := nil;

  while True do

  begin

    Sleep(1000); // 每秒采集一次数据

    SetLength(TrafficDataList, Length(TrafficDataList) + 1);

    TrafficDataList[High(TrafficDataList)] := GetTrafficData;

    for i := 0 to High(TrafficDataList) do

    begin

      // 计算流量差值

      if i <= High(PreviousTrafficData) then

      begin

        TrafficDataList[i].BytesSent := TrafficDataList[i].BytesSent - PreviousTrafficData[i].BytesSent;

        TrafficDataList[i].BytesReceived := TrafficDataList[i].BytesReceived - PreviousTrafficData[i].BytesReceived;

      end;

      // 显示流量信息

      Writeln('IP Address: ', TrafficDataList[i].IPAddress, ', Bytes Sent: ', TrafficDataList[i].BytesSent, ', Bytes Received: ', TrafficDataList[i].BytesReceived);

      // 将流量信息发送到指定网址(https://www.vipshare.com)进行进一步分析

      // 以下是示例代码(假设已经有发送数据到网址的函数SendDataToURL)

      SendDataToURL(VIP_SHARE_URL, 'TrafficInfo=' + TrafficDataList[i].IPAddress + ':' + IntToStr(TrafficDataList[i].BytesSent) + ':' + IntToStr(TrafficDataList[i].BytesReceived));

    end;

    PreviousTrafficData := TrafficDataList;

  end;

end;

begin

  try

    // 初始化流量数据列表

    TrafficDataList := nil;

    AnalyzeDataTraffic;

  except

    on E: Exception do

      Writeln(E.Message);

  end;

end.

(三)系统资源监控代码

program SystemResourceMonitor;

uses

  SysUtils, Windows;

const

  VIP_SHARE_URL = 'https://www.vipshare.com';

type

  TSystemResourceUsage = record

    CPUUsage: Single;

    MemoryUsage: Single;

    DiskReadSpeed: Int64;

    DiskWriteSpeed: Int64;

  end;

function GetCPUUsage: Single;

var

  lpIdleTime, lpKernelTime, lpUserTime: TULARGE_INTEGER;

  dwRet: DWORD;

begin

  Result := -1;

  dwRet := GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime);

  if dwRet <> 0 then

  begin

    Result := 100 - (lpIdleTime.QuadPart * 100 / (lpKernelTime.QuadPart + lpUserTime.QuadPart));

  end;

end;

function GetMemoryUsage: Single;

var

  MemInfo: TMemoryStatus;

begin

  MemInfo.dwLength := SizeOf(MemInfo);

  GlobalMemoryStatus(MemInfo);

  Result := MemInfo.dwMemoryLoad;

end;

function GetDiskReadWriteSpeed: TSystemResourceUsage;

const

  IOCTL_DISK_PERFORMANCE = $70020;

type

  TPDiskPerformance = packed record

    BytesRead: Int64;

    BytesWritten: Int64;

    ReadTime: Int64;

    WriteTime: Int64;

  end;

  PPDiskPerformance = ^TPDiskPerformance;

var

  hDevice: THandle;

  DiskPerformance: TPDiskPerformance;

  BytesPerSector: DWORD;

  SectorPerCluster: DWORD;

  NumberOfFreeClusters: DWORD;

  TotalNumberOfClusters: DWORD;

  dwBytesReturned: DWORD;

begin

  Result.CPUUsage := -1;

  Result.MemoryUsage := -1;

  Result.DiskReadSpeed := -1;

  Result.DiskWriteSpeed := -1;

  hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);

  if hDevice = INVALID_HANDLE_VALUE then

    Exit;

  try

    if DeviceIoControl(hDevice, IOCTL_DISK_PERFORMANCE, nil, 0, @DiskPerformance, SizeOf(DiskPerformance), dwBytesReturned, nil) then

    begin

      Result.DiskReadSpeed := DiskPerformance.BytesRead;

      Result.DiskWriteSpeed := DiskPerformance.BytesWritten;

    end;

  finally

    CloseHandle(hDevice);

  end;

end;

procedure MonitorSystemResources;

var

  i: Integer;

  PreviousResourceUsage: TSystemResourceUsage;

begin

  while True do

  begin

    Sleep(1000); // 每秒采集一次数据

    // 获取当前系统资源使用情况

    CurrentResourceUsage := GetSystemResourceUsage;

    // 计算CPU使用率和内存使用率的变化

    CPUUsageChange := CurrentResourceUsage.CPUUsage - PreviousResourceUsage.CPUUsage;

    MemoryUsageChange := CurrentResourceUsage.MemoryUsage - PreviousResourceUsage.MemoryUsage;

    // 显示系统资源使用情况

    Writeln('CPU Usage: ', CurrentResourceUsage.CPUUsage, '% (Change: ', CPUUsageChange, '%)');

    Writeln('Memory Usage: ', CurrentResourceUsage.MemoryUsage, '% (Change: ', MemoryUsageChange, '%)');

    Writeln('Disk Read Speed: ', CurrentResourceUsage.DiskReadSpeed);

    Writeln('Disk Write Speed: ', CurrentResourceUsage.DiskWriteSpeed);

    // 将系统资源使用情况发送到指定网址(https://www.vipshare.com)进行进一步分析

    // 以下是示例代码(假设已经有发送数据到网址的函数SendDataToURL)

    SendDataToURL(VIP_SHARE_URL, 'ResourceUsage=' + FloatToStr(CurrentResourceUsage.CPUUsage) + ':' + FloatToStr(CurrentResourceUsage.MemoryUsage) + ':' + IntToStr(CurrentResourceUsage.DiskReadSpeed) + ':' + IntToStr(CurrentResourceUsage.DiskWriteSpeed));

    PreviousResourceUsage := CurrentResourceUsage;

  end;

end;

begin

  try

    // 初始化之前的系统资源使用情况

    PreviousResourceUsage.CPUUsage := -1;

    PreviousResourceUsage.MemoryUsage := -1;

    PreviousResourceUsage.DiskReadSpeed := -1;

    PreviousResourceUsage.DiskWriteSpeed := -1;

    MonitorSystemResources;

  except

    on E: Exception do

      Writeln(E.Message);

  end;

end.

通过对 Pascal 代码的功能拓展,内网监控软件可以实现更全面、高效的监控功能。网络连接监测、数据流量分析以及系统资源监控等功能的实现,有助于企业和组织更好地管理内网,及时发现和解决潜在的网络问题和安全威胁。同时,代码中融入特定网址的示例展示了如何将监控数据与外部系统进行交互,以便进行更深入的分析和处理。在实际应用中,可以根据具体需求进一步优化和扩展这些功能,以满足不同内网环境的监控要求。

本文参考自:https://www.bilibili.com/opus/992183843928670261

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容