查看文件被占用的进程 NtQueryObject NtQueryInformationFile NtQuerySystemInformation

【升级】易语言文件解锁(关闭句柄法)-易语言 前言 上一次发布过的程序:【首发】检测文件的占用,具有学习和商业价值(By超级用户),可以使用,仿电脑管家 正文 对于怎么枚举文件句柄 ,上一帖子对此有介绍,核心代码大概如下:如果 (ZwQueryObject (handle, #ObjectTypeInformation, unicode, 0, size) ≠ #STATUS_INVALID_HANDLE )' 只要不是无效的,为什么,详细看下面的注释 ' 参数 ' Handle ' 对象的一个句柄来获取信息。 ' ObjectInformationClass ' 指定一个OBJECT_INFORMATION_CLASS返回值的类型决定了信息在ObjectInformation缓冲区。 ' ObjectInformation ' 一个指向caller-allocated缓冲接收请求的信息。 ' ObjectInformationLength ' 指定的大小,以字节为单位,ObjectInformation缓冲区。 ' ReturnLength ' 一个指向变量的指针,接收的大小,以字节为单位,请求的关键信息。如果NtQueryObject STATUS_SUCCESS返回,返回的变量包含的数据量。如果NtQueryObject返回STATUS_BUFFER_OVERFLOW或STATUS_BUFFER_TOO_SMALL,您可以使用变量的值来确定所需的缓冲区大小。 ' 返回值 ' NtQueryObject返回STATUS_SUCCESS或适当的错误状态。可能的错误状态码包括以下: ' 返回代码 描述 ' STATUS_ACCESS_DENIED ' 有足够的权限来执行该cha询。 ' STATUS_INVALID_HANDLE ' 提供对象句柄无效。 ' STATUS_INFO_LENGTH_MISMATCH ' 信息长度不足以容纳数据。 unicode = 取空白字节集 (size) ZwQueryObject (handle, #ObjectTypeInformation, unicode, size, 0)' 读取信息的unicode文本 RtlUnicodeStringToAnsiString (ansi, unicode, 真)' 编码转换 ' RtlUnicodeStringToAnsiString例程将给定Unicode字符串转换成一个ANSI字符串。 str = 指针到文本 (ansi.Buffer) ' RtlFreeAnsiString常规版本存储由RtlUnicodeStringToAnsiString分配。 ' 参数 ' AnsiString ' 指针ANSI字符串缓冲区由RtlUnicodeStringToAnsiString以前分配的。 RtlFreeAnsiString (ansi) str = “无法获取”' 无效的怎么获取…… 返回 (str) 这一次呢更新了一个RemoteCloseHandle ,大概的原理是什么呢? 同时也采用了一些比较骚的方法,这种方法的限制较多,但是对于32位进程就很有效果。 NtClose在MSDN的大概介绍 1. NtClose is a generic routine that operates on any type of object. 2. Closing an open object handle causes that handle to become invalid. The system also decrements the handle count for the object and checks whether the object can be deleted. The system does not actually delete the object until all of the object's handles are closed and no referenced pointers remain. 3. A driver must close every handle that it opens as soon as the handle is no longer required. Kernel handles, which are those that are opened by a system thread or by specifying the OBJ_KERNEL_HANDLE flag, can be closed only when the previous processor mo 立即下载
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <atlbase.h>
#include <shlwapi.h>
#include <vector>
#include <map>
using namespace std;
#include <string>
typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR>> tstring;
#include <winternl.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
#define NT_SUCCESS(status) (status == (NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L)
#define SystemHandleInformation ((SYSTEM_INFORMATION_CLASS)16)
// NTQUERYOBJECT
typedef struct _OBJECT_NAME_INFORMATION {
UNICODE_STRING Name;
WCHAR NameBuffer[1];
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
typedef enum _OBJECT_INFORMATION_CLASS {
ObjectBasicInformation,
ObjectNameInformation,
ObjectTypeInformation,
ObjectAllInformation,
ObjectDataInformation
} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
typedef NTSTATUS (WINAPI *NTQUERYOBJECT)(
_In_opt_ HANDLE Handle,
_In_ OBJECT_INFORMATION_CLASS ObjectInformationClass,
_Out_opt_ PVOID ObjectInformation,
_In_ ULONG ObjectInformationLength,
_Out_opt_ PULONG ReturnLength);
// NTQUERYSYSTEMINFORMATION
typedef struct _SYSTEM_HANDLE {
DWORD dwProcessId;
BYTE bObjectType;
BYTE bFlags;
WORD wValue;
PVOID pAddress;
DWORD GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;
typedef struct _SYSTEM_HANDLE_INFORMATION {
DWORD dwCount;
SYSTEM_HANDLE Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL);
//
// NtQueryInformationFile
//
#define FileNameInformation ((FILE_INFORMATION_CLASS)9)
// typedef struct _FILE_NAME_INFORMATION {
// ULONG FileNameLength;
// WCHAR FileName[1];
// } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
typedef NTSTATUS (WINAPI *NTQUERYINFORMATIONFILE)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass);
// typedef struct _CLIENT_ID {
// HANDLE UniqueProcess;
// HANDLE UniqueThread;
// } CLIENT_ID, *PCLIENT_ID;
// ncScopedHandle
class ncScopedHandle
{
ncScopedHandle(const ncScopedHandle&);
ncScopedHandle& operator=(const ncScopedHandle&);
public:
ncScopedHandle(HANDLE handle)
: _handle(handle)
{
}
~ncScopedHandle()
{
if (_handle != NULL) {
CloseHandle(_handle);
}
}
operator HANDLE() const
{
return _handle;
}
PHANDLE operator& ()
{
return &_handle;
}
void operator=(HANDLE handle)
{
if (_handle != NULL) {
CloseHandle(_handle);
}
_handle = handle;
}
private:
HANDLE _handle;
};
// ncFileHandle
struct ncFileHandle
{
SYSTEM_HANDLE _handle;
tstring _filePath;
tstring _path;
ncFileHandle (SYSTEM_HANDLE handle, const tstring& filePath, const tstring& path)
: _handle (handle)
, _filePath (filePath)
, _path (path)
{
}
};
// GetDeviceDriveMap
void GetDeviceDriveMap(std::map<tstring, tstring>& mapDeviceDrive)
{
TCHAR szDrives[512];
if (!GetLogicalDriveStrings (_countof(szDrives) - 1, szDrives)) {
return;
}
TCHAR* lpDrives = szDrives;
TCHAR szDevice[MAX_PATH];
TCHAR szDrive[3] = _T(" :");
do {
*szDrive = *lpDrives;
if (QueryDosDevice (szDrive, szDevice, MAX_PATH)) {
mapDeviceDrive[szDevice] = szDrive;
}
while (*lpDrives++);
}
while (*lpDrives);
}
// DevicePathToDrivePath
BOOL DevicePathToDrivePath (tstring& path)
{
static std::map<tstring, tstring> mapDeviceDrive;
if (mapDeviceDrive.empty ()) {
GetDeviceDriveMap (mapDeviceDrive);
}
for (std::map<tstring, tstring>::const_iterator it = mapDeviceDrive.begin (); it != mapDeviceDrive.end (); ++it) {
size_t nLength = it->first.length ();
if (_tcsnicmp (it->first.c_str (), path.c_str (), nLength) == 0) {
path.replace (0, nLength, it->second);
return TRUE;
}
}
return FALSE;
}
// GetHandlePath
BOOL GetHandlePath (HANDLE handle, tstring& path)
{
static NTQUERYOBJECT fpNtQueryObject =
(NTQUERYOBJECT)GetProcAddress (GetModuleHandle (_T("ntdll")), "NtQueryObject");
if (fpNtQueryObject == NULL) {
return FALSE;
}
DWORD dwLength = 0;
OBJECT_NAME_INFORMATION info;
NTSTATUS status = fpNtQueryObject (handle, ObjectNameInformation, &info, sizeof (info), &dwLength);
if (status != STATUS_BUFFER_OVERFLOW) {
return FALSE;
}
POBJECT_NAME_INFORMATION pInfo = (POBJECT_NAME_INFORMATION)malloc(dwLength);
while (true) {
status = fpNtQueryObject (handle, ObjectNameInformation, pInfo, dwLength, &dwLength);
if (status != STATUS_BUFFER_OVERFLOW) {
break;
}
pInfo = (POBJECT_NAME_INFORMATION)realloc(pInfo, dwLength);
}
BOOL bRes = FALSE;
if (NT_SUCCESS(status)) {
path = pInfo->Name.Buffer;
bRes = DevicePathToDrivePath(path);
}
free(pInfo);
return bRes;
}
// GetSystemHandleInfo
PSYSTEM_HANDLE_INFORMATION GetSystemHandleInfo ()
{
static NTQUERYSYSTEMINFORMATION fpNtQuerySystemInformation =
(NTQUERYSYSTEMINFORMATION)GetProcAddress (GetModuleHandle (_T("ntdll")), "NtQuerySystemInformation");
if (fpNtQuerySystemInformation == NULL) {
return NULL;
}
DWORD dwLength = 0;
SYSTEM_HANDLE_INFORMATION shi;
NTSTATUS status = fpNtQuerySystemInformation (SystemHandleInformation, &shi, sizeof (shi), &dwLength);
if (status != STATUS_INFO_LENGTH_MISMATCH) {
return NULL;
}
PSYSTEM_HANDLE_INFORMATION pshi = (PSYSTEM_HANDLE_INFORMATION)malloc(dwLength);
while (true) {
status = fpNtQuerySystemInformation (SystemHandleInformation, pshi, dwLength, &dwLength);
if (status != STATUS_INFO_LENGTH_MISMATCH) {
break;
}
pshi = (PSYSTEM_HANDLE_INFORMATION)realloc(pshi, dwLength);
}
if (!NT_SUCCESS (status)) {
free (pshi);
pshi = NULL;
}
return pshi;
}
//
// 检测指定句柄是否可能导致NtQueryObject卡死:
// 1.注意必须使用NtQueryInformationFile而不是NtQueryObject进行检测,否则可能导致WinXP系统
// 下进程死锁而无法结束。
//
void CheckBlockThreadFunc (void* param)
{
static NTQUERYINFORMATIONFILE fpNtQueryInformationFile =
(NTQUERYINFORMATIONFILE)GetProcAddress (GetModuleHandle (_T("ntdll")), "NtQueryInformationFile");
if (fpNtQueryInformationFile != NULL) {
BYTE buf[1024];
IO_STATUS_BLOCK ioStatus;
fpNtQueryInformationFile ((HANDLE)param, &ioStatus, buf, 1024, FileNameInformation);
}
}
// IsBlockingHandle
BOOL IsBlockingHandle (HANDLE handle)
{
HANDLE hThread = (HANDLE)_beginthread(CheckBlockThreadFunc, 0, (void*)handle);
if (WaitForSingleObject (hThread, 100) != WAIT_TIMEOUT) {
return FALSE;
}
TerminateThread (hThread, 0);
return TRUE;
}
// FindFileHandle
BOOL FindFileHandle (LPCTSTR lpName, vector<ncFileHandle>& handles)
{
handles.clear ();
if (lpName == NULL) {
return FALSE;
}
// 打开“NUL”文件以便后续获取文件句柄类型值。
ncScopedHandle hTempFile = CreateFile (_T("NUL"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
if (hTempFile == NULL) {
return FALSE;
}
// 获取当前系统中所有的句柄信息。
PSYSTEM_HANDLE_INFORMATION pshi = GetSystemHandleInfo ();
if (pshi == NULL) {
return FALSE;
}
// 查询当前系统的文件句柄类型值。
BYTE nFileType = 0;
DWORD dwCrtPid = GetCurrentProcessId ();
for (DWORD i = 0; i < pshi->dwCount; ++i) {
if (pshi->Handles[i].dwProcessId == dwCrtPid && hTempFile == (HANDLE)pshi->Handles[i].wValue) {
nFileType = pshi->Handles[i].bObjectType;
break;
}
}
HANDLE hCrtProc = GetCurrentProcess ();
for (DWORD i = 0; i < pshi->dwCount; ++i) {
// 过滤掉非文件类型的句柄。
if (pshi->Handles[i].bObjectType != nFileType) {
continue;
}
// 将上述句柄复制到当前进程中。
ncScopedHandle handle = NULL;
ncScopedHandle hProc = OpenProcess (PROCESS_DUP_HANDLE, FALSE, pshi->Handles[i].dwProcessId);
if (hProc == NULL || !DuplicateHandle (hProc, (HANDLE)pshi->Handles[i].wValue, hCrtProc, &handle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
continue;
}
// 过滤掉会导致NtQueryObject卡死的句柄(如管道等)。
if (IsBlockingHandle (handle)) {
continue;
}
// 获取句柄对应的文件路径并进行匹配检查。
tstring filePath;
if (GetHandlePath (handle, filePath) && filePath.find (lpName) != tstring::npos) {
ncScopedHandle hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, pshi->Handles[i].dwProcessId);
TCHAR szProcName[MAX_PATH];
GetProcessImageFileName (hProcess, szProcName, MAX_PATH);
tstring path (szProcName);
DevicePathToDrivePath(path);
ncFileHandle fh (pshi->Handles[i], filePath, path);
handles.push_back (fh);
}
}
free(pshi);
return TRUE;
}
// BOOL CloseHandleEx (HANDLE handle, DWORD dwPid)
// {
// if (GetCurrentProcessId () == dwPid)
// return CloseHandle (handle);
//
// ncScopedHandle hProcess = OpenProcess (PROCESS_DUP_HANDLE, FALSE, dwPid);
// if (hProcess == NULL)
// return FALSE;
//
// return DuplicateHandle (hProcess, handle, GetCurrentProcess (), NULL, 0, FALSE, DUPLICATE_CLOSE_SOURCE);
// }
// main
int _tmain(int argc, _TCHAR* argv[])
{
tstring path (_T("E:\\TDDOWNLOAD\\"));
vector<ncFileHandle> vecHandles;
if (!FindFileHandle(path.c_str(), vecHandles)) {
return -1;
}
return 0;
}
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster原理详解 Web渗透技术的核心是发现Web漏洞,发现漏洞有手工和软件自动化扫描两种方式。对于用户验证漏洞、用户凭证管理问题、SQL注入等常见Web漏洞,都可以通过Web扫描器进行扫描。各个扫描器的功能和结果都不同,常见的包括HScan、HScan、X-Sccan、Acunetix Web Vulnerability Scanner、Jsky、Router Scan扫描工具等。本文主要讲解三个常见的Web漏洞扫描工具,分别是NMapp、ThreatScan和DirBuster。希望这篇基础性文章对你有所帮助. 阅读详情

相关推荐

ThinkBook 16p 2024 BIOS降压定频实战:从解锁CFG Lock到AC Loadline调优

高性能笔记本在满载时频繁撞上温度墙,通常源于固件层默认电压冗余过大,而系统级降压工具又受限于CFG Lock锁定。要根治问题,需要从BIOS固件层面理解电压管理机制——AC/DC Loadline参数控制着CPU在不同负载下的电压请求,通过修改这些负载线值可以安全降低电压,解锁CFG Lock后还能让XTU、ThrottleStop等软件调参工具恢复可用。这种BIOS级调优在工程实践中广泛用于改善散热、稳定频率、压降风扇噪音,尤其适用于联想ThinkBook 16p 2024与拯救者Y9000P等采用HX平

weixin_32496547的博客 386

NtQueryObject 获得内核对象的信息

一个内核对象有两个计数器:一个是句柄计数,句柄是给用户态用的;另一个是指针计数,也叫引用计数,因为核心态也常常用到内核对象,为了方便,在核心态的代码用指针直接访问对象,所以Object Manager维护了这个指针引用计数。只有在句柄计数和引用计数都为0时,对象才被释放。一般而言,指针引用计数值比句柄计数值大。 再进一步,实际上,在用户态其实是可以查询一个内核对象的句柄计数和引用计数

kinghzking的专栏 6673

IFIX往Mysql数据库同步数据方法

通过IFix数据库向Mysql数据库同步数据

仙人掌 1595

NtQueryObject 函数

若翻译出现错误,请指出,本人会即时改正。 这个函数未来可能会改变或者从windows中移除,但是不会通告你。(微软有多贱,我嘞个草了) 函数声明: NTSTATUS NtQueryObject( _In_opt_  HANDLE  Handle, _In_        OBJECT_INFORMATION_CLASS objectInformationClass, _Out_opt_

93Storm 4391

Oracle数据库安装图文教程 附百度云oracle Database 11g 安装包

一,Oracle数据库安装包下载 1.从Oracle官网下载所需的数据库安装包【下载需要注册登录Oracle账户】     http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.此处有下载好的Oracle Database 11g Release 2  百度云网盘  提取码:z...

向来如此,就一定是对的吗 6万+

基于YOLOv8的野生菌菇检测、识别与分类系统

YOLOv8是YOLO系列模型的最新版本,继承了YOLO系列高效、精确的特点。YOLOv8采用了新的网络架构,并优化了推理速度和检测精度。与传统的目标检测算法(如Faster R-CNN)不同,YOLO模型通过一次前向传播同时完成目标定位与分类,因而具有非常高的计算效率。

YOLO 1284

Ring3 调用 NtQueryObject 获得文件句柄对应的对象名时调用线程死锁的原因

之前遗留的一个问题http://blog.youkuaiyun.com/qq_18218335/article/details/76400680         之前实现Ring3 查找文件占用的时候发现对部分句柄进行NtQueryObject 操作的时候会造成调用者线程挂起,从Ring3 解决问题的方法就是生成一个单独的工作线程,代替我们执行NtQueryObject 函数,如果工作线程挂起,则调用Kill

商少 2402

2026年1至9月武汉市房地产价格深度分析报告

本报告基于2026年1月至9月武汉市实际成交案例,从成交价格、区域分布、户型结构、价格走势等维度进行深度分析。数据来源包括武汉市住房保障和房屋管理局备案数据、主要中介机构成交记录及典型楼盘网签案例,覆盖全市15个行政区及主要功能板块。

王国平的博客 327

通过对象名(ObjectName)匹配,确定所属的进程

大概流程: 首先通过ZwQuerySystemInformation(SystemHandleInformation,*,*)获取句柄信息,然后根据句柄调用ZwQueryObject(*,ObjectNameInformation,*)获取对象名信息,最后匹配确定目标。示例是确定“\\Windows\\ApiPort"所属的进程。 需要注意的是用有的句柄调用ZwQueryObject会返回ST...

pureman_mega的博客 1123

基于STM32L4XX、HAL库的IP101GRI以太网收发器(PHY)驱动程序设计

define IP101GRI_PHY_ADDRESS 0x01 // 根据硬件设计设置PHY地址。#define IP101GRI_PHYSTS 0x10 // PHY状态寄存器。#define IP101GRI_PHYINIR 0x12 // PHY中断寄存器。#define IP101GRI_PHYCR 0x14 // PHY控制寄存器。#define IP101GRI_PHYID2 0x03 // PHY标识符2。

zhusl6688的博客 718

DeepSeek-R1 论文阅读 DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning

和。这些模型的核心创新点是通过强化学习(Reinforcement Learning, RL)来提升大型语言模型(LLM)的推理能力,而没有依赖传统的监督微调(Supervised Fine-Tuning, SFT)作为预训练的步骤。是一种通过大规模强化学习直接训练的模型。它在推理能力上表现出色,能够自然地展现出许多强大且有趣的推理行为。但它也有一些问题,比如可读性差和语言混合。这意味着模型在生成文本时,有时会显得不太清晰,或者不一致地使用不同语言。为了解决这些问题并进一步提升推理能力,研究者提出了。

CSPhD-winston的博客 1838

查看文件是否被其他进程访问

项目中写了一个穿网闸文件传输程序,定期扫描指定文件夹,并将文件传输至网闸对侧。但在使用过程中发现部分文件经常被截断传输,实际上程序中对该问题已经做了处理,Linux系统使用lsof命令可以直接插到该文件当前有没有被写入,Windows系统使用尝试重命名文件方式来确定文件有没有被占用。但实际应用中在Windwos环境安装的openssh来提供sftp server,该程序在文件传输过程中,可以随意重...

1357

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

vc 查看文件被占用的进程

#pragma once #include #include #include #include #include #include #include using namespace std; #include typedef std::basic_string, std::allocator> tstring; #include #include #pragma c

3475

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

获取文件占用进程信息

转自http://blog.youkuaiyun.com/linuxsmallping/article/details/51732956 #pragma once #include #include #include #include #include #include #include using namespace std; #include typedef std::basic_stringTCHA

ponew的专栏 1215

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

使用NtQueryInformationFile函数获得不到完整路径

#include <windows.h> #include <iostream> using namespace std; typedef struct _OBJECT_NAME_INFORMATION { WORD Length; WORD MaximumLength; LPWSTR Buffer; } OBJECT_NAME...

weixin_33729196的博客 482

NtQueryObject遍历进程(死锁)与管道冲突的解决方案

在一次注入使用命名管道进行进程间通讯的案例中需要使用NtQueryObject遍历进程互斥锁情况,期间发现一个问题,NtQueryObject查询到管道时候会死锁,网上也有很多资料介绍NtQueryObject死锁的情况,不过解决方案不是很明确这里记录下解决办法在时候NtQueryObject打开进程关联句柄时,先使用CreateFileMapping假定创建文件句柄,如果创建成功,返回,当然假如...

waykd的博客 1477

C++检测句柄的权限

主要是依靠NtQueryObject函数,其中需要传入ObjectBasicInformation参数 PUBLIC_OBJECT_BASIC_INFORMATION结构包含可用于对象的全部信息的子集。 typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION { ULONG Attributes; ACCESS_MASK Grante...

qq_39529180的博客 208

通过遍历系统句柄信息(SystemHandleInformation),获取系统进程和当前进程的eprocess

实验环境:win10 1909 64 参考:https://blog.youkuaiyun.com/qinlicang/article/details/4489727 首先,获取系统的句柄信息;然后,在句柄信息表中进行搜索,通过数据结构进行匹配;最后,确定系统进程和当前进程的eprocess; 主要数据结构如下: typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO { USHORT UniqueProcessId; USHORT CreatorBack

pureman_mega的博客 1万+

WhoUseMe 驱动实现

前面写过一个应用层的查找谁占用了我们的文件的程序WhoUseMe http://blog.youkuaiyun.com/qq_18218335/article/details/62884657 从文中截图可以看出来,普通的应用层程序虽然可以达到枚举句柄的目的,但是对于一部分具有特殊权限的文件及端口句柄来说,调用NtQueryObject函数可能导致线程挂起,对此我们的解决办法是让一个单独的线程执行N

商少 840

【转】SYSTEM_HANDLE_INFORMATION

typedef struct _SYSTEM_HANDLE_INFORMATION{ ULONG ProcessId; UCHAR ObjectTypeNumber; UCHAR Flags; USHORT Handle; ...

614

R3下,遍历所有进程的伪句柄表,关闭指定句柄

之所以产生这个想法,是在删除文件的时候有时会提示文件被占用了,然后让我们先关闭之后在来删除,但是我怎么知道哪个进程打开了我的文件? 于是就去网上了找了一份代码然后改了改,接着来说说是怎么实现功能的。首先我们需要遍历所有的进程,所有要找到遍历进程的代码。 //遍历进程 WCHAR * szServerName = NULL; HANDLE WtsServerHandle = WTSOp...

被遗弃的庸才博客 1899

利用NtDuplicateObject进行Dump

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。(本文仅用于交流学习)这是国外老哥2020年提出的一种蛮有意思的思路。我们先来看看大致的思路是什么样子的,然后来看看一些需要学习的点。

二狗的博客 660

采用关闭句柄的方式去掉程序多开的限制

下面的文字,主要是为了分享给和我一样的菜鸟,而且这些东西都是很多大牛的文章中的一个非常小的部分。您们直接飘过吧。     一些程序限制多开的方法很多,比如采用窗口名,进程名,内核对象等等,论坛中也有很多关于这方面的介绍,但是好像没有一个具体的例子,估计是觉得太简单了吧。我研究的这程序的限制多开的方法采用的是“内核对象信号量”。     要破解其多开也有很多方法:     1、直接

yu_xiyan的专栏 8409
上一篇: 关于Qt线程中的事件循环
下一篇: C++解除文件占用
鱼公子哟西
博客等级 码龄14年 17粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值