找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5612|回复: 1

[交流] Servicr函數探討

[复制链接]

96

主题

158

回帖

4

精华

核心会员

积分
6513
发表于 2012-5-20 03:13:47 | 显示全部楼层 |阅读模式
本帖最后由 diddom 于 2012-5-31 08:16 编辑

平常我们 Install Driver 後, Unload Driver,

假如想再 Install Driver却发现会失败, 为什麽....

因为网路上大部分的 Install Driver 工具,它其实没有 DeleteService 刚刚用 CreateService 建立的 Service

先来看点 sniper code,下面是网路上普遍 service 的 Driver Load 的 source code


  1. int _cdecl main(void)
  2. {
  3.     HANDLE hSCManager;
  4.     HANDLE hService;
  5.     SERVICE_STATUS ss;

  6.     hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
  7.    
  8.     printf("Load Driver\n");

  9.     if(hSCManager)
  10.     {
  11.         printf("Create Service\n");

  12.         hService = CreateService(hSCManager, "Example", "Example Driver", SERVICE_START | DELETE | SERVICE_STOP, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, "C:\\example.sys", NULL, NULL, NULL, NULL, NULL);

  13.         if(!hService)
  14.         {
  15.             hService = OpenService(hSCManager, "Example", SERVICE_START | DELETE | SERVICE_STOP);
  16.         }

  17.         if(hService)
  18.         {
  19.             printf("Start Service\n");

  20.             StartService(hService, 0, NULL);
  21.             printf("Press Enter to close service\r\n");
  22.             getchar();
  23.             ControlService(hService, SERVICE_CONTROL_STOP, &ss);

  24.             CloseServiceHandle(hService);

  25.             DeleteService(hService);
  26.         }

  27.         CloseServiceHandle(hSCManager);
  28.     }
  29.    
  30.     return 0;
  31. }
复制代码
千篇一律是这样,真是伤脑筋...><"


正常我们会先 m_schSCManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ALL_ACCESS)


然後 m_schService = CreateService(m_schSCManager, _
                                szDrvSvcName, _
                                szDrvDisplayName, _
                                SERVICE_ALL_ACCESS, _
                                SERVICE_KERNEL_DRIVER, _
                                SERVICE_DEMAND_START, _
                                SERVICE_ERROR_NORMAL, _
                                szDrvFilePath, _
                                0, 0, 0, 0, 0)


接下来 m_hSvcHandle = OpenService(m_schSCManager, szDrvSvcName, SERVICE_ALL_ACCESS)

有发现吗?..............

在 CreateService 和 OpenService 这两函数的返回值,我用不同的变数接住

为什麽?...因为我们等等要真正的删除刚刚用 CreateService 建立的 Service

接下来我们进入讨论一般 InstDrv 工具的 Start Driver 和 Stop Drtiver 的 code

也就是一般的 net Start ServiceName 和 net Stop ServiceName

正常 net Start ServiceName 的 code 是 Ret = StartService(m_hSvcHandle, 0, 0)

再而 net Stop ServiceName 的 code 是 StopDrv = ControlService(m_hSvcHandle, SERVICE_CONTROL_STOP, SS)

好像偏离主题了.........><"

不过我想说的是,如果我们 Start Driver 後, 没有 Stop Drtiver,

你没办法删除 CreateService 建立的 Service, 因为它还在Running状态

讲重点好了~~~~~~~~~~

在上述过程中, 我们建立了 Service, 但也建立两三个 Handle

m_schSCManager
m_schService
m_hSvcHandle

按照 MSDN ,应该是这样


    Call CloseServiceHandle(m_hSvcHandle)
    Call DeleteService(m_hSvcHandle)
         
    Call CloseServiceHandle(m_schService)
    Call DeleteService(m_schService)
         
    Call CloseServiceHandle(m_schSCManager)

假如这样, 就头大了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我们的目的是真正删除 CreateService 建立的 Service

应该是这样才对

    Call CloseServiceHandle(m_hSvcHandle)
    Call DeleteService(m_hSvcHandle)
         
    Call DeleteService(m_schService)
    Call CloseServiceHandle(m_schService)
         
    Call CloseServiceHandle(m_schSCManager)

你也可以实验看看这过程颠倒後结果会是怎样

再来, 希望大家帮我的问题

Device Driver 编译连结分 free 和 checked

我玩了一个晚上, 就是没办法将 checked 版本的 drvier 把它 StopDriver

但 free版本从 Load , Start, Stop, Unload却很正常

不知道为什麽, 请知道的大侠帮我一下看问题出在哪,

付上 source

InstDrv_vb6_20120521_04.rar (22.13 KB, 下载次数: 3)

里面的Delete SC那个Button的函数没用处,那是实验用的

Driver 的 sample file


HookNtProcess_20120518_01.rar (22.74 KB, 下载次数: 13)

Drv example by Codeproject.rar (23.33 KB, 下载次数: 13)

InlineHook_ObReferenceObjectByHandlele_20120427_02.rar (39.66 KB, 下载次数: 14)

那上面3个Drv当实验品,实验一下

////////////////////////////////////////////////////////////

你假如要使用HookNtProcess_20120518_01.rar 这个 sample Drv

注意下面这函数

__declspec(naked) NTSTATUS __stdcall MyNtOpenProcess(
                IN PHANDLE                ProcessHandle,
                IN ACCESS_MASK  DesiredAccess,
                IN POBJECT_ATTRIBUTES ObjectAttributes,
                IN PCLIENT_ID        ClientId)
{
        DbgPrint("[HookSSDT] MyNtOpenProcess() called.\n");

  __asm{
                push    0C4h
                push    804F5308h  // <--- 这个地址请自己用WinDBG看看
                jmp     [JmpAddress]
        }
}


启动 WinDBG 後, [File] -> [Kernel Debug] -> Local 页签,确定 ,开始Debug

然後输入指令 u nt!NtOpenProcess

你会看到

lkd>  u nt!NtOpenProcess
nt!NtOpenProcess:
8058093a 68c4000000      push    0C4h
8058093f 6808534f80      push    offset nt!ObWatchHandles+0x25c (804f5308)  <-- 括号内的地址
80580944 e85a35f6ff      call    nt!_SEH_prolog (804e3ea3)
80580949 33f6            xor     esi,esi
8058094b 8975d4          mov     dword ptr [ebp-2Ch],esi
8058094e 33c0            xor     eax,eax
80580950 8d7dd8          lea     edi,[ebp-28h]
80580953 ab              stos    dword ptr es:[edi]


  __asm{
                push    0C4h
                push    804F5308h  // <--- 这个地址请改成括号内的地址
                jmp     [JmpAddress]
        }

96

主题

158

回帖

4

精华

核心会员

积分
6513
 楼主| 发表于 2012-5-21 08:13:40 | 显示全部楼层
本帖最后由 diddom 于 2012-5-29 02:59 编辑

更新

InstDrv_vb6_20120521_04.rar

使用顺序

Load -> Start -> Open -> Close -> Stop -> Unload


您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表