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

nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb

第一部分:MmMapViewInSystemCache函数返回

        Status = MmMapViewInSystemCache (SharedCacheMap->Section,
                                         &Vacb->BaseAddress,
                                         &NormalOffset,
                                         &MappedLength.LowPart);


NTSTATUS
MmMapViewInSystemCache (
    IN PVOID SectionToMap,
    OUT PVOID *CapturedBase,
    IN OUT PLARGE_INTEGER SectionOffset,
    IN OUT PULONG CapturedViewSize
    )

第二部分:(ntkrnlmp!_VACB *)0x89988000结构中的BaseAddress      : 0xc1080000

1: kd> p
nt!MmMapViewInSystemCache+0x51e:
80aaf210 c21000          ret     10h
1: kd> p
nt!CcGetVacbMiss+0x300:
80a1a49e 8945d4          mov     dword ptr [ebp-2Ch],eax
1: kd> dv
   SharedCacheMap = 0x89901cc8
       FileOffset = {0}
          OldIrql = 0xf78d69bf ""
      PageIsDirty = 0x89901cc8
OldSharedCacheMap = 0xffffffff
     NormalOffset = {0}
       ActiveVacb = 0x00000000
             Vacb = 0x89988000
           Status = 0n-141727208
       ActivePage = 0x30
     MappedLength = {262144}
1: kd> dx -r1 ((ntkrnlmp!_VACB *)0x89988000)
((ntkrnlmp!_VACB *)0x89988000)                 : 0x89988000 [Type: _VACB *]
    [+0x000] BaseAddress      : 0xc1080000 [Type: void *]                    BaseAddress      : 0xc1080000
    [+0x004] SharedCacheMap   : 0x0 [Type: _SHARED_CACHE_MAP *]
    [+0x008] Overlay          [Type: __unnamed]
    [+0x010] LruList          [Type: _LIST_ENTRY]

第三部分:

    //
    //  Finish filling in the Vacb, and store its address in the array in
    //  the Shared Cache Map.  (We have to rewrite the ActiveCount
    //  since it is overlaid.)  To do this we must reacquire the
    //  spin lock one more time.  Note we have to check for the unusual
    //  case that someone beat us to mapping this view, since we had to
    //  drop the spin lock.
    //

    if ((TempVacb = GetVacb( SharedCacheMap, NormalOffset )) == NULL) {

        Vacb->SharedCacheMap = SharedCacheMap;
        Vacb->Overlay.FileOffset = NormalOffset;
        Vacb->Overlay.ActiveCount = 1;

        SetVacb( SharedCacheMap, NormalOffset, Vacb );

#define GetVacb(SCM,OFF) (                                                                \
    ((SCM)->SectionSize.QuadPart > VACB_SIZE_OF_FIRST_LEVEL) ?                            \
    CcGetVacbLargeOffset((SCM),(OFF).QuadPart) :                                          \
    (SCM)->Vacbs[(OFF).LowPart >> VACB_OFFSET_SHIFT]                                      \
)

dv

     NormalOffset = {0}

1: kd> p
nt!CcGetVacbMiss+0x4cb:
80a1a669 8b1c81          mov     ebx,dword ptr [ecx+eax*4]
1: kd> r
eax=00000000 ebx=00000000 ecx=89901cf8


第四部分: ((TempVacb = GetVacb( SharedCacheMap, NormalOffset )) == NULL)


1: kd> dd 89901cf8
89901cf8  00000000 00000000 00000000 00000000
89901d08  89901cf8 899c41b0 00000000 00000000
89901d18  00000000 00000000 00000000 00000001
89901d28  00000000 80b1cbd0 80b1cbd0 00000204
89901d38  00000000 00000000 e127a740 00000000
89901d48  00000000 00000000 00000000 00000000
89901d58  f7169a2c 898ffa10 89901dec 89901dec
89901d68  00000000 f718f6ec 00000000 00000000

1: kd> p
nt!CcGetVacbMiss+0x4ce:
80a1a66c 85db            test    ebx,ebx
1: kd> r
eax=00000000 ebx=00000000 ecx=89901cf8 edx=00000000 esi=89988000 edi=89901cc8
eip=80a1a66c esp=f78d6948 ebp=f78d6994 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
nt!CcGetVacbMiss+0x4ce:
80a1a66c 85db            test    ebx,ebx
1: kd> p
nt!CcGetVacbMiss+0x4d0:
80a1a66e 7527            jne     nt!CcGetVacbMiss+0x4f9 (80a1a697)

89901cf8还没有被设置现在设置Vacb!!!


第五部分:

    if ((TempVacb = GetVacb( SharedCacheMap, NormalOffset )) == NULL) {

        Vacb->SharedCacheMap = SharedCacheMap;
        Vacb->Overlay.FileOffset = NormalOffset;
        Vacb->Overlay.ActiveCount = 1;

        SetVacb( SharedCacheMap, NormalOffset, Vacb );


1: kd> dx -r1 ((ntkrnlmp!_VACB *)0x89988000)
((ntkrnlmp!_VACB *)0x89988000)                 : 0x89988000 [Type: _VACB *]
    [+0x000] BaseAddress      : 0xc1080000 [Type: void *]
    [+0x004] SharedCacheMap   : 0x89901cc8 [Type: _SHARED_CACHE_MAP *]
    [+0x008] Overlay          [Type: __unnamed]
    [+0x010] LruList          [Type: _LIST_ENTRY]


   +0x008 Overlay          : __unnamed
      +0x000 FileOffset       : _LARGE_INTEGER
         +0x000 LowPart          : Uint4B
         +0x004 HighPart         : Int4B
         +0x000 u                : __unnamed
         +0x000 QuadPart         : Int8B
      +0x000 ActiveCount      : Uint2B


1: kd> dd 0x89988000
89988000  c1080000 89901cc8 00000001 00000000
89988010  80b1cb60 80b1cb60


第六部分:

1: kd> t
Breakpoint 2 hit
nt!SetVacb:
80a194a2 55              push    ebp
1: kd> kc
 #
00 nt!SetVacb
01 nt!CcGetVacbMiss
02 nt!CcGetVirtualAddress
03 nt!CcMapData
04 Ntfs!NtfsMapStream
05 Ntfs!NtfsReadBootSector
06 Ntfs!NtfsMountVolume
07 Ntfs!NtfsCommonFileSystemControl
08 Ntfs!NtfsFspDispatch
09 nt!ExpWorkerThread
0a nt!PspSystemThreadStartup
0b nt!KiThreadStartup
1: kd> dv
 SharedCacheMap = 0x89901cc8
         Offset = {0}
           Vacb = 0x89988000

    } else if (Vacb < VACB_SPECIAL_FIRST_VALID) {
        SharedCacheMap->Vacbs[Offset.LowPart >> VACB_OFFSET_SHIFT] = Vacb;
    }

#define VACB_OFFSET_SHIFT                (18)


第七部分:结果!!!

1: kd> dd 0x89901cf8
89901cf8  89988000
1: kd> dt nt!_vacb 89988000
   +0x000 BaseAddress      : 0xc1080000 Void
   +0x004 SharedCacheMap   : 0x89901cc8 _SHARED_CACHE_MAP
   +0x008 Overlay          : __unnamed
   +0x010 LruList          : _LIST_ENTRY [ 0x80b1cb60 - 0x80b1cb60 ]

原来为0
1: kd> dd 89901cf8
89901cf8  00000000 00000000 00000000 00000000

http://www.lryc.cn/news/2397335.html

相关文章:

  • JSP、HTML和Tomcat
  • (1)pytest简介和环境准备
  • Git 入门学习教程
  • 构建高性能风控指标系统
  • openfeignFeign 客户端禁用 SSL
  • DeepSeek 赋能自动驾驶仿真测试:解锁高效精准新范式
  • 晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册
  • 实验一:PyTorch基本操作实验
  • 可视化大屏通用模板Axure原型设计案例
  • 通配符(Wildcard)与正则表达式(Regular Expression)的关系及区别
  • 历年山东大学计算机保研上机真题
  • Java处理动态的属性:字段不固定、需要动态扩展的 JSON 数据结构
  • MAC电脑怎么通过触摸屏打开右键
  • 用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?
  • 【东枫科技】KrakenSDR 天线阵列设置
  • Spring Boot中的事件与JMS消息集成
  • ubuntu/windows系统下如何让.desktop/.exe文件 在开机的时候自动运行
  • 云计算数据治理
  • 【Net】TCP粘包与半包
  • 【Android】如何抓取 Android 设备的 UDP/TCP 数据包?
  • 深度解析 Nginx 配置:从性能优化到 HTTPS 安全实践
  • 触发器与存储过程详解
  • 游戏盾与高防CDN的协同防御策略分析
  • Scratch节日 | 六一儿童节射击游戏
  • GPU层次结构(Nvidia和Apple M芯片,从硬件到pytorch)
  • 一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban
  • (九)深度学习---自然语言处理基础
  • 【Java Web】速通Tomcat
  • Docker快速部署数据同步工具DataX-Web
  • 从零开始的云计算生活——第十四天,困难重重,安全管理。