Windows黑客编程基础(一)——系统服务

 

Windows 黑客编程基础 ( )
系统服务
作者:shangguanw2
邮箱: songnianhu@163.com
博客:blog.csdn.net/shangguanwaner
QQ:329967612
       前两天和一个同学聊天,他念的是XX大学计算机专业,他向我抱怨说天天在学校学的东西好象都没什么用,对Hacker编程倒颇有兴趣,就是不知到从何学起。于是本人不才,萌生了写一个关于黑客编程的系列教程。
       这一系列教程全部基于Windows操作系统,读者需要具有一定的C语言和Win32 SDK的基础。每一讲,我都会对涉及到的原理做较为具体的介绍,并给出相应的实例代码。你可以跟我联系,大家共同探讨。
      
       好,开始教程的第一篇,Windows服务编程。
       许多的病毒和木马都将自己注册为系统服务,来实现自启动。有的注册新的服务,有的替换现有服务实现隐藏。添加系统服务是Windows木马一个普遍使用的技术,还是比较实用的。就让我们来看看它是如何实现的。
       先给出一段程序,说明如何添加一个新的系统服务。
      
       #include <windows.h>
       #include <winsvc.h>
       #include <stdio.h>
 
       #define SRV_NAME    “SrvSample”                        //服务名称
       #define SRV_INFO              “一个系统服务程序实例”     //服务说明
       #define SRV_PATH       “C:/srvsample.exe”               //系统服务程序的路径
      
       int main(int argc,char** argv)
       {
              SC_HANDLE scMgr=NULL;
              SC_HANDLE service=NULL;
 
       if(scMgr=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL){
              printf(“OpenSCManager() Error/n”);
              return -1;
     }
    
     service=CreateService(scMgr,SRV_NAME,SRV_INFO,SERVICE_ALL_ACCESS,
                                        SERVICE_WIN32_OWN_PROCESS,
                                        SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
                                        SRV_PATH,0,0,0,0,0);
     if(service)
            printf(“Create a new service successful!/n”);
     else
            printf(“Failed to create a new service!/n”);
 
     CloseServiceHandle(scMgr);
     CloseServiceHandle(service);
 
     return 0;
       }
 
       代码很简单,先打开服务管理器的句柄,然后调用API添加服务。几个API的用法你可以查阅MSDN。
 
       下面给出代码演示如何删除一个服务。头文件包含和上面相同。为了简洁起见,没有进行错误处理。
 
       int main(int argc,char** argv)
       {
              SC_HANDLE scMgr;
              SC_HANDLE service;
              SERVICE_STATUS status;
      
              scMgr=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
              service=OpenService(scMgr,SRV_NAME,SERVICE_ALL_ACCESS|DELETE);
              //查询服务状态
              QueryServiceStatus(service,&status);
              //如果服务未停止,先停止它
              if(status.dwCurrentState!=SERVICE_STOPPED){
                     ControlService(service,SERVICE_CONTROL_STOP,&status);
                     Sleep(500);
              }
 
              BOOL bSuccess=DeleteService(service);
              if(bSuccess)
                     printf(“Delete service successful!/n”);
              else
                     printf(“Failed to delete service!/n”);
 
              return 0;
       }
 
       下面给出一个服务程序的模板。一个服务程序必须有两个函数,一个是服务程序的主函数ServiceMain(),另一个是服务程序的派遣函数ServiceHandler(),它负责处理外部控制消息。
 
       #include <windows.h>
 
       SERVICE_STATUS      ServiceStatus;
       SERVICE_STATUS_HANDLE     hStatus;
 
       VOID WINAPI      ServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
       VOID WINAPI      ServiceHandler( DWORD fdwControl );
      
       int main(int argc,char** argv)
       {
              SERVICE_TABLE_ENTRY ServiceTable[2];
              ServiceTable[0].lpServiceName=”SrvSample”;
              ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
              ServiceTable[1].lpServiceName=NULL;
              ServiceTable[1].lpServiceProc=NULL;
 
              StartServiceCtrlDispatcher(ServiceTable);
 
              return 0;
       }
 
       //服务控制处理函数
       VOID WINAPI ServiceHandler(DWORD fdwControl)
       {
              switch(fdwControl)
              {
              case SERVICE_CONTROL_PAUSE:
                     ServiceStatus.dwCurrentState = SERVICE_PAUSED;
                     break;
 
              case SERVICE_CONTROL_CONTINUE:
                     ServiceStatus.dwCurrentState = SERVICE_RUNNING;
                     break;
 
              case SERVICE_CONTROL_STOP:
              case SERVICE_CONTROL_SHUTDOWN:
                     ServiceStatus.dwCurrentState = SERVICE_STOPPED;
                     ServiceStatus.dwWin32ExitCode = 0;
                     ServiceStatus.dwCheckPoint    = 0;
                     ServiceStatus.dwWaitHint      = 0;
                     SetServiceStatus(hStatus,&ServiceStatus);
                     return ;
 
              case SERVICE_CONTROL_INTERROGATE:
                     break;
 
              default:
                     break;
              }
 
              SetServiceStatus(hStatus,&ServiceStatus);
              return ;
}
      
       //服务主函数
       VOID WINAPI ServiceMain( DWORD dwArgc, LPTSTR *lpszArgv )
       {
              DWORD   status = 0;
           DWORD   specificError = 0xfffffff;
 
           ServiceStatus.dwServiceType        = SERVICE_WIN32;
           ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
           ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP |                                         SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
           ServiceStatus.dwWin32ExitCode      = 0;
            ServiceStatus.dwServiceSpecificExitCode = 0;
           ServiceStatus.dwCheckPoint         = 0;
           ServiceStatus.dwWaitHint           = 0;
                                                                                                                                               hStatus=RegisterServiceCtrlHandler("SrvSample",
                                                               (LPHANDLER_FUNCTION)ServiceHandler);
            if (hStatus==0)
               return;
 
           // Handle error condition
              status = GetLastError();
           if (status!=NO_ERROR)
              {
               ServiceStatus.dwCurrentState       = SERVICE_STOPPED;
               ServiceStatus.dwCheckPoint         = 0;
               ServiceStatus.dwWaitHint           = 0;
               ServiceStatus.dwWin32ExitCode      = status;
               ServiceStatus.dwServiceSpecificExitCode = specificError;
               SetServiceStatus(hStatus, &ServiceStatus);
               return;
              }
 
           // 初始化结束,报告运行状态
           ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
           ServiceStatus.dwCheckPoint         = 0;
           ServiceStatus.dwWaitHint           = 0; 
           SetServiceStatus(hStatus, &ServiceStatus);
 
             //在这里做其他的工作
              DoWork();
}
 
       这是一个模板,要实现你自己的服务,在DoWork()中添加功能代码即可。能做什么只取决于的想象,呵呵。
 
      
 
       好的,就到这里。下一讲介绍如何实现一个远程Shell。欢迎有兴趣的朋友继续关注。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值