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。欢迎有兴趣的朋友继续关注。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值