Логирование запуска с полным путем да с аргументами...

Обсуждение программ nnCron и nnCron LITE

Логирование запуска с полным путем да с аргументами...

Postby elos » Mon, 13 Oct 2008, 10:44

В FAR-е в Process list командная строка видна со всеми аргументами - такое вот надо.

Отлавливаю по WatchProc: запускаемые приложения и пишу в лог полный путь этих приложений. Как сделать чтобы у меня не "голый" путь без аргументов был типа:
2008/10/13 08:08:29 start 3272 C:\WINDOWS\system32\rundll32.exe

а с аргументами?.. Типа такого?
2008/10/13 08:08:29 start 3272 C:\WINDOWS\system32\rundll32.exe /d C:\WINDOWS\system32\shell32.dll,Control_RunDLL timedate.cpl


Порыскал на форуме, ничего не нашел - не могу сообразить какой запрос сформулировать для поиска. Может кто подскажет? "...как передать задаче аргументы из командной строки?" из помощи к этому вопросу не относится, здесь вроде WinAPI нужен, где я как на льду...
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Логирование запуска с полным путем да с аргументами...

Postby Pretorian » Mon, 13 Oct 2008, 12:03

Code: Select all
\ Запуск внешнего приложения
WINAPI: ShellExecuteA shell32.DLL
: shel.exec ( addr u -- )
   >R >R 5 0  S" " DROP R> R> DROP S" " DROP 0 ShellExecuteA DROP ;

S" notepad" shel.exec

Даешь строку с любыми ключами на вход и все ок.
Pretorian
 
Posts: 25
Joined: Wed, 16 Jan 2008, 06:31

Re: Логирование запуска с полным путем да с аргументами...

Postby Yury Zhukov » Tue, 14 Oct 2008, 07:20

Вот простейший вариант: посмотри ссылочку. Но работает только под WinXP Pro :(
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Re: Логирование запуска с полным путем да с аргументами...

Postby elos » Tue, 14 Oct 2008, 09:17

Запуск внешнего приложения кроном - однозначно не то (но пример в копилку)
Внешнее приложение также не подходит.
Мне надо средствами крона, отловив старт приложения, записать в лог (формируемый мной и по моим критериям) полную командную строку этой программы со всеми ее ключами/параметрами...

Вроде при старте программы в памяти винды "оседает" структура, где присутствует ссылка на строку параметров программы. Остается только достать эту строку. И не знаю еще - эта структура живет все время существования программы или только до какого-то момента? Остается только найти что-то типа GetCommandLine, только для стороннего приложения, а не для текущего.


Задача в том, чтобы написать что-то вроде следилки за приложениями (на лавры StaffCop не претендую) - понять, что народ делал перед постановкой системы на колени. Приходится "бороться" на win2000 с набором приложений, написанных на VisualFoxPro, которые ведут себя неадекватно. То память "течь" начинает (хотя до этого пару лет простояло нормально), то начинают сыпать в events ошибки регистрации COM+ с полным или частичным прекращением работоспособности программ комплекса, далее разные мелочи. Уловить зависимость пока не удается (в приложениях однозначно не выполнены преобразования типов данных судя по логам, корявый визуальный интерфейс наводит на мысли о непродуманном заранее алгоритме)- остается только отслеживать внешние проявления проблем и пытаться их исправить или предупредить о них. И это еще без учета человеческого фактора...
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Логирование запуска с полным путем да с аргументами...

Postby Yury Zhukov » Tue, 14 Oct 2008, 11:32

Тогда вот так попробуй....
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Re: Логирование запуска с полным путем да с аргументами...

Postby Yury Zhukov » Tue, 14 Oct 2008, 12:30

И еще один вариант нашел. Функция NtQueryInformationProcess с параметром ProcessBasicInformation возвращает в том числе и указатель на PEB structure, в которой есть соответственно "ProcessParameters - A pointer to an RTL_USER_PROCESS_PARAMETERS structure that contains process parameter information such as the command line."
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Re: Логирование запуска с полным путем да с аргументами...

Postby elos » Tue, 14 Oct 2008, 14:15

http://www.rsdn.ru/Forum/?mid=843019 - пятый коммент с описанием этого PEB
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Логирование запуска с полным путем да с аргументами...

Postby Yury Zhukov » Tue, 14 Oct 2008, 15:06

elos wrote:http://www.rsdn.ru/Forum/?mid=843019 - пятый коммент с описанием этого PEB

мне больше нравится оригинал
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Re: Логирование запуска с полным путем да с аргументами...

Postby L38Crow » Wed, 29 Jul 2009, 03:32

Уважаемые!
Обыскал весь форум.
Я не сильно силён в WINAPI, не могли бы Вы готовое решение или пример для NNCRON. У меня такая же проблема - необходимо логировать процесс с его параметрами командной строки, но никак не могу разобраться как прикрутить NtQueryInformationProcess.

Пока код выглядит следующим образом. Однако очень нужно чтобы логировались также параметры командной строки.
Code: Select all
#( LOG_ProcessCreateStop
WatchProc: "*"
WatchProcStop: "*"
Action:
   FILE-APPEND: "pro_Tracking_Log_%YYYY%%MM%%DD%.txt" "%YYYY%.%MM%.%DD% %hh%:%mm%:%ss%,%WATCH-PROC-ID%,%WATCH-PROC-ID PROC-FULLNAME%%crlf%"
)#

Заранее спасибо!
L38Crow
 
Posts: 3
Joined: Wed, 29 Jul 2009, 03:26

Re: Логирование запуска с полным путем да с аргументами...

Postby Wyz » Wed, 29 Jul 2009, 08:03

Помощь - указатель - WINAPI:
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Логирование запуска с полным путем да с аргументами...

Postby L38Crow » Wed, 29 Jul 2009, 09:59

Я хелп уже прочёл весь вдоль и поперёк. Разобрался как вызывать элементарные задачи WINAPI - в этом проблемы нет.

В данном конкретном случае - нужно не только вызвать нужную функцию, но и корректно её разобрать, что мне пока не по силам. Да и я так и не понял какую конкретно и с какими параметрами вызывать. Возможно кто-то такую проблему вже решил (получения параметров процесса и вывод его в log). Может кто-нибудь помочь с написанием конкретной задачи которую я описал выше?
L38Crow
 
Posts: 3
Joined: Wed, 29 Jul 2009, 03:26

Re: Логирование запуска с полным путем да с аргументами...

Postby Wyz » Thu, 30 Jul 2009, 08:11

Теперь работает :-)

2009.07.31: Добавил возврат сообщений об ошибках. Imho если первый вызов ReadProcessMemory сработает, то и остальные тоже.

Code: Select all
#( NQIP_Test
NoActive

\ GetProcessCmdLine на входе хочет PID процесса, а на выходе дает его au комстроку или сообщение об ошибке "Error: *"

WINAPI: NtQueryInformationProcess ntdll.dll
WINAPI: OpenProcess kernel.dll
WINAPI: ReadProcessMemory Kernel32.dll

0x400 CONSTANT PROCESS_QUERY_INFORMATION
 0x10 CONSTANT PROCESS_VM_READ
    0 CONSTANT ProcessBasicInformation

: GetProcessCmdLine { pid \ hProcess1 retLength bufAddr -- a u }
pid FALSE PROCESS_QUERY_INFORMATION PROCESS_VM_READ OR OpenProcess \ 0=error
DUP TO hProcess1 NOT IF S" Error: OpenProcess" EXIT THEN
\ TO hProcess1

4096 ALLOCATE THROW TO bufAddr   \ думаю 4к хватит ;-)

AT retLength 0x18 bufAddr ProcessBasicInformation hProcess1 NtQueryInformationProcess \ STATUS_SUCCESS=0 ?
IF hProcess1 CloseHandle DROP bufAddr FREE DROP S" Error: NtQueryInformationProcess" EXIT THEN
\ DROP \ S" NtQueryInformationProcess NTSTATUS=%0 esPICK%" EVAL-SUBST MsgBox

AT retLength    \ сюда вернет количество прочитанных байт
0x230           \ сколько байт читать \ PEB size ?
bufAddr         \ куда
bufAddr 4 + @   \ откуда (адрес PEB)
hProcess1 ReadProcessMemory \ 1 - OK
\ DROP \ GetLastError S" Читаю PEB: ReadProcessMemory=%1 esPICK%, GetLastError=%0 esPICK%" EVAL-SUBST MsgBox
NOT IF hProcess1 CloseHandle DROP bufAddr FREE DROP S" Error: ReadProcessMemory (1)" EXIT THEN


AT retLength
0x290           \ PROCESS_PARAMETERS size
bufAddr
bufAddr 0x10 + @ \ PROCESS_PARAMETERS
hProcess1
ReadProcessMemory
DROP \ GetLastError S" Читаю PROCESS_PARAMETERS: ReadProcessMemory=%1 esPICK%, GetLastError=%0 esPICK%" EVAL-SUBST MsgBox

AT retLength
bufAddr 0x40 + W@ ( длина строки в старшем слове ) 4096 2 - ( под нолик ) MIN \ длина юникодной строки в байтах
bufAddr
bufAddr 0x44 + @ \ адрес комстроки
hProcess1
ReadProcessMemory
DROP \ GetLastError S" Читаю комстроку: ReadProcessMemory=%1 esPICK%, GetLastError=%0 esPICK%" EVAL-SUBST MsgBox

0 bufAddr retLength + W! \ пишу 0 за конец строки

bufAddr retLength 2 / UNICODE>S \ конверчу в ANSI/1251
bufAddr FREE DROP
hProcess1 CloseHandle DROP
;

Action:

\ S" nnguard.exe" PROC-EXIST? ?DUP NOT IF EXIT THEN
S" nnguard.exe" PROC-EXIST? \ PID или 0
GetProcessCmdLine
MsgBox

)#
Last edited by Wyz on Fri, 31 Jul 2009, 10:48, edited 2 times in total.
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Логирование запуска с полным путем да с аргументами...

Postby VoidVolker » Thu, 30 Jul 2009, 09:42

Ну и для большего удобства можно вот так еще сделать:
Code: Select all
: GET-PROC-CMD   \ ( a-procname u-procname -- a-cmd u-cmd )
    PROC-EXIST? ?DUP
        IF   
            GetProcessCmdLine
        ELSE
            S" "
        THEN
;
Last edited by VoidVolker on Fri, 31 Jul 2009, 11:32, edited 1 time in total.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Логирование запуска с полным путем да с аргументами...

Postby L38Crow » Fri, 31 Jul 2009, 10:35

Wyz - Спасибо большое действительно работает отлично! Переделал под себя, теперь веду журнал процессов, очень интересные вещи обнаруживаются. :wink:
L38Crow
 
Posts: 3
Joined: Wed, 29 Jul 2009, 03:26


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: ask and 2 guests

cron