Windows内核对象(3) -- DuplicateHandle实现文件占用

举报
winsoft666 发表于 2019/01/23 11:55:50 2019/01/23
【摘要】 DuplicateHandle的用法参考:http://blog.csdn.net/china_jeffery/article/details/79171307实现的原理大致就是,通过DuplicateHandle拷贝文件句柄给另外一个进程(一般是系统进程),因为系统进程不会被关闭,所以达到了占用某个文件,不让其他进程删除、读取、写入等。因为需要拷贝文件句柄给系统进程,所以涉及到打开系统进程...

DuplicateHandle的用法参考:http://blog.csdn.net/china_jeffery/article/details/79171307

实现的原理大致就是,通过DuplicateHandle拷贝文件句柄给另外一个进程(一般是系统进程),因为系统进程不会被关闭,所以达到了占用某个文件,不让其他进程删除、读取、写入等。

因为需要拷贝文件句柄给系统进程,所以涉及到打开系统进程,可能需要提权操作,提权的实现请参考:Windows环境下提升进程的权限,一般授权给进程SE_DEBUG_NAME权限即可。

实现一个用于锁住文件的函数LockFile,将文件句柄复制给系统csrss.exe进程,函数实现如下:

bool LockFile(LPCTSTR lpFilePath) {
	if (lpFilePath == NULL)
		return false;

	// 查找进程csrss.exe
	//
	DWORD dwCsrssProcessID = 0;
	PROCESSENTRY32 pe;
	pe.dwSize = sizeof(PROCESSENTRY32);
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	while (Process32Next(hSnapShot, &pe)) {
		if (lstrcmpi(pe.szExeFile, TEXT("csrss.exe")) == 0) {
			dwCsrssProcessID = pe.th32ProcessID;
			break;
		}
	}

	CloseHandle(hSnapShot);

	// 未找到
	if (dwCsrssProcessID == 0) {
		return false;
	}

	HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwCsrssProcessID);
	
	// 打开失败,可能需要提权
	// See: http://blog.csdn.net/china_jeffery/article/details/79173417
	if (hProcess == NULL) {
		return false;
	}

	HANDLE hFile = CreateFile(lpFilePath,
		GENERIC_READ | GENERIC_EXECUTE | GENERIC_WRITE, 
		0, 
		NULL, 
		OPEN_ALWAYS,
		FILE_ATTRIBUTE_NORMAL, 
		NULL);

	if (hFile == INVALID_HANDLE_VALUE) {
		CloseHandle(hProcess);
		return false;
	}

	HANDLE hTargetHandle = INVALID_HANDLE_VALUE;
	BOOL bRet = DuplicateHandle(GetCurrentProcess(),
		hFile,
		hProcess,
		&hTargetHandle,
		0,
		FALSE,
		DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE
	);
	CloseHandle(hProcess);

	return (bRet == TRUE);
}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。