判断进程是否从快捷方式启动

问题描述 投票:0回答:1

是否可以确定是否使用快捷方式启动了另一个进程/窗口?目的是读取该快捷方式以获取启动设置:启动文件夹、以管理员身份运行等。也许有一种方法可以找出程序的催化剂/调用者(具有管理员权限/快捷方式的用户/应用程序) ?

我知道使用 Windows 驱动程序工具包来确定它。尽管这在其他方面的开发相当棘手。

c winapi
1个回答
12
投票

是否可以确定是否使用快捷方式启动了另一个进程/窗口?

是的,但并不容易。

类似问题的回答中所述,进程可以通过调用 GetStartupInfo()

 并检查 
STARTF_TITLEISLINKNAME
 标志来查明自身是否是通过快捷方式启动的。  MSDN 上有记录:

获取启动信息函数

检索创建调用进程时指定的

STARTUPINFO

结构的内容。

STARTUPINFO 结构

dwFlags

一个位字段,用于确定进程创建窗口时是否使用某些
STARTUPINFO

 成员。该成员可以是以下一个或多个值。

...

STARTF_TITLEISLINKNAME
0x00000800

lpTitle 成员包含用户调用以启动此进程的快捷方式文件 (.lnk) 的路径。这通常由 shell 在调用指向已启动应用程序的 .lnk

 文件时设置。大多数应用程序不需要设置此值。

一旦获得

.lnk

 文件的路径,您就可以根据需要使用 
IShellLink
 接口解析它(有关更多详细信息,请参阅 
Shell Links)。

现在,话虽如此,您无法

直接检索STARTUPINFO

另一个进程
的结构。 但是,您可以间接检索它。 一种方法是将代码注入目标进程(使用

CreateRemoteThread()

SetWindowsHookEx()
),然后让该代码调用 
GetStartupInfo()
并使用
IPC 机制将所需信息传回您的进程
您选择的(WM_COPYDATA、命名管道、邮槽、套接字、COM、RPC 等)。
或者,有一种非官方的方法(取决于操作系统版本)可以获取许多相同的 

STARTUPINFO

字段值,包括

.lnk
文件名,而无需向目标进程注入任何代码。 使用
NtQueryInformationProcess()
 获取指向目标进程的 
PEB
1
结构的指针,该结构有一个 ProcessParameters 字段,该字段是指向
RTL_USER_PROCESS_PARAMETERS
1
结构的指针,该结构有一个WindowTitle 字段(包含来自
STARTUPINFO
的值的其他字段)。 您可以使用
OpenProcess()
 获取目标进程的 
HANDLE
(您可以使用
HWND
 获取 GetWindowThreadProcessId()
 的进程 ID),然后使用 
ReadProcessMemory()
 读取内容根据需要使用 
PEB
RTL_USER_PROCESS_PARAMETERS
结构。

1

PEB

RTL_USER_PROCESS_PARAMETERS
结构的大部分内容没有被MSDN记录,但在
http://undocumented.ntinternals.net
herehere)上有记录。

© www.soinside.com 2019 - 2024. All rights reserved.