通过枚举驱动符号链接 判断程序***有几个实例在运行
枚举符号链接:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>// 定义函数返回值
//typedef ULONG NTSTATUS;// 宽字节字符串结构定义
typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;// 对象属性定义
typedef struct _OBJECT_ATTRIBUTES {ULONG Length;HANDLE RootDirectory;UNICODE_STRING *ObjectName;ULONG Attributes;PSECURITY_DESCRIPTOR SecurityDescriptor;PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
} OBJECT_ATTRIBUTES,*POBJECT_ATTRIBUTES;// 基本信息定义
typedef struct _DIRECTORY_BASIC_INFORMATION {UNICODE_STRING ObjectName;UNICODE_STRING ObjectTypeName;
} DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION;// 返回值或状态类型定义
#define OBJ_CASE_INSENSITIVE 0x00000040L
#define DIRECTORY_QUERY (0x0001)
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
#define STATUS_MORE_ENTRIES ((NTSTATUS)0x00000105L)
#define STATUS_NO_MORE_ENTRIES ((NTSTATUS)0x8000001AL)
#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)
#define SYMBOLIC_LINK_QUERY (0x0001)
#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)// 初始化对象属性宏定义
#define InitializeObjectAttributes( p, n, a, r, s ) { \(p)->Length = sizeof( OBJECT_ATTRIBUTES ); \(p)->RootDirectory = r; \(p)->Attributes = a; \(p)->ObjectName = n; \(p)->SecurityDescriptor = s; \(p)->SecurityQualityOfService = NULL; \
}// 字符串初始化
typedef VOID (CALLBACK* RTLINITUNICODESTRING)(PUNICODE_STRING,PCWSTR);
RTLINITUNICODESTRING RtlInitUnicodeString;// 字符串比较
typedef
BOOLEAN
(WINAPI *RTLEQUALUNICODESTRING)(const UNICODE_STRING *String1,const UNICODE_STRING *String2,BOOLEAN CaseInSensitive);
RTLEQUALUNICODESTRING RtlEqualUnicodeString;// 打开对象
typedef NTSTATUS (WINAPI *ZWOPENDIRECTORYOBJECT)(OUT PHANDLE DirectoryHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
ZWOPENDIRECTORYOBJECT ZwOpenDirectoryObject;// 查询对象
typedef
NTSTATUS
(WINAPI *ZWQUERYDIRECTORYOBJECT)(IN HANDLE DirectoryHandle,OUT PVOID Buffer,IN ULONG BufferLength,IN BOOLEAN ReturnSingleEntry,IN BOOLEAN RestartScan,IN OUT PULONG Context,OUT PULONG ReturnLength OPTIONAL);
ZWQUERYDIRECTORYOBJECT ZwQueryDirectoryObject;// 打开符号链接对象
typedef
NTSTATUS
(WINAPI *ZWOPENSYMBOLICKLINKOBJECT)(OUT PHANDLE SymbolicLinkHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
ZWOPENSYMBOLICKLINKOBJECT ZwOpenSymbolicLinkObject;// 查询符号链接对象
typedef
NTSTATUS
(WINAPI *ZWQUERYSYMBOLICKLINKOBJECT)(IN HANDLE SymbolicLinkHandle,IN OUT PUNICODE_STRING TargetName,OUT PULONG ReturnLength OPTIONAL);
ZWQUERYSYMBOLICKLINKOBJECT ZwQuerySymbolicLinkObject;// 关闭已经打开的对象
typedef
NTSTATUS
(WINAPI *ZWCLOSE)(IN HANDLE Handle);
ZWCLOSE ZwClose;//
int main()
{HMODULE hNtdll = NULL;hNtdll = LoadLibrary(_T("ntdll.dll" ));if ( NULL == hNtdll ){printf("[%s]--Load ntdll.dll failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}printf("[%s]--Load ntdll.dll sucess now get proc.\r\n", __FUNCTION__);RtlInitUnicodeString = (RTLINITUNICODESTRING)GetProcAddress(hNtdll, "RtlInitUnicodeString");RtlEqualUnicodeString = (RTLEQUALUNICODESTRING)GetProcAddress(hNtdll, "RtlEqualUnicodeString");ZwOpenDirectoryObject = (ZWOPENDIRECTORYOBJECT)GetProcAddress(hNtdll, "ZwOpenDirectoryObject");ZwQueryDirectoryObject = (ZWQUERYDIRECTORYOBJECT)GetProcAddress(hNtdll, "ZwQueryDirectoryObject");ZwOpenSymbolicLinkObject = (ZWOPENSYMBOLICKLINKOBJECT)GetProcAddress(hNtdll, "ZwOpenSymbolicLinkObject");ZwQuerySymbolicLinkObject = (ZWQUERYSYMBOLICKLINKOBJECT)GetProcAddress(hNtdll, "ZwQuerySymbolicLinkObject");ZwClose = (ZWCLOSE)GetProcAddress(hNtdll, "ZwClose");UNICODE_STRING strDirName;OBJECT_ATTRIBUTES oba;NTSTATUS ntStatus; HANDLE hDirectory;RtlInitUnicodeString(&strDirName, _T("\\BaseNamedObjects"));//global??,BaseNamedObjectsInitializeObjectAttributes(&oba, &strDirName, OBJ_CASE_INSENSITIVE, NULL, NULL);printf("[%s]--Open directory object now.\r\n", __FUNCTION__);ntStatus = ZwOpenDirectoryObject(&hDirectory, DIRECTORY_QUERY, &oba);if ( ntStatus != STATUS_SUCCESS ){printf("[%s]--Open directory object failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}printf("[%s]--Open directory object success.\r\n", __FUNCTION__);UNICODE_STRING symbolicLink;UNICODE_STRING targetName;BYTE buffer[2048] = {0};ULONG ulLength = 2048; ULONG ulContext = 0;ULONG ulRet = 0; RtlInitUnicodeString(&symbolicLink, L"SymbolicLink");targetName.Length = 0;targetName.Buffer = (PWSTR)calloc(2, 1024);if ( targetName.Buffer == NULL ){printf("[%s]--calloc failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}targetName.MaximumLength = 1024;do{ntStatus = ZwQueryDirectoryObject(hDirectory, buffer, ulLength, TRUE, FALSE, &ulContext, &ulRet);if ( (ntStatus != STATUS_SUCCESS) && (ntStatus != STATUS_NO_MORE_ENTRIES) ){printf("[%s]--ZwQueryDirectoryObject failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}else if ( STATUS_NO_MORE_ENTRIES == ntStatus ){printf("[%s]--No more object.\r\n", __FUNCTION__);goto EXIT;}PDIRECTORY_BASIC_INFORMATION directoryInfo = (PDIRECTORY_BASIC_INFORMATION)buffer;printf("ObjectName: [%S]---ObjectTypeName: [%S]\n", directoryInfo->ObjectName.Buffer, directoryInfo->ObjectTypeName.Buffer);if ( RtlEqualUnicodeString(&directoryInfo->ObjectTypeName, &symbolicLink, TRUE) ){OBJECT_ATTRIBUTES symbolicLinkAttributes;HANDLE hSymbolicLink;// 初始化符号链接对象属性InitializeObjectAttributes(&symbolicLinkAttributes,&directoryInfo->ObjectName, OBJ_CASE_INSENSITIVE, hDirectory, NULL);// 打开符号链接对象ntStatus = ZwOpenSymbolicLinkObject(&hSymbolicLink, SYMBOLIC_LINK_QUERY, &symbolicLinkAttributes);if ( ntStatus != STATUS_SUCCESS ){printf("[%s]--ZwOpenSymbolicLinkObject failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}// 查询符号链接对象ntStatus = ZwQuerySymbolicLinkObject(hSymbolicLink, &targetName, NULL); if ( ntStatus != STATUS_SUCCESS ){printf("[%s]--ZwQuerySymbolicLinkObject failed(%ld).\r\n", __FUNCTION__, GetLastError());ZwClose(hSymbolicLink);goto EXIT;}// TODO: 添加针对符号链接的处理代码// 清空targetNamememset((LPVOID)targetName.Buffer, 0, targetName.Length*sizeof(WCHAR));// 关闭符号链接句柄ZwClose(hSymbolicLink);}}while(TRUE);
EXIT:if ( hDirectory != NULL ){ZwClose(hDirectory);}getchar();return 0;
}
比如说,需要枚举程序A有几个实例在运行,可以根据其 GUID 实现查找:
PDIRECTORY_BASIC_INFORMATION directoryInfo = (PDIRECTORY_BASIC_INFORMATION)buffer;std::wstring objectName = directoryInfo->ObjectName.Buffer;if ( objectName.find( L"{FED3DBE6-1256-46fc-8DAE-C13360CB46C8}" ) != std::wstring::npos ){++g_nAppClientCount;//}
通过枚举驱动符号链接 判断程序***有几个实例在运行相关推荐
- 判断程序是否运行在虚拟机中的代码
首先我们要了解一下什么是虚拟机, 对虚拟机的通用解释是通过软件模拟的具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件, 你可以在一台物理计算机上模拟出一台或多台虚拟 ...
- c++ 或者 vc++中判断程序实例是否运行
在Main 函数中Create*函数,以便创建一个命名对象(创建的是什么对象无所谓).当Create * 函数返回时,调用GetLastError函数. 如果GetLastError函数返回ERROR ...
- iOS中判断程序是不是第一次运行(新手引导界面用)
2019独角兽企业重金招聘Python工程师标准>>> 在软件下载安装完成后,第一次启动往往需要显示一个新手操作引导,来告诉用户怎么操作这个app,这就需要在程序一开始运行就判断程序 ...
- 在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2)
在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2) 升级硬件固件 在安装了升级硬件固件所必要的驱动程序后,就可以升级硬件固件了,在下载的硬件驱动和相关程序 ...
- NanoPi NEO Air使用八:编写个简单的驱动和应用程序
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- 关于如何判断程序和类库是Debug 还是 Release 的问题
在发布程序时不小心把一部分Debug的dll文件和一部分Release的dll文件混合发布了,最后导致整个生产环境瘫痪(内存和cpu使用量很高,同时网站访问无响应).到现在我还搞不懂为什么会这样,也许 ...
- 在驱动和应用程序间共享内存
在驱动和应用程序间共享内存 在不同的场合,很多驱动编写人员需要在驱动和用户程序间共享内存.两种最容易的技术是: l 应用程序发送IOCTL给驱动程序,提供一个指向内存的指针,之后驱动程序和应用程序就可 ...
- Android之通过ActivityLifecycleCallbacks判断程序是否运行在后台
1.问题 判断程序是否运行在后台运行 2.解决办法 我们可以使用ActivityLifecycleCallbacks,对于ActivityLifecycleCallbacks,看我的这篇博客介绍() ...
- 判断程序是否已经运行
近段时间,需要写一个小功能,就是需要判断程序是否已经运行. 某个程序安装后,也许被多个用户运行.那怎样判断当前用户已经运行了此程序了呢? 下面是Insus.NET的做法,就是: <VB.NET ...
最新文章
- R语言与数据分析(1) 数据分析流程、数据挖掘、数据可视化
- linux 符号链接攻击防御简介
- Java并发程序设计(四)JDK并发包之同步控制
- NetBeans IDE 7.0 Beta 发布
- 最全的 eclipse web 项目目录结构
- Linux 下的网络配置
- 每天一道LeetCode-----计算一个直方图空隙的容量(如果装水能装多少)
- jooq 配置oracle_jOOQ配置
- Spring Boot框架敏感信息泄露的完整介绍与SRC实战(附专属字典与PoC)
- Linux统治超级计算领域的九个理由
- java 的构造函数修饰符public private protected
- 在propreties文件中引用另一个properties文件中的内容
- Spring Boot2.x 的Druid连接池配置[附带监控]
- html 显示编辑xml文件,如何将 XML 文件显示为 HTML 表格展示
- xtreme toolkit pro——CXTPReportControl控件教程
- 非IE内核浏览器支持Active X控件
- O'Stolz定理的应用
- (十二:2020.08.28)CVPR 2016 追踪之论文纲要(译)
- 德国AgBB VoC有害物质测试
- c语言swap是什么,swap(什么是swap)