先介绍一下什么是NT服务,实际上就是一个可以在系统启动时自动在一定身份下启动的,伴随着系统长期存在的进程.

   一个NT服务有三部分构成:
:Service Control Manager(SCM) 每个WIN NT/2K都有一个SCM,他存在于Service.exe中.
:服务本身 一个服务拥有能从SCM受到信号和命令所必需的特殊代码,并能够在处理后将他的状态返回SCM.
:Service Control Dispatcher(SCP) 他是一个拥有用户截面,允许用户开始,暂停,继续,并且控制已经安装在计算机上作为服务运行的WIN32
应用程序 下面我们来看编写一个NT服务:(这是一个服务框架,只要在他后面添加自己的后门代码,那么后门就可以实现服务方式启动)
请大家对照注释仔细研究! #include <stdio.h>
#include <windows.h>
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv); //服务主函数
void WINAPI ServiceCtrlHandler(DWORD Opcode); //服务控制函数
void WINAPI CmdStart(void); //要启动的程序函数
BOOL InstallService(); //安装服务的函数
BOOL DeleteService(); //删除服务的函数 int main(int argc, char* argv[])
{
printf("\twindows based service demo\n");
printf("\tgxisone@hotmail.com\n");
if(argc!=)
{
printf("usage: %s -install[remove]",argv[]);
return ;
}
if(strcmp(argv[],"-install")==) //安装
{
if(InstallService())
printf("\n\nService Installed Sucessfully\n");
else
printf("\n\nError Installing Service\n");
}
else if(strcmp(argv[],"-remove")==) // 删除
{
if(DeleteService())
printf("\n\nService remove sucessfully\n");
else
printf("\n\nError removing Service\n");
}
else
{
printf("\nusage: %s -install[remove]\n",argv[]);
return ;
}
//在进入点函数里面要完成ServiceMain的初始化,
//准确点说是初始化一个SERVICE_TABLE_ENTRY结构数组,
//这个结构记录了这个服务程序里面所包含的所有服务的名称
//和服务的进入点函数
SERVICE_TABLE_ENTRY
DispatchTable[]={{"WindowsMgr",ServiceMain},{NULL,NULL}};
//最后的NULL指明数组的结束
StartServiceCtrlDispatcher(DispatchTable);
return ;
} void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = ;
m_ServiceStatus.dwServiceSpecificExitCode = ;
m_ServiceStatus.dwCheckPoint = ;
m_ServiceStatus.dwWaitHint = ;
m_ServiceStatusHandle = RegisterServiceCtrlHandler("WindowsMgr",ServiceCtrlHandler);
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE))return;
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; //设置服务状态
m_ServiceStatus.dwCheckPoint = ;
m_ServiceStatus.dwWaitHint = ;
//SERVICE_STATUS结构含有七个成员,它们反映服务的现行状态。
//所有这些成员必须在这个结构被传递到SetServiceStatus之前正确的设置
SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus);
bRunning=true;
//*
CmdStart(); //启动我们的服务程序
//*
return;
}
void WINAPI ServiceCtrlHandler(DWORD Opcode) //服务控制函数
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
m_ServiceStatus.dwWin32ExitCode = ;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
m_ServiceStatus.dwCheckPoint = ;
m_ServiceStatus.dwWaitHint = ;
SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
bRunning=false;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
return;
}
BOOL InstallService() //安装服务函数
{
char strDir[];
SC_HANDLE schSCManager,schService;
GetCurrentDirectory(,strDir);
GetModuleFileName(NULL,strDir,sizeof(strDir)); char chSysPath[];
GetSystemDirectory(chSysPath,sizeof(chSysPath)); strcat(chSysPath,"\\WindowsMgr.exe");
if(!CopyFile(strDir,chSysPath,FALSE))printf("Copy file OK\n"); // 把我们的服务程序复制到系统根目录 strcpy(strDir,chSysPath);
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
{
printf("open scmanger failed,maybe you do not have the privilage to do this\n");
return false;
} LPCTSTR lpszBinaryPathName=strDir; schService = CreateService(schSCManager,"WindowsMgr","Windows Manger Control", //将服务的信息添加到SCM的数据库
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS, // 服务类型
SERVICE_AUTO_START, // 启动类型
SERVICE_ERROR_NORMAL,
lpszBinaryPathName, // 服务名
NULL,
NULL,
NULL,
NULL,
NULL); if (schService == NULL)
{
printf("faint,we failed just because we invoke createservices failed\n");
return false;
}
CloseServiceHandle(schService);
return true;
}
BOOL DeleteService()
{
SC_HANDLE schSCManager;
SC_HANDLE hService;
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); char chSysPath[];
GetSystemDirectory(chSysPath,sizeof(chSysPath));
strcat(chSysPath,"\\WindowsMgr.exe"); if (schSCManager == NULL)
{
printf("faint,open scmanger failed\n");
return false;
}
hService=OpenService(schSCManager,"WindowsMgr",SERVICE_ALL_ACCESS);
if (hService == NULL)
{
printf("faint,open services failt\n");
return false;
}
if(DeleteFile(chSysPath)==)
{
printf("Dell file Failure !\n");
return false;
}
else printf("Delete file OK!\n");
if(DeleteService(hService)==)
return false; if(CloseServiceHandle(hService)==)
return false;
else
return true;
} void WINAPI CmdStart(void)
{ //把你的要做成服务启动的程序代码添加到这里
//那么你的代码就可以作为NT服务启动了 }

黑客编程教程(八)编写NT服务的更多相关文章

  1. 黑客编程教程(二)Win API编程简介

    第二节 Win API编程简介 下面介绍一下WIN API. 我们需要自己编写一个工具时,必然会用到很多操作windows和控制windows的函数,这些函数就是windows API. API是Ap ...

  2. 黑客编程教程(十三)多线程DOS程序

    DOS基本原理相信大家都已经很熟悉了,DOS工具大家也用的很熟悉.在群里 经常有人说什么时候去DOS什么东西. 现在我们就自己编写一个DOS工具. #include <winsock2.h> ...

  3. 黑客编程教程(一)了解Windows机制

    第一节 了解Windows机制 Windows 是一个“基于事件的,消息驱动的”操作系统. 在Windows下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小或移动.单击鼠标等)该动作就会触 ...

  4. 黑客编程教程(六)Windows的关机和重起

    第六节 Windows的关机和重起 很多木马都有远程关机功能,但这并不是一个很好的功能.不过对于入侵服务器,有时需要重起服务器.其实对于关机和重起,只需要调用几个 API函数即可实现. 对于WIN9X ...

  5. 黑客编程教程(三)Windows 网络协议

    首先介绍一下网络协议:网络协议是网络上所有设备之间通信规则的集合,他定义了通信时信息必须采用的格式和这些格式的意义.大多数 网络协议都采用分层体系结,每一层都建立在他的下层之上,向他的上一层提供服务, ...

  6. 黑客编程教程(十五)HTTP代理

    #include <stdio.h> #include <winsock2.h> #define MAXBUFLEN 20480 #define HTTPADDLEN 50 # ...

  7. 黑客编程教程(十四)单线程TCP端口扫描器

    #include<winsock2.h> #include<stdio.h> #include <time.h> //计时需要用到的头文件 #pragma comm ...

  8. IOS编程教程(八):在你的应用程序添加启动画面

    IOS编程教程(八):在你的应用程序添加启动画面   虽然你可能认为你需要编写闪屏的代码,苹果已经可以非常轻松地把它做在Xcode中.不需要任何编码.你只需要做的是设置一些配置. 什么是闪屏 对于那些 ...

  9. c++ 网络编程(九)LINUX/windows-IOCP模型 多线程超详细教程及多线程实现服务端

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9661012.html 先讲Linux下(windows下在后面可以直接跳到后面看): 一.线程 ...

随机推荐

  1. Linux RAID简介

    现代磁盘的缺陷:IO性能极弱,稳定性极差 RAID廉价磁盘冗余阵列:通过多磁盘并行运行来提高计算机的IO性能,在创建RAID时要求硬盘大小.品牌.型号一样 RAID可分为多种,称之为RAID级别,现代 ...

  2. 高阶函数 实现sum(2)(3) 柯里化

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. 机器学习笔记(十)EM算法及实践(以混合高斯模型(GMM)为例来次完整的EM)

    今天要来讨论的是EM算法.第一眼看到EM我就想到了我大枫哥,EM Master,千里马.RUA!!!不知道看这个博客的人有没有懂这个梗的. 好的,言归正传.今天要讲的EM算法,全称是Expectati ...

  4. Flash actionscript3.0 多个setTimeout之间会顺序执行 单线程执行 无法中止

    做了一个试验,测试能否在另外的setTimeout中中断其他代码的执行.结果表明,是不可能的,Actionscript会按顺序,逐个逐个的执行. private var index:int; priv ...

  5. 〖Linux〗build sqlite3 for Arm

    Version: sqlite-autoconf-3080100.tar.gz Download: https://www.sqlite.org/download.html 1. toolchains ...

  6. 〖Ruby〗Ruby运算符/优先级

    优先级 能否重写 运行符 描述 最高 Y [] []= 数组下标 数组元素赋值 Y ** 冥乘 Y ! ~ + - 非 位非 一元加 负号 Y * / % 乘 除 模 Y + - 加 减 Y > ...

  7. 机器学习的敲门砖:手把手教你TensorFlow初级入门

    摘要: 在开始使用机器学习算法之前,我们应该首先熟悉如何使用它们. 而本文就是通过对TensorFlow的一些基本特点的介绍,让你了解它是机器学习类库中的一个不错的选择. 本文由北邮@爱可可-爱生活  ...

  8. linux(red hat)下安装jenkins

    Jenkins的安装能够分为在线安装和下载软件本地安装.我这里用的是另外一种方法,将其下载后是一个应用程序直接点击安装就能够.等安装完后配置一下jdk的路径就ok啦!接下来进行具体的说明: 一.前提 ...

  9. SqlServer强制断开数据库已有连接的方法(转)

    在master数据库中执行如下代码 declare @i INT  declare cur cursor for select spid from sysprocesses where db_name ...

  10. Python的 numpy中 meshgrid 和 mgrid 的区别和使用

    一.meshgrid函数 meshgrid函数通常使用在数据的矢量化上. 它适用于生成网格型数据,可以接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对. 示例展示: 由上面的示例展示 ...