柚木提娜番号
麻仓优作品封面
你的位置:柚木提娜番号 > 麻仓优作品封面 > sm 调教 [原创]记一次仿写一个内核DWM绘画-软件逆向-看雪-安全社区|安全招聘|kanxue.com

sm 调教 [原创]记一次仿写一个内核DWM绘画-软件逆向-看雪-安全社区|安全招聘|kanxue.com

发布日期:2024-10-19 14:00    点击次数:172

sm 调教 [原创]记一次仿写一个内核DWM绘画-软件逆向-看雪-安全社区|安全招聘|kanxue.com

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直播讲课



Powered by 柚木提娜番号 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群 © 2013-2024