자작 | 아이피 차단 처리[단일 대역 클래스 등.]
페이지 정보
작성자 DLL 작성일22-10-21 00:14 조회205회 댓글0건관련링크
- http://cao.kr 56회 연결
- http://dll.kr 51회 연결
본문
고오~급 보안이 적용된 방화벽에서
인바운드 규칙에 간단하게 아이피 차단을 단일/대역/클래스로 해주는 작업을 하는 코드임.
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.
코드에 관한 질문 받지 않음 ㅋㅋ 하지마~! (ㅅㅂ~)
중간에 쓰잘데기 없는 디버깅용 변수나 로직이 있으니, 알아서들 구워 삶아서 쓰길 바람. ㅇㅇ
댓글목록
등록된 댓글이 없습니다.