免费杀毒软件,全面病毒解决方案

投递文章  投稿指南 金山毒霸非官方通告:
搜索: 您的位置毒霸首页>毒霸资讯>黑客动态>阅读资讯:木马编程DIY之系统服务

木马编程DIY之系统服务

2008-05-07 02:27:24   来源:   作者:   【 评论:0
对系统服务的管理几乎是目前的木马必不可少的功能,比如神气儿、上兴远程控制等,都提供了此项服务。要是我们能给自己编写的木马也加上这个功能,看着也不赖哦。好啦,废话不多说,下面开始干活!我们的木马要实现的效果如图1和图2所示。   取得配置权限   在对服务进行管理设置前,我们需要以相应的权限打开服务,本文通过下面的两个API来实现操作。 SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, // pointer to machine name string LPCTSTR lpDatabaseName, // pointer to database name string DWORD dwDesiredAccess // type of access ); SC_HANDLE OpenService( SC_HANDLE hSCManager, // handle to service control manager database LPCTSTR lpServiceName, // pointer to name of service to start DWORD dwDesiredAccess // type of access to service );   对于系统服务的管理,通常情况下我们是以完全权限打开的,要实现这个功能,我们可以使用下面的代码来操作。 SC_HANDLE scm; SC_HANDLE service; if((scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS))==NULL) { Printf("OpenSCManager Error\n"); } service=OpenService(scm,ServerName,SERVICE_ALL_ACCESS); if(!service) { Printf("OpenService error!\n"); }   这样,就可以通过Service句柄对服务进行各种操作了。   枚举基本服务信息   想要对服务进行设置,就需要知道服务的当前信息。其中对我们有用的通常是以下几项:服务名称、显示名称、启动状态、启动方式和程序路径等。这些信息我们可以通过API函数EnumServicesStatus来实现,它的原形如下: BOOL EnumServicesStatus( SC_HANDLE hSCManager,  // handle to service control manager database DWORD dwServiceType,  // type of services to enumerate DWORD dwServiceState,  // state of services to enumerate LPENUM_SERVICE_STATUS lpServices, // pointer to service status buffer DWORD cbBufSize,  // size of service status buffer LPDWORD pcbBytesNeeded,  // pointer to variable for bytes needed LPDWORD lpServicesReturned, // pointer to variable for number returned LPDWORD lpResumeHandle  // pointer to variable for next entry  );   在上面的代码中,LPENUM_SERVICE_STATUS lpServices是一个结构,其原形如下: typedef struct _ENUM_SERVICE_STATUS { // ess LPTSTR lpServiceName; LPTSTR lpDisplayName; SERVICE_STATUS ServiceStatus; } ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;   这个结构中包含服务名称、显示名称、启动状态。虽然它所返回的信息是极为有限的,但它是一次枚举所有的服务信息的。在要求不高的情况下,用它还是相当方便的。下面的示例代码可以枚举系统中所有服务的基本信息,实现代码如下所示。 LPENUM_SERVICE_STATUS lpServices = NULL; DWORD nSize = 0; DWORD n; DWORD nResumeHandle = 0; lpServices=(LPENUM_SERVICE_STATUS) LocalAlloc(LPTR, 64 * 1024);   //注意分配足够的空间 EnumServicesStatus(scm,SERVICE_WIN32,SERVICE_STATE_ALL,(LPENUM_SERVICE_STATUS)lpServices,64 * 1024,&nSize,&n,&nResumeHandle); for ( i = 0; i < n; i ) { Printf("服务名称: %s",lpServices[i].lpServiceName); Printf("显示名称: %s",lpServices[i].lpDisplayName); if ( lpServices[i].ServiceStatus.dwCurrentState!=SERVICE_STOPPED) { Printf("启动状态: 已启动\n"); } }   枚举详细服务信息   如果想要得到更详细的服务信息,我们可以使用另一个API函数QueryServiceConfig来获得,它的原形如下所示。 BOOL QueryServiceConfig( SC_HANDLE hService, // handle of service LPQUERY_SERVICE_CONFIG lpServiceConfig, // address of service config. structure DWORD cbBufSize, // size of service configuration buffer LPDWORD pcbBytesNeeded  // address of variable for bytes needed  );


Tags:  
责任编辑:
  • 请文明参与讨论,禁止漫骂攻击。 用户名:新注册) 密码: 匿名:
    评论总数:0 [ 查看全部 ] 网友评论
    关于我们 - 联系我们 - 广告服务 - 法律声明 - RSS订阅 - 网站地图 - 返回顶部 -