关于绕过过滤驱动的资料的个人看法和摘要
2009-12-08 16:22
253 查看
刻苦钻研了使用驱动直接使用IN/OUT指令来修改MBR,但是读取成功了,而写MBR却一直没有进展,到现在也没有写进去,汗…
根据网友提供的链接发现了这篇文章,http://www.codeproject.com/KB/system/rawsectorio.aspx。以下所有的个人看法全部依据本文。
在看这篇文章之前倒是了解过winhex这款软件,也使用这个软件在ring3下修改了MBR,所以就怀着一腔的幻想去调试winhex,结果可想而知,莫有结果,只找到一个函数KiFastSystemCall,由于之前对这些深层的东西没有什么了解,所以也算是有所收获,到这里也就以失败告终了。
发现KiFastSystemCall函数时以为winhex内部用了非正常手段,看了这篇文章后才突然觉悟可能是winhex内部调用的系统API然后由API调用的KiFastSystemCall函数(好像是用来跳转到ring0的吧),所以也就纠正了原来的错误,通过那篇文章(当然要保证链接到文章的正确性),另外了解到的是IoCallDriver原来也是可以利用的。
之前还一直认为IoCallDriver会把IRP传递给传入的DEVICE_OBJECT参数的devicestack的栈顶DEVICE_OBJECT,现在回头想想,简直太可笑了,因为这肯定是错误的,IoCallDriver肯定不可能这样做,如果这样做的话IRP就不会被一层层传递下去了,呵呵(自嘲…)
OK,认识到了那个问题后,就开始利用IoCallDriver吧,首先我们可以通过IoGetDeviceObjectPointer获取到一个DeviceObject的指针,这样我们就可以通过IoCallDriver来直接传送自己构造的IRP给你的目的设备了,这样是不需要经过devicestack的。另外也可以不按套路来获取到一个DriverObject的指针,那就是使用ObReferenceObjectByName这个未文档的函数,使用方法如下:
//声明未文档函数
#ifdef__cplusplus
extern"C"
{
#endif
NTSTATUSObReferenceObjectByName(
PUNICODE_STRINGObjectName,
ULONGAttributes,
PACCESS_STATEAccessState,
ACCESS_MASKDesiredAccess,
POBJECT_TYPEObjectType,
KPROCESSOR_MODEAccessMode,
PVOIDParseContext,
PVOID*Object
);
externPOBJECT_TYPEIoDriverObjectType;//这个可以不用再extern“C”中
#ifdef__cplusplus
}
#endif
继续->只要我们得到了DriverObject指针就可以通过他的DeviceObject数据成员来得到它的第一个DeviceObject了,当然通过DeviceObject->NextDevice;可以得到这个DriverObject的创建的所有DeviceObject,因此也就可以通过IoCallDrivera来利用这些DeviceObject了。
所以这个原理可以绕过你想绕过的任意一个FilterDriver或普通的上层Driver(应该是UpperDriver吧),不过有一点要注意的是你不能避免别人HOOK的底层Driver,这点实际不在讨论范围内,实际HOOK一个底层的Driver也并不是什么很难得事(虽然俺没有做过,偷笑..)说到这里实际比较麻烦的就是自己构造一个IRP了,这个么本人还真是没有做过,到网上搜搜资料吧,应该会有不少的,祝你好运!
代码摘要:
根据网友提供的链接发现了这篇文章,
在看这篇文章之前倒是了解过winhex这款软件,也使用这个软件在ring3下修改了MBR,所以就怀着一腔的幻想去调试winhex,结果可想而知,莫有结果,只找到一个函数KiFastSystemCall,由于之前对这些深层的东西没有什么了解,所以也算是有所收获,到这里也就以失败告终了。
发现KiFastSystemCall函数时以为winhex内部用了非正常手段,看了这篇文章后才突然觉悟可能是winhex内部调用的系统API然后由API调用的KiFastSystemCall函数(好像是用来跳转到ring0的吧),所以也就纠正了原来的错误,通过那篇文章(当然要保证链接到文章的正确性),另外了解到的是IoCallDriver原来也是可以利用的。
之前还一直认为IoCallDriver会把IRP传递给传入的DEVICE_OBJECT参数的devicestack的栈顶DEVICE_OBJECT,现在回头想想,简直太可笑了,因为这肯定是错误的,IoCallDriver肯定不可能这样做,如果这样做的话IRP就不会被一层层传递下去了,呵呵(自嘲…)
OK,认识到了那个问题后,就开始利用IoCallDriver吧,首先我们可以通过IoGetDeviceObjectPointer获取到一个DeviceObject的指针,这样我们就可以通过IoCallDriver来直接传送自己构造的IRP给你的目的设备了,这样是不需要经过devicestack的。另外也可以不按套路来获取到一个DriverObject的指针,那就是使用ObReferenceObjectByName这个未文档的函数,使用方法如下:
//声明未文档函数
#ifdef__cplusplus
extern"C"
{
#endif
NTSTATUSObReferenceObjectByName(
PUNICODE_STRINGObjectName,
ULONGAttributes,
PACCESS_STATEAccessState,
ACCESS_MASKDesiredAccess,
POBJECT_TYPEObjectType,
KPROCESSOR_MODEAccessMode,
PVOIDParseContext,
PVOID*Object
);
externPOBJECT_TYPEIoDriverObjectType;//这个可以不用再extern“C”中
#ifdef__cplusplus
}
#endif
继续->只要我们得到了DriverObject指针就可以通过他的DeviceObject数据成员来得到它的第一个DeviceObject了,当然通过DeviceObject->NextDevice;可以得到这个DriverObject的创建的所有DeviceObject,因此也就可以通过IoCallDrivera来利用这些DeviceObject了。
所以这个原理可以绕过你想绕过的任意一个FilterDriver或普通的上层Driver(应该是UpperDriver吧),不过有一点要注意的是你不能避免别人HOOK的底层Driver,这点实际不在讨论范围内,实际HOOK一个底层的Driver也并不是什么很难得事(虽然俺没有做过,偷笑..)说到这里实际比较麻烦的就是自己构造一个IRP了,这个么本人还真是没有做过,到网上搜搜资料吧,应该会有不少的,祝你好运!
代码摘要:
LARGET_INTEGERlDiskOffset;
PDEVICE_OBJECTpDevObj;//Deviceobjectrepresentingdisk/partition
KEVENTEvent;
//Tryingtoreadsomearbitrarysectornumber1169944and
//bydefaultassumingsectorsize
//512
..........
..........
lDiskOffset.QuadPart=1169944*512;
sBuf=ExAllocatePool(NonPagedPool,size);
if(!sBuf){
ObDereferenceObject(pFileObj);
returnSTATUS_INSUFFICIENT_RESOURCES;
}
KeInitializeEvent(&Event,NotificationEvent,FALSE);
memset(sBuf,'0x00',size);
pIrp=IoBuildSynchronousFsdRequest(IRP_MJ_WRITE/*IRP_MJ_READ*/,
pDevObj,sBuf,size,&lDiskOffset,&Event,&ioStatus);
if(!pIrp){
ExFreePool(sBuf);
returnSTATUS_INSUFFICIENT_RESOURCES;
}
status=IoCallDriver(pDevObj,pIrp);
if(status==STATUS_PENDING){
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
status=ioStatus.Status;
}
ExFreePool(sBuf);
..........
相关文章推荐
- 如何查阅资料,解决问题(个人的小看法)
- 谈谈个人关于程序开发中,“零配置”和“有配置”的看法【转】
- 本学期的关于C语言的课已经正式结束 一些个人关于C语言学习的看法
- 关于阿里如何吸引大学生用户理财的一些个人看法
- 关于代码注释我的个人看法
- 谈谈个人关于程序开发中,“零配置”和“有配置”的看法
- 关于C#与C/C++的个人看法
- 关于近日番茄花园洪磊被拘之事的一些个人看法
- 关于区域性网站CMS的一些个人看法
- 关于一致/非一致代码段与TSS 关系的个人看法
- 关于南通大学教务管理系统微信公众号的个人看法
- 关于阿里如何吸引大学生用户理财的一些个人看法
- 关于个人对Struts的一些看法
- 关于个人对缓冲的看法
- 关于国外站版权的一些个人看法
- 个人关于数据结构的看法
- 关于PHP-Zend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。
- 怎么看待移动互联网时代 关于移动互联网时代的一点个人看法总结 在强烈的产业变化时期,主流观点是不靠谱的 什么是浪潮呢? 小型化、无线化、智能化。
- 关于线程的一些个人看法(上)
- 关于内核学习的一些个人看法!