아이피 차단 처리[단일 대역 클래스 등.] > 델파이 자료실

본문 바로가기

회원로그인

델파이 자료실

자작 | 아이피 차단 처리[단일 대역 클래스 등.]

페이지 정보

작성자 DLL 작성일22-10-21 00:14 조회193회 댓글0건

본문

고오~급 보안이 적용된 방화벽에서

인바운드 규칙에 간단하게 아이피 차단을 단일/대역/클래스로 해주는 작업을 하는 코드임.

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ShellAPI, VistaMan, ExtCtrls;

type

  TForm1 = class(TForm)

    L: TMemo;

    Panel1: TPanel;

    BtnStart: TBitBtn;

    BtnStop: TBitBtn;

    Memo1: TMemo;

    BtnWF_SMC: TBitBtn;

    Procedure LChange(Sender: TObject);

    Procedure BtnStartClick(Sender: TObject);

    Procedure BtnStopClick(Sender: TObject);

    Procedure FormCreate(Sender: TObject);

    Procedure BtnWF_SMCClick(Sender: TObject);

    Procedure GetDosOutput(CommandLine: string; Work: string = 'C:\');

  private

  public

  end;

 

var

  Form1: TForm1;

 

 

implementation

 

{$R *.dfm}

 

{=====================}

{ 콘솔프로세스 생성후 }

{ 고급보안 방화벽실행 }

{=====================}

Procedure TForm1.GetDosOutput(CommandLine: String; Work: String = 'C:\');

Var

  SecAtrrs: TSecurityAttributes;

  StartupInfo: TStartupInfo;

  ProcessInfo: TProcessInformation;

  StdOutPipeRead, StdOutPipeWrite: THandle;

  WasOK: Boolean;

  pCommandLine: PChar;

  BytesRead: Cardinal;

  WorkDir: String;

  Rtn: String; {디버깅용}

  Handle: Boolean;

Begin

  Rtn := '';

  With SecAtrrs Do Begin

    nLength := SizeOf(SecAtrrs);

    bInheritHandle := True;

    lpSecurityDescriptor := Nil;

  End;

  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SecAtrrs, 0);

  Try

    With StartupInfo Do Begin

      FillChar(StartupInfo, SizeOf(StartupInfo), 0);

      cb := SizeOf(StartupInfo);

      dwFlags := STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES;

      wShowWindow := SW_HIDE;

      hStdInput := GetStdHandle(STD_INPUT_HANDLE);

      hStdOutput := StdOutPipeWrite;

      hStdError := StdOutPipeWrite;

    End;

    WorkDir := Work;

    Handle := CreateProcess(Nil, PChar('cmd.exe /C ' + CommandLine),

                            Nil, Nil, True, 0, Nil,

                            PChar(WorkDir), StartupInfo, ProcessInfo);

    CloseHandle(StdOutPipeWrite);

    If Handle Then Begin

      Try

        Repeat

          WasOK := windows.ReadFile(StdOutPipeRead, pCommandLine, 255, BytesRead, Nil);

          If BytesRead > 0 Then Begin

            pCommandLine[BytesRead] := #0;

            Rtn := Rtn + pCommandLine;

          End;

        Until Not WasOK Or (BytesRead = 0);

        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

      Finally

        CloseHandle(ProcessInfo.hThread);

        CloseHandle(ProcessInfo.hProcess);

      End;

    End;

  Finally

    CloseHandle(StdOutPipeRead);

  End;

End;

 

 

Procedure TForm1.FormCreate(Sender: TObject);

begin

  Try

    L.Lines.LoadFromFile('List.txt');

  Except End;

  BtnStop.Click;

  BtnStart.Click;

End;

 

{=================================================}

{ 아이피 리스트를 방화벽 인바운드 규칙에 차단처리 }

{=================================================}

Procedure TForm1.BtnStartClick(Sender: TObject);

Var

  Rtn : Integer;

  Data, IPData, Tmp : String;

  Idx : Integer;

begin

  BtnStart.Enabled := False;

  Try

    IPData := '';

    {============================================}

    { 리스트처리시, 빈 공백 엔터를 했거나 여러번 }

    { 엔터를 한 경우 공란으로 넘겨서 처리 하도록 }

    {============================================}

    For Idx := 0 To L.Lines.Count-1 Do Begin

      If L.Lines.Strings[Idx] <> '' Then Begin

 

          Tmp := L.Lines.Strings[Idx];

          Tmp := StringReplace(Tmp, ' ', '', [rfReplaceAll]); {혹시라도 공백입력 헀으면 없애기}

          Tmp := StringReplace(Tmp, ',', '.', [rfReplaceAll]); {혹시라도 콤마입력 했으면 점으로}

 

        If IPData = '' Then Begin

          IPData := Tmp;

        End Else Begin

          IPData := IPData + ',' + Tmp;

        End;

      End;

    End;

 

    IPData := StringReplace(IPData, ' ', '', [rfReplaceAll]); {조합시 뜻밖의 공백이 나오면 없애기}

 

    If IPData <> '' Then Begin

      Data := 'advfirewall firewall add rule name="@앰피소프트_IP차단" dir=in action=block remoteip=' + IPData + ' enable=yes';

      Rtn := 0;

      Rtn := ShellExecute(Form1.Handle, 'open', 'netsh', PChar(Data), Nil, SW_HIDE);

      If (Rtn > 32) Then Begin End Else Begin End; { 리턴으로 수행완료 대기 }

      BtnStart.Enabled := False;

      BtnStop.Enabled := True;

    End Else Begin

      BtnStart.Enabled := True;

      BtnStop.Enabled := False;

      ShowMessage('목록에 아이피가 없음... 기본 아이피를 1.1.1.1 입력해서 해보세요~ 그리고 고급방화벽 설정에서 인바운드 규칙에 추가되어 있을 것임ㅋㅋㅋ');

    End;

  Except

    ShowMessage('현재 운영체제의 방화벽 설정 상태와 라이센스에서는 설정이 불가능합니다. 윈도우 버전과 라이센스 체크를 해야 할 듯한데? (ㅡ,.ㅡ;)');

    BtnStart.Enabled := True;

  End;

End;

 

{==========}

{ 차단중단 }

{==========}

Procedure TForm1.BtnStopClick(Sender: TObject);

Var

  Rtn : Integer;

  Data : String;

begin

  BtnStop.Enabled := False;

  Try

    Data := 'advfirewall firewall delete rule name="@앰피소프트_IP차단"';

    Rtn := 0;

    Rtn := ShellExecute(Form1.Handle, 'open', 'netsh', PChar(Data), Nil, SW_HIDE);

    If (Rtn > 32) Then Begin End Else Begin End; { 리턴으로 수행완료 대기 }

  Except

    ShowMessage('현재 운영체제의 라이센스에서는 설정이 불가능합니다 (T_T).. 개발자에게 운영체제 버전과, 방화벽 설정 상태를 알려주세요');

  End;

  BtnStart.Enabled := True;

End;

 

 

 

{=======================}

{ 인바운드규칙 캡션으로 }

{ 고급 보안 방화벽 실행 }

{=======================}

Procedure TForm1.BtnWF_SMCClick(Sender: TObject);

begin

  GetDosOutput('WF.MSC');

end;

 

 

{=================}

{ 변경시 바로저장 }

{=================}

Procedure TForm1.LChange(Sender: TObject);

begin

  Try

    L.Lines.SaveToFile('List.txt');

  Except End;

end;

 

END.

 

코드에 관한 질문 받지 않음 ㅋㅋ 하지마~! (ㅅㅂ~)

중간에 쓰잘데기 없는 디버깅용 변수나 로직이 있으니, 알아서들 구워 삶아서 쓰길 바람. ㅇㅇ

 

 

  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글목록

등록된 댓글이 없습니다.


접속자보기 오늘(22), 어제(139), 최대(219), 전체(31,426)      단축주소 :cTo.kr 무료도메인 :c1o.kr,cDo.kr

▲상단으로

http://DLL.kr (모바일보기)