首页 电脑 电脑学堂 查看内容

控制台下修改系统驱动状态的源程序

2004-11-2 07:38 545 0

摘要: 论坛登陆名: CDrea提交者邮件地址: [email protected]提交者QQ号码: 51714608标题: 控制台下修改系统驱动状态的程序(源代码)内容:最近在sinister大哥的指点...
关键词: nbsp SERVICE printf hSCManager return schService nRet ServiceName 服务 HANDLE

论坛登陆名: CDrea提交者邮件地址: [email protected]提交者QQ号码: 51714608标题: 控制台下修改系统驱动状态的程序(源代码)内容:最近在sinister大哥的指点下,学习一些驱动方面的东西。最近在调一个程序很头痛...于是写了小东西,可以安装,卸载,启动和停止驱动(别指望它能把NDIS给停了,功能还没那么强,呵呵),也可以查询当前系统加载驱动的状况。最近版面不振,我还是有一定责任的...什么事都做做停停的...也怪对不起大家的...唉,跑题了,发点牢骚。使用方法:svcs         查询系统中已运行的驱动svcs [服务名]  查询指定驱动的状态svcs -install [服务名] [驱动程序]  安装一个驱动程序,必须指定驱动程序的全路径名svcs -remove [服务名]   卸载相应的驱动svcs -start [服务名]    启动一个驱动svcs -stop [服务名]     停止一个驱动eg.  svcs -install fw c:\firewall.sys  svcs -start fw  svcs -stop fw  svcs -remove fw主要是调用了Winsvc.h头文件中的API,没什么高难的技术。VC 6.0 + SP5 + win2k pro代码有点乱,不好意思...#include &l!t;stdio.h>#include <windows.h>#include <Winsvc.h>LPENUM_SERVICE_STATUS EnumServices(SC_HANDLE, LPDWORD);BOOL InstallService(SC_HANDLE hSCManager, LPCTSTR ServiceName, LPCTSTR ServiceExe);BOOL RemoveService(SC_HANDLE hSCManager, LPCTSTR ServiceName);BOOL StartService(SC_HANDLE hSCManager, LPCTSTR ServiceName);BOOL StopService(SC_HANDLE hSCManager, LPCTSTR ServiceName);BOOL IsAdmin(void);void err_show(char*);void Usage(char*);int main(int argc, char* argv[]){SC_HANDLE hSCManager = NULL;int  nRet = 0;nRet = IsAdmin();if(!nRet){printf("Must administrator privilege!\n");}//// 打开服务控制管理器//hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if(hSCManager == NULL){fprintf(stderr, "OpenSCManager() failed. --err: %d\n", GetLastError());return -1;}//// 调用EnumServices列举系统中的服务//!LPENUM_SERVICE_STATUS lpServices = NULL;DWORD dwServicesRe!turned =0;lpServices = EnumServices(hSCManager, &dwServicesReturned);if(lpServices == 0){free(lpServices);CloseServiceHandle(hSCManager);return -1;}//// 显示服务信息//if(argc == 2){//// 显示帮助信息//if(!stricmp(argv[1], "-h") ││ !stricmp(argv[1], "-help")){Usage(argv[0]);return 0;}for(DWORD i = 0; i < dwServicesReturned; i++, lpServices++){if(!stricmp(lpServices->lpServiceName, argv[1]))break;}if(i == dwServicesReturned){printf("Service not found!\n");free(lpServices);CloseServiceHandle(hSCManager);return -1;}printf("[%s]\n", lpServices->lpDisplayName);printf("\tService Name: %s\n", lpServices->lpServiceName);printf("\tService Type: ");switch(lpServices->ServiceStatus.dwServiceType){case SERVICE_FILE_SYSTEM_DRIVER: printf("File System Driver\n!");break;case SERVICE_KERNEL_DRIVER: printf("Device Driver\n");break;default: printf("User-Mode Service\n");break;}printf("\tState: ");switch(lpServices->ServiceStatus.dwCurrentState){case SERVICE_PAUSED: printf("PAUSED\n");break;case SERVICE_RUNNING: printf("RUNNING\n");break;case SERVICE_STOPPED: printf("STOPPED\n");break;default: printf("PENDING\n");break;}free(lpServices);CloseServiceHandle(hSCManager);return 0;}if(argc == 1){for(DWORD i = 0; i < dwServicesReturned; i++, lpServices++)printf("%s    [%s]\n", lpServices->lpServiceName,lpServices->lpDisplayName);printf("\n\t\tTotal %d Service(s).\n\n", dwServicesReturned);free(lpServices);CloseServiceHandle(hSCManager);return 0;}// ------------------------// !分析命令行参数// ------------------------//// !安装服务//if(!stricmp(argv[1], "-install")){if(argc != 4){Usage(argv[0]);return 0;}nRet = InstallService(hSCManager, argv[2], argv[3]);if(!nRet){printf("Install service failed.\n");return -1;}}//// 卸载服务//if(!stricmp(argv[1], "-remove")){if(argc != 3){Usage(argv[0]);return 0;}nRet = RemoveService(hSCManager, argv[2]);if(!nRet){printf("Remove service failed.\n");return -1;}}//// 启动服务//if(!stricmp(argv[1], "-start")){if(argc != 3){Usage(argv[0]);return 0;}nRet = StartService(hSCManager, argv[2]);if(!nRet){printf("Start service failed.\n");return -1;}}//// 停止服务//if(!stricmp(argv[1], "-stop")){if(argc != 3){Usage(argv[0]);return 0;}nRet = StopService(hSCManage!r, argv[2]);if(!nRet){printf("Stop service failed.\n");return -1;}}// -----------------------------------------------------CloseServiceHandle(hSCManager);return 0;}////  EnumServices//  列举系统的驱动//  ----------------------//  参数://        [IN]  SC_HANDLE hSCManager    服务管理器句柄//        [OUT] LPDWORD   lpdwServices  系统中安装的驱动的数量//  返回值://成功返回ENUM_SERVICE_STATUS结构的指针,否则返回NULL//  LPENUM_SERVICE_STATUS EnumServices(SC_HANDLE hSCManager, LPDWORD lpdwServices){DWORD cbBytesNeeded = 0;DWORD cbBufSize = 0;DWORD dwServicesReturned = 0;int  nRet = 0;//// 首次调用EnumServicesStatus确定缓冲区的大小,由cbBytesNeeded?祷?br>//nRet = EnumServicesStatus(hSCManager,SERV!ICE_DRIVER,SERVICE_STATE_ALL,NULL,0,&cbBytesNeeded,lpdwServices,0);LPENUM_SERVICE_STATUS lpServices = (LPENUM_SERVICE_STATUS) malloc(cbBytesNeeded);cbBufSize = cbBytesNeeded;nRet = EnumServicesStatus(hSCManager,SERVICE_DRIVER,SERVICE_STATE_ALL,lpServices,cbBufSize,&cbBytesNeeded,lpdwServices,0);if(nRet == 0){err_show("EnumServicesStatus()");return NULL;}return lpServices;}////  InstallService//  安装服务//  参数://      [IN] SC_HANDLE hSCManager   服务管理器句柄//      [IN] LPCTSTR   ServiceName  服务名称//      [IN] LPCTSTR   ServiceExe   可执行文件(需全路径)//  输出://  成功:返回TRUE,否则返回FALSE//BOOL InstallService(SC_HA!NDLE hSCManager, LPCTSTR ServiceName, LPCTSTR ServiceExe){    SC_HANDLE  schService;//// so #$%@! ...:)//printf("Install %s... ", ServiceExe);    schService = CreateService( hSCManager, // SCManager database                                ServiceName,             // name of service                                ServiceName,             // name to display              &nb!sp;          !; &nbsp;     SERVICE_ALL_ACCESS,      // desired access                                SERVICE_KERNEL_DRIVER,   // service type                                SERVICE_DEMAND_START,    // start type                                SERVICE_ERROR_NORMAL,    // error control type                   &n!bsp;            ServiceExe,              // service's binary                                NULL,                    // no load ordering group                                NULL,                    // no tag identifier                  !;          &!nbsp;&nbsp;  NULL,                    // no dependencies                                NULL,                    // LocalSystem account                                NULL                     // no password                         !;      );    if (schService == NULL){if(GetLastError() == ERROR_SERVICE_EXISTS){printf("Service has already installed!\n");}err_show("CreateService()");        return FALSE;}printf("Ok!\n");    CloseServiceHandle(schService);    return TRUE;}////  StartService//  启动服务//  ----------------//  参数://      [IN] SC_HANDLE hSCManager 服务管理器句柄//      [IN] LPCTSTR   ServiceName 驱动名称//  返回值://      成功返回TRUE,否则返回FALSE//BOOL StartService(SC_HANDLE hSCManager, LPCTSTR ServiceName){    SC_HANDLE  schService = NULL;&!nbsp;   int      ! &nbsp;nRet = 0;    schService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);    if(schService == NULL){if(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST){printf("Service is not exist!\n");return FALSE;}err_show("OpenService()");        return FALSE;}    nRet = StartService(schService, 0, NULL);if(!nRet){if(GetLastError() == ERROR_SERVICE_ALREADY_RUNNING){printf("Service is already running!\n");return nRet;}err_show("StartService()");}    CloseServiceHandle(schService);    return nRet;}////  StopService//  停止驱动//  ---------------//  参数://      [IN] SC_HANDLE hSCManager  !;服务管理器句柄//      [IN] LPCTSTR   ServiceName 服务名称//  返回值://      成功返回TRUE,否则返回FALSE//BOOL StopService(SC_HANDLE hSCManager, LPCTSTR ServiceName){    SC_HANDLE      schService = NULL;    SERVICE_STATUS ServiceStatus;int            nRet = 0;    schService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);    if(schService == NULL)        return FALSE;    nRet = ControlService(schService, SERVICE_CONTROL_STOP, &ServiceStatus);if(!nRet){switch(GetLastError()){case ERROR_SERVICE_NOT_ACTIVE:printf("Service has stopped!\n");return nRet;case E!RROR_INVALID_SERVICE_CONTROL:printf("The requested co!ntrol code is not valid!\n");return nRet;}err_show("ControlService()");}        CloseServiceHandle(schService);    return nRet;}////  RemoveService//  卸载服务//  ------------//  参数://      [IN] SC_HANDLE hSCManager   服务管理器句柄//      [IN] LPCTSTR   ServiceName  服务名称//  返回值://      成功返回TRUE,否则返回FALSE//BOOL RemoveService(SC_HANDLE hSCManager, LPCTSTR ServiceName){    SC_HANDLE schService;    int      nRet = 0;    schService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);    if(schService == NULL)<!br>return FALSE;    nRet = DeleteService(schService);if(!nRet){err_show("DeleteService()");}    CloseServiceHandle(schService);    return nRet;}////  IsAdmin//  判断当前用户是否有Administrator的UNIX系统编程常用库函数说明Linux入侵检测浅谈数据库的攻击Windows 2000缓冲区溢出入门Win32 Code Tips网络安全方面的专业词汇rootkit综述IIS多数漏洞的整理计算机网络病毒的十项防范措施 Windows2000安全检查清单相关链接共 195 篇>','相关的链接')" href="http://www.safechina.net/article/showarticle.php?id=1099283698#">权限//  -----------------------------------------//  参数://      N/A//  返回值://      若具有权限返回TRUE,否则返回FALSE//BOOL IsAdmin(void){HANDLE                   hAccessToken;    BYTE                     *InfoBuffer;    PTOKEN_GROUPS      &nbs!p;     ptgGroups;  &nbs!p; DWORD                    dwInfoBufferSize;    PSID                     psidAdministrators;    SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;    UINT                     i;    BOOL                     bRet = FALSE;    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken))goto cleanup;    InfoBuffer = new BYTE[1024];    if(!InfoBuffer)goto cleanup;   !; bRet = GetTokenInformation(hAccessToken,                               TokenGroups,                               InfoBuffer,                               1024,                               &dwInfoBufferSize);    CloseHandle(hAccessToken);    if(!bRet)       goto cleanup;<!br>    if( !AllocateAndInitializeSid(&!siaNtAuthority,                                 2,                                 SECURITY_BUILTIN_DOMAIN_RID,                                 DOMAIN_ALIAS_RID_ADMINS,                                 0,0,0,0,0,0,                    &nbs!p;            &psidAdministrators) )       goto cleanup;    bRet = FALSE;    ptgGroups = (PTOKEN_GROUPS)InfoBuffer;    for(i = 0; i < ptgGroups->GroupCount; i++)    {        if(EqualSid(psidAdministrators,ptgGroups->Groups[i].Sid))        {            bRet = TRUE;            break;        }    }    FreeSid(psidAdministrators);cleanup:    if(InfoBuffer)delete InfoBuffer;    return bRet;}void er!r_show(char* msg){fprintf(stderr, "%s failed. --e!rr: %d\n", msg, GetLastError());}void Usage(char* msg){printf("+------------------------------+\n");printf("│      Services tool v0.1      │\n");printf("│      Write By CDrea          │\n");printf("│      2004-11-1               │\n");printf("│      thx to sinister         │\n");printf("│   http://www.safechina.net   │\n");printf("+------------------------------+\n");printf("USAGE:\n");printf("  %s [[-install srv exe] │ [-remove srv] │ [-start srv] │ [-stop srv]] [srv]\n\n", msg);printf(&!quot;    %s          Show all service\n", msg);printf("    %s srv      Show status of srv_name\n", msg);printf("    -install srv exe     Install a service, and must full path of exe\n");printf("    -remove  srv         Remove a service\n");printf("    -start   srv         Start a service\n");printf("    -stop    srv         Stop a service\n");printf("eg.\n");printf("  %s -install fw c:\\fw.sys", msg);
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部