Оберните исполняемый файл, чтобы диагностировать его вызовы

У меня есть исполняемый файл Windows (whoami), который время от времени дает сбой. Он вызывается из другого процесса, чтобы получить подробную информацию о текущем пользователе и домене. Я хотел бы знать, какие параметры передаются при сбое.

Кто-нибудь знает о подходящем способе обернуть процесс и записать его аргументы командной строки в журнал, все еще вызывая процесс?

Скажем, команда используется так: 'whoami.exe / все'

Я бы хотел, чтобы вместо whoami.exe (с тем же именем файла) существовал сценарий, который запишет этот вызов в журнал, а затем передаст вызов фактическому процессу.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
343
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы не заметили, на каком языке программирования. Это невозможно сделать из файла .bat, если вы этого хотите, но вы можете сделать это на любом языке программирования. Пример на C:

int main(int argc, void **argv)
{
    // dump contents of argv to some log file
    int i=0;
    for (i=0; i<argc; i++)
        printf("Argument #%d: %s\n", argv[i]);
    // run the 'real' program, giving it the rest of argv vector (1+)
    // for example spawn, exec or system() functions can do it
    return 0; // or you can do a blocking call, and pick the return value from the program
}

Спасибо за это, меня не волнует, на каком языке он написан. В идеале я надеялся, что есть способ манипулировать пакетным сценарием, чтобы он притворился исполняемым файлом, как вы могли бы с помощью сценария оболочки, а затем выполнить перенаправление потока. Я предполагаю, что Windows ожидает, что .exes будет скомпилированным кодом.

joejag 22.09.2008 15:01

Найдите whoami.exe, BACK IT UP, замените его собственным исполняемым файлом и посмотрите, как вам нравится, с его параметрами (возможно, сохраните их в текстовом файле).

Я не думаю, что использование «скрипта» сработает, поскольку промежуточное звено должно иметь расширение .exe, чтобы ваша уловка работала.

Для этого я бы написал очень маленькую программу командной строки; что-то вроде следующего (написано на Delphi / Virtual Pascal, поэтому в результате будет исполняемый файл Win32, но подойдет любой скомпилированный язык):

program PassThrough;

uses
  Dos; // Imports the Exec routine

const
  PassTo = 'Original.exe'; // The program you really want to call

var 
  CommandLine: String;
  i: Integer;
  f: Text;

begin
  CommandLine := '';
  for i := 1 to ParamCount do
    CommandLine := CommandLine + ParamStr(i) + ' ';

  Assign(f,'Passthrough.log');
  Append(f);
  Writeln(f, CommandLine);      // Write a line in the log
  Close(f);


  Exec(PassTo, CommandLine);    // Run the intended program
end.

Разве вы не можете просто изменить вызывающую программу, чтобы она регистрировала параметры, которые она использовала для вызова процесса, и код выхода? Это было бы проще, чем копаться в whoami.exe

Увы, я не контролирую вызывающую программу

joejag 22.09.2008 15:08
Ответ принят как подходящий

Из командного файла:

echo Parameters: %* >> logfile.txt
whoami.exe %*

С оговоркой, что у вас могут возникнуть проблемы, если параметры содержат пробелы (и вы передали экранирование с помощью "), потому что синтаксический анализатор командной строки в основном экранирует их, и они должны быть повторно экранированы перед передачей другому исполняемому файлу.

На самом деле мне еще нужно заменить whoami.exe этой партией. Есть ли способ добиться этого?

joejag 22.09.2008 15:06

Нет, я не думаю, что ты сможешь это сделать. Такой сценарий будет делать то, что вы хотите, но не может иметь расширение .exe.

Allan Mertner 22.09.2008 15:47

Если вы можете воспроизвести сбой, используйте Process Explorer до того, как сбойный процесс будет завершен, чтобы увидеть его командную строку.

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

Другие вопросы по теме