• SVChost执行原理学习


    OD直接加载svchost.exe  -k rpcss  以命令行参数形式加载
    1)svchost.exe加载到内存中
    01002509 >/$  E8 EEFCFFFF   call svchost.010021FC
    0100250E  |.  8BFF          mov edi,edi
    01002510  |.  56            push esi
    01002511  |.  57            push edi
    01002512  |.  68 A22E0001   push svchost.01002EA2                                  ; /pTopLevelFilter = svchost.01002EA2
    01002517  |.  FF15 94100001 call dword ptr ds:[<&KERNEL32.SetUnhandledExceptionFil>; SetUnhandledExceptionFilter
    0100251D  |.  6A 01         push 0x1                                               ; /ErrorMode = SEM_FAILCRITICALERRORS
    0100251F  |.  FF15 90100001 call dword ptr ds:[<&KERNEL32.SetErrorMode>]           ; SetErrorMode
    01002525  |.  FF15 8C100001 call dword ptr ds:[<&KERNEL32.GetProcessHeap>]         ; [GetProcessHeap
    0100252B  |.  50            push eax
    0100252C  |.  E8 61FAFFFF   call svchost.01001F92
    01002531  |.  B8 68400001   mov eax,svchost.01004068
    01002536  |.  68 40400001   push svchost.01004040                                  ; /pCriticalSection = svchost.01004040
    0100253B  |.  A3 6C400001   mov dword ptr ds:[0x100406C],eax                       ; |
    01002540  |.  A3 68400001   mov dword ptr ds:[0x1004068],eax                       ; |
    01002545  |.  FF15 88100001 call dword ptr ds:[<&KERNEL32.InitializeCriticalSectio>; InitializeCriticalSection
    0100254B  |.  FF15 84100001 call dword ptr ds:[<&KERNEL32.GetCommandLineW>]        ; [GetCommandLineW
    01002551  |.  50            push eax
    01002552  |.  E8 5AFDFFFF   call svchost.010022B1                                  ;  2)对命令行进行解析,获得启动的服务组netsvcs
    01002557  |.  8BF0          mov esi,eax
    01002559  |.  85F6          test esi,esi
    0100255B  |.  74 28         je Xsvchost.01002585
    0100255D  |.  56            push esi
    0100255E  |.  E8 6BFEFFFF   call svchost.010023CE                                  ;  3)查询键值等


    跟进函数   这里我发现  直接看regedit 看不到 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvcHost 下的服务,但是跟踪却能看到

    01001563   .  8938          mov dword ptr ds:[eax],edi
    01001565   .  8D45 FC       lea eax,dword ptr ss:[ebp-0x4]
    01001568   .  50            push eax                                               ; /pBufSize
    01001569   .  57            push edi                                               ; |Buffer => NULL
    0100156A   .  8D45 F8       lea eax,dword ptr ss:[ebp-0x8]                         ; |
    0100156D   .  50            push eax                                               ; |pValueType
    0100156E   .  57            push edi                                               ; |Reserved => NULL
    0100156F   .  FF75 0C       push dword ptr ss:[ebp+0xC]                            ; |ValueName
    01001572   .  897D FC       mov dword ptr ss:[ebp-0x4],edi                         ; |
    01001575   .  FF75 08       push dword ptr ss:[ebp+0x8]                            ; |hKey
    01001578   .  FFD6          call esi                                               ; RegQueryValueExW
    0100157A   .  8BD8          mov ebx,eax                                            ;  查询出该路径下子键名为netsvcs的键值
    0100157C   .  3BDF          cmp ebx,edi                                            ;  这里先获得大小
    ·············
    01001858   .  6A 0E         push 0xE
    0100185A   .  5B            pop ebx
    0100185B   .  FF75 FC       push dword ptr ss:[ebp-0x4]
    0100185E   .  57            push edi
    0100185F   .  E8 4DFAFFFF   call svchost.010012B1                                  ;  知道了键值大小就分配大小的内存给初始化键值
    01001864   .  3BC7          cmp eax,edi
    01001866   .  8945 10       mov dword ptr ss:[ebp+0x10],eax
    01001869   .^ 0F84 15FDFFFF je svchost.01001584
    0100186F   .  8D4D FC       lea ecx,dword ptr ss:[ebp-0x4]
    01001872   .  51            push ecx
    01001873   .  50            push eax
    01001874   .  8D45 F8       lea eax,dword ptr ss:[ebp-0x8]
    01001877   .  50            push eax
    01001878   .  57            push edi
    01001879   .  FF75 0C       push dword ptr ss:[ebp+0xC]
    0100187C   .  FF75 08       push dword ptr ss:[ebp+0x8]                            ;  这里开始查询 查询出了大量服务
    0100187F   .  FFD6          call esi                                               ;  ADVAPI32.RegQueryValueExW


    查询 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvcHost etsvcs  的键值

    01001FE3   .  50            push eax                                            ; /pHandle
    01001FE4   .  68 19000200   push 0x20019                                        ; |Access = KEY_READ
    01001FE9   .  6A 00         push 0x0                                            ; |Reserved = 0
    01001FEB   .  FF76 0C       push dword ptr ds:[esi+0xC]                         ; |Subkey
    01001FEE   .  FF75 08       push dword ptr ss:[ebp+0x8]                         ; |hKey
    01001FF1   .  FF15 30100001 call dword ptr ds:[<&ADVAPI32.RegOpenKeyExW>]       ; RegOpenKeyExW
    01001FF7   .  85C0          test eax,eax
    01001FF9   .  0F85 A2000000 jnz svchost.010020A1
    01001FFF   .  8D45 08       lea eax,dword ptr ss:[ebp+0x8]                      ;  遍历几个键值能查询成功就存在键值
    01002002   .  50            push eax
    01002003   .  68 5C210001   push svchost.0100215C                               ;  UNICODE "CoInitializeSecurityParam"
    01002008   .  FF75 0C       push dword ptr ss:[ebp+0xC]
    0100200B   .  E8 E1050000   call svchost.010025F1
    01002010   .  85C0          test eax,eax
    01002012   .  75 06         jnz Xsvchost.0100201A
    01002014   .  8B45 08       mov eax,dword ptr ss:[ebp+0x8]
    01002017   .  8946 10       mov dword ptr ds:[esi+0x10],eax
    0100201A   >  837E 10 00    cmp dword ptr ds:[esi+0x10],0x0
    0100201E   .  74 5F         je Xsvchost.0100207F
    01002020   .  8D45 08       lea eax,dword ptr ss:[ebp+0x8]
    01002023   .  50            push eax
    01002024   .  68 34210001   push svchost.01002134                               ;  UNICODE "AuthenticationLevel"
    01002029   .  FF75 0C       push dword ptr ss:[ebp+0xC]
    0100202C   .  E8 C0050000   call svchost.010025F1
    01002031   .  85C0          test eax,eax
    01002033   .  0F84 CC090000 je svchost.01002A05
    01002039   .  C746 14 04000>mov dword ptr ds:[esi+0x14],0x4
    01002040   >  8D45 08       lea eax,dword ptr ss:[ebp+0x8]
    01002043   .  50            push eax
    01002044   .  68 0C210001   push svchost.0100210C                               ;  UNICODE "ImpersonationLevel"
    01002049   .  FF75 0C       push dword ptr ss:[ebp+0xC]
    0100204C   .  E8 A0050000   call svchost.010025F1
    01002051   .  85C0          test eax,eax
    01002053   .  0F84 B7090000 je svchost.01002A10
    01002059   .  C746 18 02000>mov dword ptr ds:[esi+0x18],0x2
    01002060   >  8D45 08       lea eax,dword ptr ss:[ebp+0x8]
    01002063   .  50            push eax
    01002064   .  68 D4200001   push svchost.010020D4                               ;  UNICODE "AuthenticationCapabilities"
    01002069   .  FF75 0C       push dword ptr ss:[ebp+0xC]
    0100206C   .  E8 80050000   call svchost.010025F1
    01002071   .  85C0          test eax,eax
    01002073   .  0F85 CF080000 jnz svchost.01002948
    01002079   .  8B45 08       mov eax,dword ptr ss:[ebp+0x8]
    0100207C   .  8946 1C       mov dword ptr ds:[esi+0x1C],eax
    0100207F   >  8D45 08       lea eax,dword ptr ss:[ebp+0x8]
    01002082   .  50            push eax
    01002083   .  68 AC200001   push svchost.010020AC                               ;  UNICODE "DefaultRpcStackSize"
    01002088   .  FF75 0C       push dword ptr ss:[ebp+0xC]
    0100208B   .  E8 61050000   call svchost.010025F1
    01002090   .  85C0          test eax,eax
    01002092   .  0F84 C4080000 je svchost.0100295C
    01002098   >  FF75 0C       push dword ptr ss:[ebp+0xC]                         ; /hKey
    0100209B   .  FF15 2C100001 call dword ptr ds:[<&ADVAPI32.RegCloseKey>]         ; RegCloseKey
    010020A1   >  5E            pop esi
    010020A2   .  8BC3          mov eax,ebx
    010020A4   .  5B            pop ebx
    010020A5   .  5D            pop ebp
    010020A6   .  C2 0800       retn 0x8
    4)创建一个SERVICE_TABLE_ENTRY 数组  元素个数就是该服务组服务的个数
    010024BA  |> A1 60400001   mov eax,dword ptr ds:[0x1004060]
    010024BF  |.  8D0480        lea eax,dword ptr ds:[eax+eax*4]
    010024C2  |.  C1E0 02       shl eax,0x2
    010024C5  |.  50            push eax
    010024C6  |.  6A 08         push 0x8
    010024C8  |.  E8 E4EDFFFF   call svchost.010012B1
    010024CD  |.  3BC3          cmp eax,ebx
    010024CF  |.  A3 58400001   mov dword ptr ds:[0x1004058],eax
    010024D4  |.  74 1C         je Xsvchost.010024F2
    010024D6  |.  8B35 B4400001 mov esi,dword ptr ds:[0x10040B4]
    010024DC  |.  8BD8          mov ebx,eax
    010024DE  |>  66:833E 00    /cmp word ptr ds:[esi],0x0
    010024E2  |.  74 0E         |je Xsvchost.010024F2
    010024E4  |.  8933          |mov dword ptr ds:[ebx],esi
    010024E6  |.  56            |push esi
    010024E7  |.  83C3 14       |add ebx,0x14
    010024EA  |.  FFD7          |call edi
    010024EC  |.  8D7446 02     |lea esi,dword ptr ds:[esi+eax*2+0x2]
    010024F0  |.^ EB EC         jmp Xsvchost.010024DE

    01002563  |.  E8 2DFCFFFF   call svchost.01002195                                  ;  得到服务组下所包含的所以服务,创建一个SERVICE_TABLE_ENTRY结构数组
    01002568  |.  8BF8          mov edi,eax
    0100256A  |.  85FF          test edi,edi
    0100256C  |.  74 06         je Xsvchost.01002574
    0100256E  |.  56            push esi
    0100256F  |.  E8 1E000000   call svchost.01002592
    01002574  |>  56            push esi
    01002575  |.  E8 3CF3FFFF   call svchost.010018B6                                  //5)每个服务入口回调函数 都是Svchost.exe内部的同一个固定函数
    0100257A  |.  85FF          test edi,edi
    0100257C  |.  74 07         je Xsvchost.01002585                                   ;  6)注册这些服务的调度函数  最后等待SCM启动服务命令
    0100257E  |.  57            push edi                                               ; /pServiceTable
    0100257F  |.  FF15 34100001 call dword ptr ds:[<&ADVAPI32.StartServiceCtrlDispatch>; StartServiceCtrlDispatcherW
    01002585  |>  6A 00         push 0x0                                               ; /ExitCode = 0
    01002587  .  FF15 80100001 call dword ptr ds:[<&KERNEL32.ExitProcess>]            ; ExitProcess















  • 相关阅读:
    戏说程序猿之荒唐的需求
    戏说程序猿之过年--二叔,我真不会修电脑
    深入理解设计模式(17):迭代器模式
    深入理解设计模式(16):备忘录模式
    我的2018
    Java高级篇(一)——线程
    Java进阶篇(六)——Swing程序设计(下)
    Java进阶篇(六)——Swing程序设计(上)
    Java进阶篇(五)——Java的I/O技术
    Java进阶篇(四)——Java异常处理
  • 原文地址:https://www.cnblogs.com/zcc1414/p/3982407.html
Copyright © 2020-2023  润新知