线程内核对象初步认识

线程内核对象

#线程内核对象初步认识

线程内核对象就是一个包含了线程状态信息的数据结构。每一次对CreateThread函数的成功调用,系统就会在内部为新的线程分配一个内核对象。系统提供的管理线程的函数其实就是依靠访问线程内核对象来实现管理的。
线程内核对象的基本成员:在这里插入图片描述
3.1.1内核对象的使用计数
内核对象由内核所拥有,而不是进程所拥有。换句话说,如果进程调用了创建内核对象的函数,之后进程终止运行,那么内核对象并不一定被销毁。在大多数情况下如果另外一个进程在使用你创建的内核对象,那么另外一个进程终止前不会销毁该内核对象。内核知道多少个进程正在使用某个内核对象,因为内个对象使用了计数器。当计数器减为0时,内核对象被销毁。
代码:(文件占坑(DuplicateHandle).cpp)

3.2.2关闭内核对象
内核对象计数器减为0;

.h文件
#pragma once
#include <windows.h>
#include <tchar.h>
#include
using namespace std;
void Sub_1();
BOOL SeEnableSeDebugPrivilege(HANDLE ProcessHandle, BOOL IsEnable);
HANDLE SeOpenProcess(DWORD DesiredAccess, BOOL IsInheritHandle, HANDLE ProcessIdentify);
BOOL SeCloseHandle(HANDLE HandleValue);

.cpp文件
#include “文件占坑(DuplicateHandle).h”
BOOL __EnableDebugPrivilege = TRUE;
//定义参数
void _tmain(int argc, TCHAR* argv[], TCHAR *envp[])
{
Sub_1();
return;
}

void Sub_1()
{
HANDLE ProcessHandle = NULL;
//打开一个进程 测试代码:打开句柄为7240的进程
ProcessHandle = SeOpenProcess(PROCESS_DUP_HANDLE, FALSE, (HANDLE)7828);
//打开的进程句柄为空,打开失败
if (ProcessHandle==NULL)
{goto Exit;}
HANDLE FileHandle = INVALID_HANDLE_VALUE;
//打开xxx文件(文件对象)
FileHandle = CreateFile(_T(“ReadMe.txt”), GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (FileHandle == INVALID_HANDLE_VALUE)
{
goto Exit;
}
HANDLE v1 = NULL;
//当前进程下的文件句柄拷贝到目标进程下
//GetCurrentProcess 当前进程 FileHandle 文件句柄 ProcessHandle 目标进程句柄
//DUPLICATE_SAME_ACCESS 拷贝到目标进程的文件句柄具有相同的操作权限
BOOL IsOk = DuplicateHandle(GetCurrentProcess(), FileHandle, ProcessHandle, &v1, 0,
FALSE, DUPLICATE_SAME_ACCESS);
if (FileHandle!=INVALID_HANDLE_VALUE)
{
SeCloseHandle(FileHandle); //关闭文件句柄
FileHandle = INVALID_HANDLE_VALUE;
}
Exit:
if (ProcessHandle != NULL)
{
SeCloseHandle(ProcessHandle);
ProcessHandle = NULL;
}
}
BOOL SeEnableSeDebugPrivilege(HANDLE ProcessHandle, BOOL IsEnable)
{
DWORD LastError;
HANDLE TokenHandle = 0;
if (!OpenProcessToken(ProcessHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle))
{
LastError = GetLastError();
if (TokenHandle)
CloseHandle(TokenHandle);
return LastError;
}
TOKEN_PRIVILEGES TokenPrivileges;
memset(&TokenPrivileges, 0, sizeof(TOKEN_PRIVILEGES));
LUID v1;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &v1))
{
LastError = GetLastError();
CloseHandle(TokenHandle);
return LastError;
}
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Luid = v1;
if (IsEnable)
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
TokenPrivileges.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(TokenHandle, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
LastError = GetLastError();
CloseHandle(TokenHandle);
return LastError;
}
HANDLE SeOpenProcess(DWORD DesiredAccess, BOOL IsInheritHandle, HANDLE ProcessIdentify)
{
if (__EnableDebugPrivilege)
{
SeEnableSeDebugPrivilege(GetCurrentProcess(), TRUE); //提权
}
//打开进程
HANDLE ProcessHandle = OpenProcess(DesiredAccess, IsInheritHandle, (DWORD)ProcessIdentify);

DWORD LastError = GetLastError();
if (__EnableDebugPrivilege)
{
	SeEnableSeDebugPrivilege(GetCurrentProcess(), FALSE);
}
SetLastError(LastError);
return ProcessHandle;

}
BOOL SeCloseHandle(HANDLE HandleValue)
{
DWORD HandleFlags;
if (GetHandleInformation(HandleValue, &HandleFlags)
&& (HandleFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != HANDLE_FLAG_PROTECT_FROM_CLOSE)
return !!CloseHandle(HandleValue);
return FALSE;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值