您的位置:首页 > 其它

关于绕过过滤驱动的资料的个人看法和摘要

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了,这个么本人还真是没有做过,到网上搜搜资料吧,应该会有不少的,祝你好运!

代码摘要:
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);


..........
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐