本人研究这些东西没有人一起讨论 不支持研究的方向对不对 如果有误还请指出 我的联系方式:ilovexibayaever@gmail.com
加载驱动 返回0xC0000428
IDA搜索立即数0xC0000428
发现有这么几个地方
看SeValidateImageHeader
很明显一个全局变量在影响这个判断 g_CiEnabled
看看那个地方在操作g_CiEnabled 发现是SepInitializeCodeIntegrity
这跟我们研究下面没有太大的关系 因为如果在这里path已经迟了 这个函数在系统启动的时候就运行了 当然如果要静态过DSE的话就在这里path
根据SeValidateImageHeader的反汇编可以看到 只需要对g_CiEnabled就行置0即可
在看看SeValidateImageData
这里也做了判断
这个函数其实没多大的作用qword_1402256A8其实就是CiValidateImageData的地址指针可在在windbg中查看 这个函数在ci.dll中
其它出现mov xxx,0xC0000428我在windbg双机调试中没有出现(加载驱动的时候没有断下)
还有一种方法不对g_CiEnabled处理 下面就调用了
result = g_CiCallbacks(a1, a2, a3, a4);
这个就是CiValidateImageHeader 我们去看看
加载驱动 返回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