Github仓库地址: https://github.com/cs1ime/KernelDwmsm 调教
本文中波及到的技艺与源码不得用于犯法用途!
之前在Github上看到了一个有酷好酷好的仓库 https://github.com/wbaby/DoubleCallBack
有三次commit,原作家应该便是busy10了
旨趣是内核层调用用户层dwm的DirectX11 vtable函数,用户层把vtable里的函数替换成ntdll里的LdrpIsCODServiceEnabled触发内核中的注册表回调
接着调用vtable里的函数赶走绘画,伪代码如下
不知为啥DirectX11能把Texture copy进Surface内部,DirectX12就弗成了...总之DWM应该会一直使用DirectX11的,一个和会器也没必要上DirectX12这样复杂的API
成人熟妇小说在线这里的绘画赶走是CPU写像素,安排上图形学的算法就行,busy10大佬依然帮咱们写好基本的算法了 https://github.com/wbaby/DoubleCallBack/blob/master/DoubleCallback/LegacyRender.h
难点主要围聚在内核层调用用户层和hook dwm
Windows提供的内核层调用用户层的尺度函数是KeUserModeCallback
这里找到一篇著述分析这个函数 https://www.anquanke.com/post/id/184233#h2-1
只需要看 KiCallUserMode 的赶走就行了,由于sysret将rcx看成了复返用户模式地址的寄存器,那就要复返用户层的时刻要先跳到KiUserCallForwarder的后半段以赶走从栈上获得到事先设定好的Windows x64调用商定中前4个由寄存器传递的参数(rcx,rdx,r8,r9)
sysret之前把rax设为指标函数地址,复返地址设定为NtCallbackReturn 即可。
对于KeUserModeCallback还稀疏需要肯求一个内核栈,个东说念主揣度应该是内核层回到用户层调用函数的时刻,函数内部又要调用一些API进内核需要一个全新的栈。
对于kvashadow的gs:[xxxx]偏移,切换堆栈的时刻必须波及到这个,kvashadow是用来防鬼魂熔断疏忽的,看了一下这个疏忽的赶走旨趣,思要防只可给用户模式单独作念一张莫得内核模式敏锐信息的页表,夙昔渠说念进内核就用夙昔的页表
是以IA32_LSTAR的值确定是由系统凭证有无开启kvashadow自动分拨的
开了kvashadow的syscall进口函数:
没开kvashadow的syscall进口函数:
IA32_LSTAR 纪录的syscall地址淌若开了kvashadow便是KiSystemCall64Shadow,没开便是KiSystemCall64,再加上一个固定偏移就能完好意思定位
赶走代码:
经过Infhook测试发现DirectX11在Present之后必定会调用NtGdiDdDDIGetDeviceState,而这个函数在内核层是可被Hook的
hook点的完整栈回溯如下图
hook点位于DxgkGetDeviceStateInternal复返时机通过Process->DxgkProcess中的函数表调用UserScreenAccessCheck
注入的经由,我尽量写的遮盖性高少量,蓝屏几率小少量
DWM程度是被Windows保护的,有好多保护机制存在,淌若收受mdl映射用户层内存约略ntapi肯求内存的步地,会在VAD内部留住一个大小形成检测标的,况且可能会被Windows的安全机制约略杀软的安全机制遏止
肯求RWX内存的赶走是通过ExAllocatePool肯求内存,通过暴力添加pte条件赶走内存映射,把肯求到的内存映射到用户层模块 ntdll.dll 进取的地址区域
暴力映射内存的赶走在源文献位置 https://github.com/cs1ime/KernelDwm/blob/master/KernelDwm/KernelDwm/dwm/MakeR3Mem.cpp
Hook MultiplanePresent和PresentImpl,实验的时刻纪录第一个参数就行
源码位置: https://github.com/cs1ime/KernelDwm/blob/master/DwmDllFactor/DwmDll/DwmDll/dwm/dxhook.cpp
要庄重源码里的hook写内存用的是VirtualProtect函数,会触发Copy on write形成检测标的
[培训]内核运转高档班sm 调教,冲击BAT一流互联网大厂使命,每周日13:00-18:00直播讲课