TA的每日心情 | 奋斗 2023-6-30 13:23 |
|---|
签到天数: 105 天 [LV.6]常住居民II
|
逆向系列文章[url]http://www.yxfzedu.com/调试驱动[/url]的相关知识也可以到网站具体了解一下,有专业的客服人员为您全面解读,相信会有一个好的合作![align=center]http://resources.yxfzedu.com/images/other_images/niumo_video.png[/align]
一、
二、
、
四、
五、
六、
七、
八、
九、
十、
先通过看几个图来认识一下CR3相同的地方:
1。先选择两个不同进程的CR3。
2。然后查看页帧数据库的CR3物理页的信息,得知不同进程的PA是一样的【每个人数值可能不同,但这类数值比较特殊,后面会用来做比较】
3。一个进程的创建是通过MCPAS这个函数,通过逆向后得知CR3的PA的值是由MIPFOP来给予。
4。好了,知道了他的由来,再来看看他是怎么屏蔽的,通过逆向MMS得知,关链函数在MFSP。
上面我们得知PA是一个比较特殊的地址:如图
PA:94898转成虚拟地址894000,发现没,他在P范围之内,这就是他的判定的原理,在这个范围之内,则判定失败。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好了,现在开始我们的绕过代码之行:
先上效果图(我们以WO为例),因为懒,就没有去对齐,看着就行:
代码写的简单
#
#PTE_BASE0
#MMPFNDATABASE1
BOOLEANBPC3(INPHYSICAL_ADDRESSPA);
PVOIDFB(INCHAR);
PUINT64OPA=0;
PVOID;
VOIDU(PDRIVER_OBJECTDO)
{
()
{
MUIS(,000);
}
KP(("\"));
}
NTSTATUSDE(PDRIVER_OBJECTDO,PUNICODE_STRINGRP)
{
NTSTATUS=STATUS_SUCCESS;
DO-DU=U;
KP(("\"));
PHYSICAL_ADDRESSP;
PQP=0;
(!BPC3(P))
{
KP(("BPC3E\"));
}
=MMIS(P,000,FALSE);
KP(("=%\",));
;
}
BOOLEANBPC3(
INPHYSICAL_ADDRESSPA
)
{
首步先申请000非分页内存,得到PTE用来替换
PVOIDM=EAPWT(NPP,000,'M3');
(!M)
{
KP(("E\"));
0;
}
第二步找到MMPTE基址
PVOIDPB=FB(PTE_BASE);
PVOIDPB=FB(MMPFNDATABASE);
PB=(UINT64)PB0FFFFFFFFFFFFFFF0;
(!PB!PB)
{
KP(("FB\"));
0;
}
第步找到CR3的MMPFNPA来替换
UINT64I=PAQP0;
保存旧的OPA,可以在映后恢复,也可以不恢复,目前未发现不恢复会出现问题
OPA=*(PUINT64)(I*0+(UINT64)PB+8);
第4步得到开始申请的非分页内存的PTE,进行替换
UINT64MP=(((UINT64)M0FFFFFFFFFFFF)0)*8+(UINT64)PB;
*(PUINT64)(I*0+(UINT64)PB+8)=MP;
1;
}
PVOIDFB()
{
PUCHARBA=MGVFP;
()
{
*(PUINT64)(BA+0);
}
{
*(PUINT64)(BA+2);
}
}
完。 |
|