Win7 x64动态开启DSE

本文详细探讨了Windows 7 x64系统中动态开启驱动签名强制执行(DSE)的过程,通过分析内核函数如SeValidateImageHeader和CiValidateImageHeader,发现DSE的判断关键在于全局变量g_CiEnabled和g_CiOptions。通过修改这些变量或其相关函数,可以影响驱动加载时的DSE检查。同时,文章提到了CiInitializePhase2和SepInitializeCodeIntegrity在系统启动时的作用,这两个函数对DSE的开启与否起到决定性作用。
摘要由CSDN通过智能技术生成
本人研究这些东西没有人一起讨论 不支持研究的方向对不对 如果有误还请指出 我的联系方式:ilovexibayaever@gmail.com


加载驱动 返回0xC0000428


IDA搜索立即数0xC0000428
地址                   Function                           指令                   
----                   --------                           ----                   
.text:00000001400EE0F0 MiResolveTransitionFault           mov     eax, 0C0000428h
.text:00000001400EE10F MiResolveTransitionFault           mov     eax, 0C0000428h
.text:00000001400EE3E3 MiResolveProtoPteFault             mov     eax, 0C0000428h
PAGE:00000001402E89E4  SeValidateImageHeader              mov     eax, 0C0000428h
PAGE:00000001403A5168  SeValidateImageData                mov     eax, 0C0000428h
PAGE:00000001404F6F37  PipCallDriverAddDeviceQueryRoutine cmp     eax, 0C0000428h
PAGE:00000001404F6F8D  PipCallDriverAddDeviceQueryRoutine cmp     ebx, 0C0000428h
PAGE:00000001404F716F  PipCallDriverAddDeviceQueryRoutine cmp     ebx, 0C0000428h


发现有这么几个地方
看SeValidateImageHeader 
[sourcecode language="c"]
int __fastcall SeValidateImageHeader(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5)
{
  PVOID v5; // rax@2
  int result; // eax@2


  if ( g_CiEnabled )
  {
    if ( g_CiCallbacks )
      result = g_CiCallbacks(a1, a2, a3, a4);//我们可以去看看它干了什么 这个 其实就是CiValidateImageHeader
    else
      result = 0xC0000428;//这个情况是因为是安全模式
  }
  else
  {
    v5 = ExAllocatePoolWithTag(PagedPool, 1ui64, 0x68506553u);
    *(_QWORD *)a5 = v5;
    result = v5 == 0i64 ? 0xC0000017 : 0;
  }
  return result;
}
[/sourcecode]


很明显一个全局变量在影响这个判断 g_CiEnabled 
看看那个地方在操作g_CiEnabled  发现是SepInitializeCodeIntegrity
[sourcecode language="c"]
__int64 SepInitializeCodeIntegrity()
{
  signed __int64 v0; // rbx@1
  signed int v1; // edi@2
  __int64 v2; // rax@2
  bool v3; // zf@6


  v0 = 0i64;
  if ( InitIsWinPEMode )
  {
    g_CiEnabled = 0;//如果是安全模式就为0
  }
  else
  {
    g_CiEnabled = 1;
    v1 = 6;
    g_CiCallbacks = 0i64;
    qword_1402256A8 = 0i64;
    qword_1402256B0 = 0i64;
    v2 = *(_QWORD *)&KeLoaderBlock_0;
    if ( *(_QWORD *)&KeLoaderBlock_0 )
    {
      if ( *(_QWORD *)(*(_QWORD *)&KeLoaderBlock_0 + 152i64) )
      {
        if ( SepIsOptionPresent(*(_QWORD *)(*(_QWORD *)&KeLoaderBlock_0 + 152i64), "DISABLE_INTEGRITY_CHECKS") )
          v1 = 0;
        v3 = SepIsOptionPresent(*(_QWORD *)(*(_QWORD *)&KeLoaderBlock_0 + 152i64), "TESTSIGNING") == 0;
        v2 = *(_QWORD *)&KeLoaderBlock_0;
        if ( !v3 )
          v1 |= 8u;
      }
      if ( v2 )
        v0 = v2 + 48;
    }
    LODWORD(v0) = CiInitialize_0((unsigned int)v1, v0, &g_CiCallbacks);
  }
  return (unsigned int)v0;
}
[/sourcecode]


这跟我们研究下面没有太大的关系 因为如果在这里path已经迟了 这个函数在系统启动的时候就运行了 当然如果要静态过DSE的话就在这里path
根据SeValidateImageHeader的反汇编可以看到 只需要对g_CiEnabled就行置0即可
在看看SeValidateImageData 
[sourcecode language="c"]
int SeValidateImageData()
{
  int result; // eax@1


  result = 0;
  if ( g_CiEnabled )
  {
    if ( qword_1402256A8 )
      result = qword_1402256A8();
    else
      result = 0xC0000428;
  }
  return result;
}
[/sourcecode]


这里也做了判断
这个函数其实没多大的作用qword_1402256A8其实就是CiValidateImageData的地址指针可在在windbg中查看 这个函数在ci.dll中
其它出现mov xxx,0xC0000428我在windbg双机调试中没有出现(加载驱动的时候没有断下)
还有一种方法不对g_CiEnabled处理 下面就调用了
result = g_CiCallbacks(a1, a2, a3, a4);
这个就是CiValidateImageHeader 我们去看看
[sourcecode language="c"]
__int64 __fastcall CiValidateImageHeader(__int64 a1, __int64 a2, unsigned int a3, unsigned int a4, PVOID *a5)
{
  signed int v5; // ebp@1
  unsigned int v6; // er12@1
  __int64 v7; // r14@1
  unsigned int v8; // ebx@1
  __int64 v9; // r13@1
  bool v10; // zf@1
  int v11; // er15@1
  unsigned int v12; // edi@1
  int v13; // eax@2
  int v14; // eax@4
  __int64 v16; // r9@29
  __int64 v17; // r8@29
  __int64 v18; // rdx@29
  __int64 v19; // rcx@29
  int v20; // eax@30
  signed int v21; // eax@43
  __int64 v22; // rdx@46
  int v23; // er11@55
  __int64 v24; // rdx@6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值