背景
因为公司的某项功能的要求需要获取到当前文件对象的安全描述符,在msdn上找了一遍之后发现了这个api,定义如下:https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-obgetobjectsecurity
NTSTATUS ObGetObjectSecurity(
PVOID Object,
PSECURITY_DESCRIPTOR *SecurityDescriptor,
PBOOLEAN MemoryAllocated
);
需要填入的就第一个参数也就是文件对象,后面两个都是传出参数,之后在释放的时候会用到,释放函数是这个ObReleaseObjectSecurity。
出现的问题
好了api都找好了,直接在minifliter中调用就行了,但是实际实际返回的结果是0xC000000D,这东西感觉确实也挺迷惑的,就一个参数我能传错?后来在同时的帮助下换了一个flt的api函数FltQuerySecurityObject,这个函数和NtQuery系列的函数一样需要先查大小之后在使用,好了把代码写成这样,结果一样的返回0xC000000D。
NTSTATUS NtsdState = FltQuerySecurityObject(FltObjects->Instance,FltObjects->FileObject,DACL_SECURITY_INFORMATION,NULL,1,&sdSize);
if(NtsdState == STATUS_BUFFER_TOO_SMALL)
{
pSecurityDescriptor = ExAllocatePoolWithTag(NonPagedPool ,sdSize,'yongcai');
if(pSecurityDescriptor)
{
NTSTATUS NtsdState = FltQuerySecurityObject(FltObjects->Instance,FltObjects->FileObject,DACL_SECURITY_INFORMATION,pSecurityDescriptor,sdSize,&sdSize);
查找问题
后来在网上找了找相关的问题,发现这个其实是由于对象还没有初始化这里的文件对象的安全描述符还没有添加进去,所以要在完成之后查询
解决问题
但是需求是在文件访问之前去做,这里有一个解决方法就是自己使用FltCreateFile去打开对应的文件(不要使用FILE_OPEN_IF这个会创建文件)(不能使用zw系列的,这里会在走一次系统到minifliter中,进入死循环),由于FltCreateFile得到的是一个句柄,所以得用ObReferenceObjectByHandle把句柄转成对象,最后记得释放引用和句柄,问题解决。