Можно ли определить, как был запущен .exe? - PullRequest
3 голосов
/ 31 августа 2011

Я хочу быть в состоянии определить, был ли данный exe-файл шеллексным программно или он был введен и выполнен интерактивно, скажем, в CMD.EXE.

Есть ли что-то в способе запуска exe-файла, который указывает механизм, который использовался для его запуска?

Контекст: Windows XP, языки Visual Studio 6.

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

Возможно, есть более простой способ, но я могу думать только о том, чтобы проверить имя родительского процесса, включающее несколько шагов:

  1. Получить идентификатор родительского процесса .
  2. Получить дескриптор процесса , используя идентификатор.
  3. Используйте GetModuleFileNameEx с найденным дескриптором (и NULL в качестве модуля), чтобы получить имя исполняемого файла.
  4. Проверьте, является ли имя исполняемого файла cmd.exe или что-либо еще.

Имейте в виду, что родительский процесс уже может отсутствовать, когда (или в то время) вы делаете эту проверку.

Edit:

Если ваша программа является консольным приложением, вы также можете проверить консоль, в которой она запущена. Если она запускалась из cmd, она обычно будет использовать ту же консоль. Так, например, вы можете использовать GetConsoleTitle и посмотреть, является ли это «Командная строка». Это может не работать на локализованных или других версиях Windows, но это легко, если у вас ограниченные случаи. Вы также можете использовать GetConsoleWindow и GetWindowThreadProcessId вместо шагов 1 и 2.

3 голосов
/ 31 августа 2011

Вы можете различать, скажем, CMD и Explorer, проверяя родительский процесс, но вы не можете определить, произошло ли это из-за действий пользователя или нет. Также AFAIK все способы запуска процесса приводят к одному и тому же вызову NtCreateProcess / PspCreateProcess, поэтому вы не можете сказать, какой API был использован.

...