scan

unit ScanIPUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls, Mask, Spin, Buttons,
  Gauges, StrUtils, SyncObjs, IdBaseComponent, IdComponent, IdIPWatch, Menus,
  ImgList;

type
  TScanIPFm = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Splitter1: TSplitter;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    Panel4: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    SpinButton1: TSpinButton;
    Panel5: TPanel;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    SpinButton2: TSpinButton;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    Gauge2: TGauge;
    Gauge3: TGauge;
    RadioGroup1: TRadioGroup;
    Label3: TLabel;
    Edit9: TEdit;
    RadioGroup2: TRadioGroup;
    Panel6: TPanel;
    Label4: TLabel;
    Edit10: TEdit;
    Label5: TLabel;
    Edit11: TEdit;
    Label6: TLabel;
    Edit12: TEdit;
    Gauge1: TGauge;
    SpeedButton7: TSpeedButton;
    SpeedButton8: TSpeedButton;
    Panel7: TPanel;
    TreeView1: TTreeView;
    Panel8: TPanel;
    Timer1: TTimer;
    Label7: TLabel;
    Label8: TLabel;
    Gauge4: TGauge;
    SpinEdit1: TSpinEdit;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Panel9: TPanel;
    ListView1: TListView;
    Panel22: TPanel;
    Panel10: TPanel;
    Panel11: TPanel;
    SpeedButton9: TSpeedButton;
    Panel12: TPanel;
    SpeedButton11: TSpeedButton;
    SpeedButton12: TSpeedButton;
    SpeedButton13: TSpeedButton;
    SpeedButton15: TSpeedButton;
    SaveDialog1: TSaveDialog;
    ComboBox1: TComboBox;
    Label12: TLabel;
    IdIPWatch1: TIdIPWatch;
    PopupMenu1: TPopupMenu;
    PopupMenu2: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    ImageList1: TImageList;
    Gauge5: TGauge;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    procedure RadioGroup1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
    procedure Edit2KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit3KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit4KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit5KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit6KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit7KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit8KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpinButton1UpClick(Sender: TObject);
    procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Edit5MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinButton1DownClick(Sender: TObject);
    procedure SpinButton2DownClick(Sender: TObject);
    procedure SpinButton2UpClick(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure SpeedButton15Click(Sender: TObject);
    procedure SpeedButton11Click(Sender: TObject);
    procedure ListView1Click(Sender: TObject);
    procedure SpeedButton13Click(Sender: TObject);
    procedure RadioGroup2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure SpeedButton7Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure SpeedButton12Click(Sender: TObject);
  private
    { Private declarations }
  public
    FromA_IP, ToA_IP: Byte;
    FromB_IP, ToB_IP: Byte;
    FromC_IP, ToC_IP: Byte;
    FromD_IP, ToD_IP: Byte;
    procedure FillLocalIP;
    procedure GetTheScanIP;
    procedure PingPorcess;
    procedure ScanPortPorcess;
    procedure SingleHostScan;
    procedure SingleHostScan2;
    procedure MultiHostScan;
  end;
var
  ScanIPFm: TScanIPFm;
  OldEditText: string;
  FromEdit: TEdit;
  ToEdit: TEdit;
  LetPingSingle: TCriticalSection;
  LetScanSingle: TCriticalSection;
  SdPingCount: Integer;
  SdScanCount: integer;
  MultiPingCount: integer;
  MultiScanCount: integer;
implementation
uses
  PingThreadUnit, ScanPortThreadUnit, ScanHostPortThreadUnit, UserInfo;
{$R *.dfm}

procedure TScanIPFm.GetTheScanIP;
begin
  FromA_IP := StrToInt(Edit1.Text);
  ToA_IP := StrToInt(Edit5.Text);
  FromB_IP := StrToInt(Edit2.Text);
  ToB_IP := StrToInt(Edit6.Text);
  FromC_IP := StrToInt(Edit3.Text);
  ToC_IP := StrToInt(Edit7.Text);
  FromD_IP := StrToInt(Edit4.Text);
  ToD_IP := StrToInt(Edit8.Text);
end;

procedure TScanIPFm.FillLocalIP;
var
  i: integer;
  TheIndex: integer;
  TheIPStr: string;
begin
  try
    TheIPStr := ComboBox1.Text;
    for i := 1 to Length(TheIPStr) do
    begin
      if TheIPStr[i] = '.' then
      begin
        TheIndex := i;
        Edit1.Text := StrUtils.leftStr(TheIPStr, TheIndex - 1);
        Edit5.Text := Edit1.Text;
        TheIPStr := StrUtils.RightStr(TheIPStr, Length(TheIPStr) - TheIndex);
        break;
      end;
    end;
    for i := 1 to Length(TheIPStr) do
    begin
      if TheIPStr[i] = '.' then
      begin
        TheIndex := i;
        Edit2.Text := StrUtils.leftStr(TheIPStr, TheIndex - 1);
        Edit6.Text := Edit2.Text;
        TheIPStr := StrUtils.RightStr(TheIPStr, Length(TheIPStr) - TheIndex);
        break;
      end;
    end;
    for i := 1 to Length(TheIPStr) do
    begin
      if TheIPStr[i] = '.' then
      begin
        TheIndex := i;
        Edit3.Text := StrUtils.leftStr(TheIPStr, TheIndex - 1);
        Edit7.Text := Edit3.Text;
        TheIPStr := StrUtils.RightStr(TheIPStr, Length(TheIPStr) - TheIndex);
        break;
      end;
    end;
    Edit4.Text := TheIPStr;
    Edit8.Text := TheiPStr;
  except
  end;
end;

procedure TScanIPFm.PingPorcess;
var
  iA, iB, iC, iD: integer;
  ThePingIP: string;
  ThePingThread: PingThread;
  TheTimeStr: string;
  TotalCount: int64;
begin
  if SdPingCount > 0 then exit;
  Timer1.Enabled := True;
  TotalCount := 0;
  GetTheScanIP;
  TheTimeStr := TimeToStr(Time);
  for iA := FromA_IP to ToA_IP do
    for iB := FromB_IP to ToB_IP do
      for iC := FromC_IP to ToC_IP do
        for iD := FromD_IP to ToD_IP do
        begin
          TotalCount := TotalCount + 1;
        end;
  Gauge4.MaxValue := MultiPingCount;
  Gauge2.Progress := 0;
  try
    Gauge2.MaxValue := TotalCount;
  except
    beep;
    SpeedButton6.Down := True;
    Panel10.Caption := '搜索初始化错误!';
    Timer1.Enabled := False;
    exit;
  end;
  for iA := FromA_IP to ToA_IP do
    for iB := FromB_IP to ToB_IP do
      for iC := FromC_IP to ToC_IP do
        for iD := FromD_IP to ToD_IP do
        begin
          ThePingIP := IntToStr(iA) + '.' + IntToStr(iB) + '.' +
            IntToStr(iC) + '.' + IntToStr(iD);

          Edit1.Text := IntToStr(iA);
          Edit2.Text := IntToStr(iB);
          Edit3.Text := IntToStr(iC);
          Edit4.Text := IntToStr(iD);
          repeat //设置阻塞操作
            Application.ProcessMessages;
            Gauge4.Progress := SdPingCount;
            Panel10.Caption := '当前共发出' + IntToStr(SdPingCount) +
              '个搜索线程';
            if SpeedButton6.Down then
            begin
              repeat
                Application.ProcessMessages;
                Gauge4.Progress := SdPingCount;
                Panel10.Caption := '当前还有' + IntToStr(SdPingCount)
                  + '个搜索线程未返回,请稍候...';
              until SdPingCount = 0;
              SpeedButton6.Down := True;
              Timer1.Enabled := False;
              Gauge4.Progress := 0;
              TheTimeStr := '扫描时间从:' + TheTimeStr + '  到:' +
                TimeToStr(Time);
              Application.MessageBox(PChar(TheTimeStr), '扫描中断',
                MB_OK + MB_ICONSTOP);
              Panel10.Caption := '搜索线程已经全部返回_____OK!';
              exit;
            end;
          until SdPingCount < MultiPingCount;
          try
            ThePingThread := PingThread.Create(ThePingIP, ListView1);
          except
            beep;
            SpeedButton6.Down := True;
            Panel10.Caption := '搜索线程创建错误错误!';
          end;
          Gauge2.Progress := Gauge2.Progress + 1;
        end;
  repeat
    Application.ProcessMessages;
    Gauge4.Progress := SdPingCount;
    Panel10.Caption := '当前还有' + IntToStr(SdPingCount)
      + '个搜索线程未返回,请稍候...';

  until SdPingCount = 0;
  SpeedButton6.Down := True;
  Timer1.Enabled := False;
  TheTimeStr := '扫描时间从:' + TheTimeStr + '  到:' + TimeToStr(Time);
  Panel10.Caption := '搜索线程已经全部返回_____OK!';
  Gauge4.Progress := 0;
  Application.MessageBox(PChar(TheTimeStr), '扫描完毕',
    MB_OK + MB_ICONINFORMATION);
end;

procedure TScanIPFm.ScanPortPorcess;
var
  iA, iB, iC, iD: integer;
  ThePingIP: string;
  TheScanThread: ScanPortThread;
  TheTimeStr: string;
  TotalCount: int64;
begin
  if SdPingCount > 0 then exit;
  Timer1.Enabled := True;
  TotalCount := 0;
  GetTheScanIP;
  TheTimeStr := TimeToStr(Time);
  for iA := FromA_IP to ToA_IP do
    for iB := FromB_IP to ToB_IP do
      for iC := FromC_IP to ToC_IP do
        for iD := FromD_IP to ToD_IP do
        begin
          TotalCount := TotalCount + 1;
        end;
  Gauge4.MaxValue := MultiPingCount;
  Gauge2.Progress := 0;
  try
    Gauge2.MaxValue := TotalCount;
  except
    beep;
    SpeedButton6.Down := True;
    Panel10.Caption := '搜索初始化错误!';
    Timer1.Enabled := False;
    exit;
  end;
  for iA := FromA_IP to ToA_IP do
    for iB := FromB_IP to ToB_IP do
      for iC := FromC_IP to ToC_IP do
        for iD := FromD_IP to ToD_IP do
        begin
          ThePingIP := IntToStr(iA) + '.' + IntToStr(iB) + '.' +
            IntToStr(iC) + '.' + IntToStr(iD);

          Edit1.Text := IntToStr(iA);
          Edit2.Text := IntToStr(iB);
          Edit3.Text := IntToStr(iC);
          Edit4.Text := IntToStr(iD);
          repeat //设置阻塞操作
            Application.ProcessMessages;
            Gauge4.Progress := SdPingCount;
            Panel10.Caption := '当前共发出' + IntToStr(SdPingCount) +
              '个搜索线程';
            if SpeedButton6.Down then
            begin
              repeat
                Application.ProcessMessages;
                Gauge4.Progress := SdPingCount;
                Panel10.Caption := '当前还有' + IntToStr(SdPingCount)
                  + '个搜索线程未返回,请稍候...';
              until SdPingCount = 0;
              SpeedButton6.Down := True;
              Timer1.Enabled := False;
              Gauge4.Progress := 0;
              TheTimeStr := '扫描时间从:' + TheTimeStr + '  到:' +
                TimeToStr(Time);
              Application.MessageBox(PChar(TheTimeStr), '扫描中断',
                MB_OK + MB_ICONSTOP);
              Panel10.Caption := '搜索线程已经全部返回_____OK!';
              exit;
            end;
          until SdPingCount < MultiPingCount;
          try
            TheScanThread := ScanPortThread.Create(ThePingIP,
              StrToInt(Edit9.Text), ListView1);
          except
            beep;
            SpeedButton6.Down := True;
            Panel10.Caption := '搜索线程创建错误错误!';
          end;
          Gauge2.Progress := Gauge2.Progress + 1;
        end;
  repeat
    Application.ProcessMessages;
    Gauge4.Progress := SdPingCount;
    Panel10.Caption := '当前还有' + IntToStr(SdPingCount)
      + '个搜索线程未返回,请稍候...';

  until SdPingCount = 0;
  SpeedButton6.Down := True;
  Timer1.Enabled := False;
  TheTimeStr := '扫描时间从:' + TheTimeStr + '  到:' + TimeToStr(Time);
  Panel10.Caption := '搜索线程已经全部返回_____OK!';
  Gauge4.Progress := 0;
  Application.MessageBox(PChar(TheTimeStr), '扫描完毕',
    MB_OK + MB_ICONINFORMATION);
end;

procedure TScanIPFm.SingleHostScan;
var
  i: integer;
  ThePortScan: ScanHostPortThread;
  TheNewNode: TTreeNode;
  FromPort, ToPort: integer;
begin
  if SdScanCount <> 0 then exit;

  TheNewNode := TreeView1.Items.Add(nil, Edit10.Text);
  TheNewNode.ImageIndex := 0;
  TheNewNode.StateIndex := 0;
  TheNewNode.SelectedIndex := 0;
  Gauge1.MaxValue := StrToInt(Edit12.Text);
  Gauge1.Progress := 0;
  Gauge5.MaxValue := MultiScanCount;
  Gauge5.Progress := 0;
  FromPort := StrToInt(Edit11.text);
  ToPort := StrToInt(Edit12.text);
  for i := FromPort to ToPort do
  begin
    repeat
      Application.ProcessMessages;
      Gauge5.Progress := SdScanCount;
      if SpeedButton8.Down then
      begin
        repeat
          Application.ProcessMessages;
          Gauge5.Progress := SdScanCount;
        until SdScanCount = 0;
        Application.MessageBox('===扫描由您主动结束===', '扫描中断',
          MB_OK + MB_ICONSTOP);
        Gauge5.Progress := 0;
        exit;
      end;
    until SdScanCount < MultiScanCount;
    Gauge1.Progress := i;
    Gauge5.Progress := SdScanCount;
    Panel8.Caption := '扫描' + Edit10.Text + ':' + IntToStr(i);
    try
      ThePortScan := ScanHostPortThread.Create(Edit10.Text, i, TreeView1);
    except
    end;
  end;
  repeat
    Application.ProcessMessages;
    Gauge5.Progress := SdScanCount;
  until SdScanCount = 0;
  SpeedButton8.Down := True;
  Gauge5.Progress := 0;
  Application.MessageBox('===扫描任务完成!===', '扫描完毕',
    MB_OK + MB_ICONSTOP);
end;

procedure TScanIPFm.SingleHostScan2;
var
  i: integer;
  ThePortScan: ScanHostPortThread;
  FromPort, ToPort: integer;
begin

  Gauge1.MaxValue := StrToInt(Edit12.Text);
  Gauge1.Progress := 0;
  Gauge5.MaxValue := MultiScanCount;
  Gauge5.Progress := 0;
  FromPort := StrToInt(Edit11.text);
  ToPort := StrToInt(Edit12.text);
  for i := FromPort to ToPort do
  begin
    repeat
      Application.ProcessMessages;
      Gauge5.Progress := SdScanCount;
      if SpeedButton8.Down then
      begin
        repeat
          Application.ProcessMessages;
          Gauge5.Progress := SdScanCount;
        until SdScanCount = 0;
        Application.MessageBox('===扫描由您主动结束===', '扫描中断',
          MB_OK + MB_ICONSTOP);
        Gauge5.Progress := 0;
        exit;
      end;
    until SdScanCount < MultiScanCount;
    Gauge1.Progress := i;
    Gauge5.Progress := SdScanCount;
    Panel8.Caption := '扫描' + Edit10.Text + ':' + IntToStr(i);
    try
      ThePortScan := ScanHostPortThread.Create(Edit10.Text, i, TreeView1);
    except
    end;
  end;
  repeat
    Application.ProcessMessages;
    Gauge5.Progress := SdScanCount;
  until SdScanCount = 0;
  Gauge5.Progress := 0;
end;

procedure TScanIPFm.MultiHostScan;
var
  i: integer;
  TheNewNode: TTreeNode;
begin
  SdScanCount := 0;
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    if ListView1.Items[i].Checked then
    begin
      Edit10.Text := ListView1.Items[i].Caption;
      TheNewNode := TreeView1.Items.Add(nil, Edit10.Text);
      TheNewNode.ImageIndex := 0;
      TheNewNode.StateIndex := 0;
      TheNewNode.SelectedIndex := 0;
      repeat
        Application.ProcessMessages;
        if SpeedButton8.Down then exit;
      until SdScanCount = 0;
      SingleHostScan2;
    end;
  end;
  Application.MessageBox('===扫描任务完成!===', '扫描完毕',
    MB_OK + MB_ICONSTOP);
  SpeedButton8.Down := True;
end;

procedure TScanIPFm.RadioGroup1Click(Sender: TObject);
begin
  if RadioGroup1.ItemIndex = 0 then
    Edit9.Enabled := False
  else
    Edit9.Enabled := True;
end;

procedure TScanIPFm.Timer1Timer(Sender: TObject);
var
  MidColor: TColor;
begin
  Gauge3.Progress := Gauge3.Progress + 10;

  if Gauge3.Progress = 100 then
  begin
    Gauge3.Progress := 0;
    MidColor := Gauge3.BackColor;
    Gauge3.BackColor := Gauge3.ForeColor;
    Gauge3.ForeColor := MidColor;
  end;
end;

procedure TScanIPFm.SpeedButton5Click(Sender: TObject);
begin
  if RadioGroup1.ItemIndex = 1 then
    ScanPortPorcess
  else
    PingPorcess;
end;

procedure TScanIPFm.SpeedButton6Click(Sender: TObject);
begin
  Timer1.Enabled := false;
end;

procedure TScanIPFm.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit2.SetFocus;
  Edit5.Text := Edit1.Text;
end;

procedure TScanIPFm.FormCreate(Sender: TObject);
begin
  OldEditText := '0';
  SdPingCount := 0;
  SdScanCount := 0;
  MultiPingCount := 100;
  MultiScanCount := 100;
  LetPingSingle := TCriticalSection.Create;
  LetScanSingle := TCriticalSection.Create;
end;

procedure TScanIPFm.Edit2KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit3.SetFocus;
  Edit6.Text := Edit2.Text;
end;

procedure TScanIPFm.Edit3KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit4.SetFocus;
  Edit7.Text := Edit3.Text;
end;

procedure TScanIPFm.Edit4KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit5.SetFocus;
end;

procedure TScanIPFm.Edit5KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit6.SetFocus;
end;

procedure TScanIPFm.Edit6KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit7.SetFocus;
end;

procedure TScanIPFm.Edit7KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit8.SetFocus;
end;

procedure TScanIPFm.Edit8KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 8 then exit;
  if (48 <= Key) and (Key <= 57) then
  begin
    if StrToInt((Sender as TEdit).Text) > 255 then
      (Sender as TEdit).Text := '255';
  end
  else
    (Sender as TEdit).Text := OldEditText;
  OldEditText := (Sender as TEdit).Text;
  if Key = 190 then Edit1.SetFocus;
end;

procedure TScanIPFm.SpeedButton4Click(Sender: TObject);
begin
  Edit4.Text := '0';
  Edit8.Text := '255';
end;

procedure TScanIPFm.SpeedButton3Click(Sender: TObject);
begin
  Edit3.Text := '0';
  Edit7.Text := '255';
end;

procedure TScanIPFm.SpeedButton2Click(Sender: TObject);
begin
  Edit2.Text := '0';
  Edit6.Text := '255';
end;

procedure TScanIPFm.SpeedButton1Click(Sender: TObject);
begin
  Edit1.Text := '0';
  Edit5.Text := '255';
end;

procedure TScanIPFm.SpinButton1UpClick(Sender: TObject);
begin
  if StrToInt(FromEdit.Text) + 1 > 255 then exit;
  if FromEdit <> nil then
    FromEdit.Text := IntToStr(StrToInt(FromEdit.Text) + 1);
end;

procedure TScanIPFm.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FromEdit := (Sender as TEdit);
end;

procedure TScanIPFm.Edit5MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ToEdit := (Sender as TEdit)
end;

procedure TScanIPFm.SpinButton1DownClick(Sender: TObject);
begin
  if StrToInt(FromEdit.Text) - 1 < 0 then exit;
  if FromEdit <> nil then
    FromEdit.Text := IntToStr(StrToInt(FromEdit.Text) - 1);
end;

procedure TScanIPFm.SpinButton2DownClick(Sender: TObject);
begin
  if StrToInt(ToEdit.Text) - 1 < 0 then exit;
  if ToEdit <> nil then
    ToEdit.Text := IntToStr(StrToInt(ToEdit.Text) - 1);
end;

procedure TScanIPFm.SpinButton2UpClick(Sender: TObject);
begin
  if StrToInt(ToEdit.Text) + 1 > 255 then exit;
  if ToEdit <> nil then
    ToEdit.Text := IntToStr(StrToInt(ToEdit.Text) + 1);
end;

procedure TScanIPFm.Edit1Change(Sender: TObject);
begin
  if (Sender as TEdit).Text = '' then (Sender as TEdit).Text := '0';
end;

procedure TScanIPFm.FormDestroy(Sender: TObject);
begin
  LetPingSingle.Free;
  LetScanSingle.Free;
end;

procedure TScanIPFm.Edit2Change(Sender: TObject);
begin
  if (Sender as TEdit).Text = '' then (Sender as TEdit).Text := '0';

end;

procedure TScanIPFm.Edit3Change(Sender: TObject);
begin
  if (Sender as TEdit).Text = '' then (Sender as TEdit).Text := '0';
end;

procedure TScanIPFm.SpinEdit1Change(Sender: TObject);
begin
  MultiPingCount := SpinEdit1.Value;
  MultiScanCount := SpinEdit1.Value;
end;

procedure TScanIPFm.ListView1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  ListView1.Hint := '共搜索到' + IntToStr(ListView1.Items.Count) + '个';
end;

procedure TScanIPFm.SpeedButton15Click(Sender: TObject);
begin
  Close;
end;

procedure TScanIPFm.SpeedButton11Click(Sender: TObject);
begin
  ListView1.Items.Clear;
  Panel10.Caption := '扫描结果已全部清除';
end;

procedure TScanIPFm.ListView1Click(Sender: TObject);
begin
  if ListView1.Selected <> nil then
    SpeedButton12.Enabled := True
  else
    SpeedButton12.Enabled := False;
  if ListView1.Selected <> nil then
    Edit10.Text := ListView1.Selected.Caption;

end;

procedure TScanIPFm.SpeedButton13Click(Sender: TObject);
var
  SaveList: TStringList;
  i: integer;
begin
  if SaveDialog1.Execute then
  begin
    SaveList := TStringList.Create;
    for i := 0 to ListView1.Items.Count - 1 do
      SaveList.Add(ListView1.Items[i].Caption);
    SaveList.SaveToFile(SaveDialog1.FileName);
    Savelist.Free;
  end;
end;

procedure TScanIPFm.RadioGroup2Click(Sender: TObject);
begin
  if RadioGroup2.ItemIndex = 0 then
    Edit10.Enabled := True
  else
    Edit10.Enabled := False;

end;

procedure TScanIPFm.FormShow(Sender: TObject);
begin
  IdIPWatch1.Active := True;
  ComboBox1.Text := IdIPWatch1.CurrentIP;
  ComboBox1.Items.Text := IdIPWatch1.IPHistoryList.Text;
  IdIPWatch1.Active := False;
  FillLocalIP;
  FromEdit := Edit4;
  ToEdit := Edit8;
end;

procedure TScanIPFm.N2Click(Sender: TObject);
begin
  if ListView1.Selected <> nil then
    ListView1.Selected.Delete;
end;

procedure TScanIPFm.N3Click(Sender: TObject);
begin
  if ListView1.Selected <> nil then
    ListView1.Items.Clear;
end;

procedure TScanIPFm.SpeedButton7Click(Sender: TObject);
begin
  if RadioGroup2.ItemIndex = 0 then
    SingleHostScan
  else
    MultiHostScan;
end;

procedure TScanIPFm.N4Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
    ListView1.Items[i].Checked := True;
end;

procedure TScanIPFm.N5Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
    ListView1.Items[i].Checked := False;
end;

procedure TScanIPFm.N6Click(Sender: TObject);
begin
  if TreeView1.Selected <> nil then
    TreeView1.Selected.Delete;
end;

procedure TScanIPFm.N7Click(Sender: TObject);
begin
  TreeView1.Items.Clear;
end;

procedure TScanIPFm.N1Click(Sender: TObject);
begin
  if ListView1.Selected <> nil then
  begin
    UserForm.MaskEdit2.Text := ListView1.Selected.Caption;
    UserForm.ComboBox1.Enabled := True;
    UserForm.ShowModal;
    UserForm.ComboBox1.Enabled := False;
  end;
end;

procedure TScanIPFm.SpeedButton12Click(Sender: TObject);
begin
  N1Click(self);
end;

end.

 

unit PingThreadUnit;

interface

uses
  Classes, IdIcmpClient, SysUtils, ComCtrls, IdStackConsts;

type
  PingThread = class(TThread)
  private
    { Private declarations }
  protected
    EchoCount: integer;
    SaveTL: TListView;
    PingTheIP: string;
    MyIcmpClient: TIdIcmpClient;
    TheMaxEchoTime: integer;
    TheEchoTTl: byte;
    TheEchoStr: string;
    procedure SaveIP;
    procedure PingFiveIP;
    procedure MyIdIcmpClientReply(ASender: TComponent;
      const AReplyStatus: TReplyStatus);
    procedure Execute; override;
  public
    constructor Create(TheIP: string; TheTL: TListView);
    destructor Destroy; override;
  end;

implementation
uses ScanIPUnit;

constructor PingThread.Create(TheIP: string; TheTL: TListView);
begin
  inherited Create(True);
  self.FreeOnTerminate := True;
  EchoCount := 0;
  PingTheIP := TheIP;
  SaveTL := TheTL;
  MyIcmpClient := TIdIcmpClient.Create(nil);
  MyIcmpClient.Protocol := 1;
  MyIcmpClient.ReceiveTimeout := 5000;
  MyIcmpClient.OnReply := MyIdIcmpClientReply;
  LetPingSingle.Enter;
  SdPingCount := SdPingCount + 1;
  LetPingSingle.Leave;
  TheMaxEchoTime := 0;
  TheEchoTTl := 0;
  self.Suspended := False;
end;

procedure PingThread.SaveIP;
var
  TheListItem: TListItem;
begin
  try
    TheListItem := SaveTL.Items.Add;
    TheListItem.ImageIndex := 0;
    TheListItem.Caption := PingTheIP;
    TheLIstItem.SubItems.Add(IntToStr((EchoCount * 100) div 5) + '%');
    TheLIstItem.SubItems.Add(IntToStr(TheMaxEchoTime) + '''ms');
    TheLIstItem.SubItems.Add(IntToStr(TheEchoTTL));
    TheLIstItem.SubItems.Add(TheEchoStr);
  except
  end;
end;

procedure PingThread.PingFiveIP;

var
  i: integer;
begin
  MyIcmpClient.Host := PingTheIP;
  for i := 1 to 5 do
    MyIcmpClient.Ping;
end;

procedure PingThread.Execute;
begin
  try
    PingFiveIP;
  except
    self.Terminate;
  end;
end;

procedure PingThread.MyIdIcmpClientReply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
begin
  try
    TheMaxEchoTime := TheMaxEchoTime + AReplyStatus.MsRoundTripTime;
    TheEchoStr := IntToStr(AReplyStatus.BytesReceived) + '字节';
    TheEchoTTl := AReplyStatus.TimeToLive;
    if (AReplyStatus.ReplyStatusType = rsEcho) then
      if (AReplyStatus.FromIpAddress = PingTheIP) then
        EchoCount := EchoCount + 1;
  except
  end;
end;

destructor PingThread.Destroy;
begin
  try
    if EchoCount > 0 then
      Synchronize(SaveIP);
  except
  end;
  MyIcmpClient.Free;
  LetPingSingle.Enter;
  SdPingCount := SdPingCount - 1;
  LetPingSingle.Leave;
  inherited Destroy;
end;

end.

unit ScanPortThreadUnit;

interface

uses
  Classes, IdTCPClient, SysUtils, ComCtrls, IdSocks;

type
  ScanPortThread = class(TThread)
  private
    { Private declarations }
  protected
    SaveTL: TListView;
    ScanTheIP: string;
    ScanThePort: integer;
    MyTcpClient: TIdTcpClient;
    //TheScktInfo:TSocksInfo;
    procedure SaveIP;
    procedure Execute; override;
  public
    constructor Create(TheIP: string; ThePort: integer; TheTL: TListView);
    destructor Destroy; override;
  end;

implementation
uses ScanIPUnit;

constructor ScanPortThread.Create(TheIP: string; ThePort: integer; TheTL:
  TListView);
begin
  inherited Create(True);
  self.FreeOnTerminate := True;
  ScanTheIP := TheIP;
  ScanThePort := ThePort;
  SaveTL := TheTL;
  MyTcpClient := TIdTcpClient.Create(nil);
  //TheScktInfo:=TSocksInfo.Create;

  LetPingSingle.Enter;
  SdPingCount := SdPingCount + 1;
  LetPingSingle.Leave;

  self.Suspended := False;
end;

procedure ScanPortThread.Execute;
begin
  //TheScktInfo.Authentication:=saNoAuthentication;
  //TheScktInfo.Version:=svNoSocks;
  //TheScktInfo.Port:=0;
  //MyTcpClient.SocksInfo:=TheScktInfo;
  //MyTcpClient.UseNagle:=True;
  MyTcpClient.Host := ScanTheIP;
  MyTcpClient.Port := ScanThePort;
  try
    MyTcpClient.Connect;
  except
  end;
  if MyTcpClient.Connected then
  begin
    Synchronize(SaveIP);
    MyTcpClient.Disconnect;
  end;
  Self.Terminate;
end;

procedure ScanPortThread.SaveIP;
var
  TheListItem: TListItem;
begin
  try
    TheListItem := SaveTL.Items.Add;
    TheListItem.ImageIndex := 0;
    TheListItem.Caption := ScanTheIP;
    TheLIstItem.SubItems.Add('0');
    TheLIstItem.SubItems.Add('0');
    TheLIstItem.SubItems.Add('0');
    TheLIstItem.SubItems.Add('0');
    TheLIstItem.SubItems.Add(IntToStr(ScanThePort));
  except
  end;
end;

destructor ScanPortThread.Destroy;
begin
  MyTcpClient.Free;
  //TheScktInfo.Free;
  LetPingSingle.Enter;
  SdPingCount := SdPingCount - 1;
  LetPingSingle.Leave;
  inherited Destroy;
end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `docker scan` 是 Docker CLI 中的一个命令,用于扫描 Docker 映像中的漏洞并生成报告。它使用 Snyk 的漏洞数据库来分析镜像,并提供有关镜像所包含漏洞的详细信息。使用 `docker scan` 命令可以帮助您识别镜像中可能存在的安全问题,并采取必要的措施来修复它们。使用 `docker scan` 命令的示例: ``` docker scan <image-name> ``` 其中 `<image-name>` 是要扫描的 Docker 镜像的名称。 ### 回答2: Docker Scan是Docker官方推出的一个安全工具,用于扫描容器镜像中的漏洞和安全风险。通过Docker Scan,用户可以及时发现并修复容器镜像中存在的安全漏洞,从而提高应用程序的安全性。 Docker Scan主要有以下几个特点和功能: 1. 自动化扫描:Docker Scan可以自动扫描容器镜像中的软件包、库文件以及配置文件等,并与漏洞数据库进行对比,从而快速识别出潜在的安全问题。 2. 多层扫描:Docker Scan支持对容器镜像的不同层进行扫描,可以更加全面地检测镜像中的漏洞和风险。 3. 实时漏洞报告:扫描完成后,Docker Scan会生成详细的漏洞报告,包括漏洞的严重程度、修复建议以及相应的CVE编号等信息,方便用户查看和处理。 4. 与Docker CLI集成:Docker Scan可以与Docker CLI无缝集成,用户只需在命令行中输入相应命令,即可进行容器镜像的扫描和漏洞修复。 使用Docker Scan的好处主要有以下几点: 1. 提升安全性:通过扫描容器镜像中的漏洞和安全风险,及时修复潜在的安全问题,减少应用程序受到攻击的风险。 2. 提高效率:Docker Scan的自动化特性可以大大减少手动扫描的工作量,节省时间和精力。 3. 加强合规性:对容器镜像进行安全扫描,可以帮助用户遵守相关的合规性规定,提高企业的安全信任度。 总之,Docker Scan是一个方便易用且功能强大的工具,可以帮助用户快速识别和修复容器镜像中的安全漏洞,提高应用程序的安全性和可靠性。 ### 回答3: Docker Scan 是一个用于安全扫描 Docker 镜像中潜在漏洞和安全问题的工具。Docker 镜像是由多个层次组成的,而且它们可能来自于不同的源头,这就增加了镜像中存在漏洞的可能性。Docker Scan 可以帮助用户在使用镜像之前及时发现并解决这些问题。 Docker Scan 的工作原理是通过分析 Docker 镜像的组成结构,包括所有的层次和组件,以及其所依赖的基础镜像和软件包版本信息。然后,它会将这些信息与漏洞数据库中的记录进行对比,以确定是否有已知的漏洞存在。 当 Docker Scan 发现镜像中存在已知漏洞时,它会提供有关漏洞的详细信息,包括漏洞的名称、描述、严重程度和修补建议。用户可以根据这些信息来评估镜像的安全性,并采取相应的措施来修复或替换有漏洞的镜像。 Docker Scan 还提供了自动扫描功能,可以在每次镜像推送到 Docker 仓库时自动进行漏洞扫描。这有助于用户在使用镜像之前及时获取最新的安全信息。 使用 Docker Scan 可以帮助用户加强 Docker 镜像的安全性,降低潜在的风险。它提供了一个快速、方便的方式来识别和修复镜像中的漏洞,同时也促使用户在使用镜像时更加注重安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值