|
被大牛们刺激的差不多了,静下心态来后打算写一个ark,告诉自己慢慢来,今天写写一个IRPHook检测部分- static CHAR *Major_Information[]=
- {
- "IRP_MJ_CREATE"//+0
- ,"IRP_MJ_CREATE_NAMED_PIPE"//+1
- ,"IRP_MJ_CLOSE"//+2
- ,"IRP_MJ_READ"//+3
- ,"IRP_MJ_WRITE"//+4
- ,"IRP_MJ_QUERY_INFORMATION"//+5
- ,"IRP_MJ_SET_INFORMATION"//+6
- ,"IRP_MJ_QUERY_EA"//+7
- ,"IRP_MJ_SET_EA"//+8
- ,"IRP_MJ_FLUSH_BUFFERS"//+9
- ,"IRP_MJ_QUERY_VOLUME_INFORMATION"//+a
- ,"IRP_MJ_SET_VOLUME_INFORMATION"//b
- ,"IRP_MJ_DIRECTORY_CONTROL"//+c
- ,"IRP_MJ_FILE_SYSTEM_CONTROL"//+d
- ,"IRP_MJ_DEVICE_CONTROL"//+e
- ,"IRP_MJ_INTERNAL_DEVICE_CONTROL"//+f
- ,"IRP_MJ_SHUTDOWN"//+10
- ,"IRP_MJ_LOCK_CONTROL"//+11
- ,"IRP_MJ_CLEANUP"//+12
- ,"IRP_MJ_CREATE_MAILSLOT"//+13
- ,"IRP_MJ_QUERY_SECURITY"
- ,"IRP_MJ_SET_SECURITY"
- ,"IRP_MJ_POWER"
- ,"IRP_MJ_SYSTEM_CONTROL"
- ,"IRP_MJ_DEVICE_CHANGE"
- ,"IRP_MJ_QUERY_QUOTA"
- ,"IRP_MJ_SET_QUOTA"
- ,"IRP_MJ_PNP"
- // ,""
- };
- VOID ListIrpHook(PUNICODE_STRING pDriverName)
- {
- PSYSTEM_MODULE_INFORMATION pSysbuffer;
- PVOID pMem=NULL;
- ULONG tmp=0,num,i,j;
- PDRIVER_OBJECT pDriObj;
- NTSTATUS ntstatus;
- CHAR pMyDriver[250]={0};
- ObReferenceObjectByName(pDriverName ,OBJ_CASE_INSENSITIVE,0,0,IoDriverObjectType ,KernelMode,NULL,&pDriObj);
-
- ZwQuerySystemInformation(SystemModuleInformation ,pMem ,0 ,&tmp);
- if(tmp >0)
- {
- pMem =(PSYSTEM_MODULE_INFORMATION)ExAllocatePool(PagedPool ,tmp);
- ntstatus = ZwQuerySystemInformation(SystemModuleInformation ,pMem ,tmp ,&tmp);
- if (NT_SUCCESS(ntstatus))
- {
- pSysbuffer = (PSYSTEM_MODULE_INFORMATION)((ULONG)pMem+4);
- num =*(PULONG)pMem;
- for (i=0;i<num;i++)
- {
- if ((ULONG)pDriObj->DriverStart>(ULONG)pSysbuffer[i].Base && (ULONG)pDriObj->DriverStart<(ULONG)pSysbuffer[i].Base + pSysbuffer[i].Size)
- {
- strcpy(pMyDriver ,(CHAR*)(pSysbuffer[i].ImageName+pSysbuffer[i].ModuleNameOffset));
- break;
- }
- }
- for (i=0;i<28;i++)
- {
- for (j=0;j<num;j++)
- {
- if(j == 0)
- continue;
- if ((ULONG)pDriObj->MajorFunction[i]>(ULONG)pSysbuffer[j].Base && (ULONG)pDriObj->MajorFunction[i]<(ULONG)pSysbuffer[j].Base +pSysbuffer[j].Size)
- {
- //命中模块
- if (_strnicmp((CHAR*)(pSysbuffer[j].ImageName + pSysbuffer[j].ModuleNameOffset),pMyDriver ,sizeof(pMyDriver)) != 0)
- DbgPrint("%s\n",Major_Information[i]);
- }
- }
- }
- ExFreePool(pMem);
- }
- }
- return ;
- }
- VOID ScanIrpHook()
- {
- WCHAR uRoot[] =L"\\Driver";
- WCHAR uTmp[256]={0};
- OBJECT_DIRECTORY_INFORMATION *pDir;
- ULONG nLength=0x400;
- UNICODE_STRING unRoot;
- OBJECT_ATTRIBUTES attrobj;
- HANDLE pDirectory;
- NTSTATUS ntstatus;
- //CHAR pBuffer[1000] = {0};
- ULONG tmp=0,temp=0;
- RtlInitUnicodeString(&unRoot , uRoot);
- InitializeObjectAttributes(&attrobj ,&unRoot ,OBJ_CASE_INSENSITIVE ,NULL ,NULL);
- ntstatus = ZwOpenDirectoryObject(&pDirectory ,DIRECTORY_QUERY ,&attrobj);
- if (NT_SUCCESS(ntstatus))
- {
-
- do
- {
- pDir =(POBJECT_DIRECTORY_INFORMATION)ExAllocatePool(PagedPool ,nLength);
- ntstatus = ZwQueryDirectoryObject(pDirectory , pDir,nLength ,FALSE ,TRUE ,&temp ,&tmp);
- if(ntstatus ==STATUS_MORE_ENTRIES || ntstatus ==STATUS_BUFFER_TOO_SMALL )
- {
- nLength*=2;
- ExFreePool((PVOID)pDir);
- }
- else if(ntstatus ==STATUS_SUCCESS)
- {
- break;
- }
- else
- {
- ExFreePool(pDir);
- DbgPrint("Error\n");
- return;
- }
- } while (1);
- //DbgPrint("~~~%S\n",pDir->Name.Buffer);
- while(pDir->Name.Length && pDir->TypeName.Length)
- {
- wcscpy(uTmp,L"\\Driver\");
- wcscat(uTmp,pDir->Name.Buffer);
- DbgPrint("%S\n",uTmp);
- RtlInitUnicodeString(&unRoot ,uTmp);
- ListIrpHook(&unRoot);
-
- pDir++;
- }
-
- }
- else
- DbgPrint("Don't Dump!\n");
- return ;
- }
复制代码 |
评分
-
查看全部评分
|