当前位置: 首页 > news >正文

ntdll!CsrServerApiRoutine函数--csrsrv!CsrCallServerFromServer什么时候被调用?


第一部分:


1: kd> kc
 #
00 ntdll!CsrClientConnectToServer
01 kernel32!BaseDllInitialize
02 ntdll!LdrpCallInitRoutine
03 ntdll!LdrpRunInitializeRoutines
04 ntdll!LdrpLoadDll
05 ntdll!LdrLoadDll
06 csrsrv!CsrLoadServerDll
07 csrsrv!CsrParseServerCommandLine
08 csrsrv!CsrServerInitialization
09 csrss!main
0a csrss!NtProcessStartup
1: kd> x ntdll!CsrServerProcess
77fbabd4          ntdll!CsrServerProcess = 0x01 ''


NTSTATUS
CsrClientConnectToServer (
    IN PWSTR ObjectDirectory,
    IN ULONG ServerDllIndex,
    IN PVOID ConnectionInformation,
    IN OUT PULONG ConnectionInformationLength OPTIONAL,
    OUT PBOOLEAN CalledFromServer OPTIONAL
    )
{

   CsrServerProcess =
        (NtHeaders->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_NATIVE) ? TRUE : FALSE;

    if (CsrServerProcess) {

        extern PVOID NtDllBase;

        DllName_U.Buffer = L"csrsrv";
        DllName_U.Length = sizeof (L"csrsrv") - sizeof (WCHAR);
        DllName_U.MaximumLength = sizeof(L"csrsrv");

        Status = LdrDisableThreadCalloutsForDll (NtDllBase);
        if (!NT_SUCCESS (Status)) {
            return Status;
        }

        Status = LdrGetDllHandle (NULL,
                                  NULL,
                                  &DllName_U,
                                  (PVOID *)&CsrServerModuleHandle);

        if (!NT_SUCCESS (Status)) {
            return Status;
        }

        RtlInitString (&ProcedureName,"CsrCallServerFromServer");

        Status = LdrGetProcedureAddress (CsrServerModuleHandle,
                                         &ProcedureName,
                                         0L,
                                         (PVOID *)&CsrServerApiRoutine);

        if (!NT_SUCCESS (Status)) {
            return Status;
        }

1: kd> x ntdll!CsrServerApiRoutine
77fbabdc          ntdll!CsrServerApiRoutine = 0x752a5714
1: kd> u 752a5714
csrsrv!CsrCallServerFromServer [d:\srv03rtm\base\subsys\csr\server\apireqst.c @ 871]:


第二部分:

NTSTATUS
CsrClientCallServer (
    IN OUT PCSR_API_MSG m,
    IN OUT PCSR_CAPTURE_HEADER CaptureBuffer OPTIONAL,
    IN CSR_API_NUMBER ApiNumber,
    IN ULONG ArgLength
    )
{

    if (CsrServerProcess == FALSE) {
......
    } else {

        m->h.ClientId = NtCurrentTeb()->ClientId;

        Status = (CsrServerApiRoutine) ((PCSR_API_MSG)m,
                                        (PCSR_API_MSG)m);

第三部分:

1: kd> g
KD: write to 0x752A5714 ok
Breakpoint 16 hit
csrsrv!CsrCallServerFromServer:
001b:752a5714 6a10            push    10h
1: kd> kc
 #
00 csrsrv!CsrCallServerFromServer
01 ntdll!CsrClientCallServer
02 kernel32!CsrBasepNlsCreateSection
03 kernel32!NlsServerInitialize
04 kernel32!NlsDllInitialize
05 kernel32!BaseDllInitialize
06 ntdll!LdrpCallInitRoutine
07 ntdll!LdrpRunInitializeRoutines
08 ntdll!LdrpLoadDll
09 ntdll!LdrLoadDll
0a csrsrv!CsrLoadServerDll
0b csrsrv!CsrParseServerCommandLine
0c csrsrv!CsrServerInitialization
0d csrss!main
0e csrss!NtProcessStartup


1: kd> x ntdll!CsrServerProcess
77fbabd4          ntdll!CsrServerProcess = 0x01 ''

1: kd> dv
     ReceiveMsg = 0x0015f28c
       ReplyMsg = 0x0015f28c
LoadedServerDll = 0x0015f2e4
    ReplyStatus = 0n1454816 (No matching enumerant)
1: kd> dx -r1 ((csrsrv!_CSR_API_MSG *)0x15f28c)
((csrsrv!_CSR_API_MSG *)0x15f28c)                 : 0x15f28c [Type: _CSR_API_MSG *]
    [+0x000] h                [Type: _PORT_MESSAGE]
    [+0x018] ConnectionRequest [Type: _CSR_API_CONNECTINFO]
    [+0x018] CaptureBuffer    : 0x0 [Type: _CSR_CAPTURE_HEADER *]
    [+0x01c] ApiNumber        : 0x10010 [Type: unsigned long]
    [+0x020] ReturnValue      : 0x40001 [Type: unsigned long]
    [+0x024] Reserved         : 0x0 [Type: unsigned long]
    [+0x028] u                [Type: __unnamed]

#define CSR_APINUMBER_TO_SERVERDLLINDEX( ApiNumber ) \
    ((ULONG)((ULONG)(ApiNumber) >> 16))

1: kd> x csrsrv!CsrLoadedServerDll
752aa8c0          csrsrv!CsrLoadedServerDll = struct _CSR_SERVER_DLL *[4]
1: kd> dx -r1 (*((csrsrv!_CSR_SERVER_DLL * (*)[4])0x752aa8c0))
(*((csrsrv!_CSR_SERVER_DLL * (*)[4])0x752aa8c0))                 [Type: _CSR_SERVER_DLL * [4]]
    [0]              : 0x162e78 [Type: _CSR_SERVER_DLL *]
    [1]              : 0x163388 [Type: _CSR_SERVER_DLL *]
    [2]              : 0x0 [Type: _CSR_SERVER_DLL *]
    [3]              : 0x0 [Type: _CSR_SERVER_DLL *]

1: kd> dx -r1 ((csrsrv!_CSR_SERVER_DLL *)0x163388)
((csrsrv!_CSR_SERVER_DLL *)0x163388)                 : 0x163388 [Type: _CSR_SERVER_DLL *]
    [+0x000] Length           : 0x50 [Type: unsigned long]
    [+0x004] ModuleName       [Type: _STRING]
    [+0x00c] ModuleHandle     : 0x752e0000 [Type: void *]
    [+0x010] ServerDllIndex   : 0x1 [Type: unsigned long]
    [+0x014] ServerDllConnectInfoLength : 0x0 [Type: unsigned long]
    [+0x018] ApiNumberBase    : 0x0 [Type: unsigned long]
    [+0x01c] MaxApiNumber     : 0x20 [Type: unsigned long]
    [+0x020] ApiDispatchTable : 0x752e1220 [Type: unsigned long (**)(_CSR_API_MSG *,_CSR_REPLY_STATUS *)]
    [+0x024] ApiServerValidTable : 0x752f0080 : 0x1 [Type: unsigned char *]
    [+0x028] ApiNameTable     : 0x752e12a8 [Type: char * *]
    [+0x02c] PerProcessDataLength : 0x0 [Type: unsigned long]
    [+0x030] ConnectRoutine   : 0x752e4748 [Type: long (*)(_CSR_PROCESS *,void *,unsigned long *)]
    [+0x034] DisconnectRoutine : 0x752e476a [Type: void (*)(_CSR_PROCESS *)]
    [+0x038] HardErrorRoutine : 0x0 [Type: void (*)(_CSR_THREAD *,_HARDERROR_MSG *)]
    [+0x03c] SharedStaticServerData : 0x7f6f0cb0 [Type: void *]
    [+0x040] AddProcessRoutine : 0x0 [Type: long (*)(_CSR_PROCESS *,_CSR_PROCESS *)]
    [+0x044] ShutdownProcessRoutine : 0x0 [Type: unsigned long (*)(_CSR_PROCESS *,unsigned long,unsigned char)]

1: kd> dx -r1 (*((csrsrv!_STRING *)0x16338c))
(*((csrsrv!_STRING *)0x16338c))                 [Type: _STRING]
    [+0x000] Length           : 0x7 [Type: unsigned short]
    [+0x002] MaximumLength    : 0x8 [Type: unsigned short]
    [+0x004] Buffer           : 0x1633d0 : "basesrv" [Type: char *]

1: kd> dd 0x752e1220
752e1220  752e6a64 752e684e 752e69e2 752e6984
752e1230  752e6a02 752ea586 752ea685 752e8f7f
752e1240  752ea6c1 752e816e 752e8d8a 752e76c6
752e1250  752e6a0a 752e6a3d 752ea886 752ea953
752e1260  752ead8e 752e81a7 752e8323 752e82be
752e1270  752e9670 752ec59f 752ec003 752e5dbb
752e1280  752ebb8a 752eac41 752e4a4b 752edb64
752e1290  752e6a02 752e68e6 752ee734 752ea81c

1: kd> u 752ead8e
basesrv!BaseSrvNlsCreateSection [d:\srv03rtm\base\win32\server\srvnls.c @ 1031]:
752ead8e 55              push    ebp
752ead8f 8bec            mov     ebp,esp
752ead91 81ecf8000000    sub     esp,0F8h
752ead97 a1f4012f75      mov     eax,dword ptr [basesrv!__security_cookie (752f01f4)]
752ead9c 8945fc          mov     dword ptr [ebp-4],eax
752ead9f 8b4508          mov     eax,dword ptr [ebp+8]
752eada2 53              push    ebx
752eada3 56              push    esi

相关文章:

  • 2025.05.07-华为机考第二题200分
  • 动态规划之花园
  • 高并发内存池(一):项目简介+定长内存池的实现
  • C25-数组应用及练习
  • iTwin 数据报表(只是简单的原型不代表实现)
  • 解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题
  • ​​阿里云服务器:数字世界的“基因剪刀”与未来实验室​
  • 联想Horizon 2系列电脑 参数
  • C++面向对象 继承
  • python安装pyqt5失败
  • ESP32- 开发笔记- 软件开发 6 蓝牙协议栈 1
  • 【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案
  • [Android] WPS Office11.4.1.6政务定制版
  • windows使用bat脚本激活conda环境
  • Docker + Watchtower 实现容器自动更新:高效运维的终极方案
  • Linux 信号(下篇)
  • 趣味编程:梦幻万花筒
  • QT人工智能篇-opencv
  • QT聊天项目DAY09
  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的分销价格管控机制研究
  • “电竞+文旅”释放价值,王者全国大赛带火赛地五一游
  • 《三餐四季》广东篇今晚开播:食在岭南,遇见百味
  • 哈尔滨工业大学原副校长王魁业逝世,享年92岁
  • 冯德莱恩:欧美贸易谈判前不会前往美国会见特朗普
  • 央行:中国政府债务扩张仍有可持续性
  • 司法部:持续规范行政执法行为,加快制定行政执法监督条例