【问题标题】:Determine if process started from shortcut确定进程是否从快捷方式开始
【发布时间】:2016-07-15 04:26:48
【问题描述】:

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

我知道 determine it 使用 Windows 驱动程序工具包。虽然这在其他方面开发起来相当棘手。

【问题讨论】:

  • 有很多方法可以使用提升的权限和自定义命令行来启动进程。用户可以使用控制台,服务由 SCM 执行等。你的链接方法是最好的,它不需要使用 DDK,你可以自己定义所有的 Native API 函数和结构,例子很多。
  • 你可以,或者,只是探测你的应用程序环境:当前文件夹将是起始文件夹,你将有一个管理员安全令牌(或没有)等等。
  • 没有理由检查链接。启动文件夹是程序启动时的当前工作目录。运行是管理员,可以确定您的进程是否拥有适当的令牌。我认为根本不需要查找 lnk 文件...

标签: c winapi


【解决方案1】:

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

是的,但不容易。

正如an answera similar question 中提到的,进程可以通过调用GetStartupInfo() 并检查STARTF_TITLEISLINKNAME 标志来确定自己是否由快捷方式启动。这记录在 MSDN 上:

GetStartupInfo function

检索创建调用进程时指定的STARTUPINFO 结构的内容。

STARTUPINFO structure

dwFlags
一个位域,用于确定进程创建窗口时是否使用某些STARTUPINFO 成员。此成员可以是以下一个或多个值。

...
STARTF_TITLEISLINKNAME
0x00000800
lpTitle 成员包含用户调用以启动此进程的快捷方式文件 (.lnk) 的路径。这通常由 shell 在调用指向已启动应用程序的 .lnk 文件时设置。大多数应用程序不需要设置此值。

获得.lnk 文件的路径后,您可以根据需要使用IShellLink 接口对其进行解析(有关详细信息,请参阅Shell Links)。

现在,话虽如此,您不能直接检索另一个进程STARTUPINFO结构。但是,您可以间接检索它,方法是将代码注入目标进程(使用CreateRemoteThread()SetWindowsHookEx()),然后让该代码调用GetStartupInfo() 并将所需信息传回给您的使用您选择的IPC mechanismWM_COPYDATA、命名管道、邮槽、套接字、COM、RPC 等)进行处理。

或者,有一种非官方的方式(取决于操作系统版本)来获取许多相同的STARTUPINFO 字段值,包括.lnk 文件名,而无需将任何代码注入目标进程。使用NtQueryInformationProcess() 获取指向目标进程的PEB1 结构的指针,该结构有一个ProcessParameters 字段,该字段是一个指向RTL_USER_PROCESS_PARAMETERS1 结构的指针,它有一个 WindowTitle 字段(在包含来自 STARTUPINFO 的值的其他字段中)。您可以使用OpenProcess() 获取HANDLE 到目标进程(您可以使用GetWindowThreadProcessId() 获取HWND 的进程ID),然后使用ReadProcessMemory() 读取PEB 的内容和RTL_USER_PROCESS_PARAMETERS 结构根据需要。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多