2014-01-31 3 views
0

У меня есть командный файл, который принимает входной файл (в этом случае файл представляет собой плоский текстовый файл, состоящий из списка файлов из указанного набора системных каталогов Windows XP).Для Loop High CSRSS CPU

Затем, используя комбинацию цикла for для итерации по каждому файлу, указанному в текстовом файле), установка переменной с использованием нескольких команд вызова (в данном случае 9) и команды find для поиска текстового файла для файлов которые появляются на выходе других плоских файлов.

Проблема, с которой я столкнулся, заключается в том, что csrss.exe использует довольно немного обработки процессора. При чтении некоторых других статей кажется, что csrss имеет отношение к обработке командной строки.

То, что я хочу знать, если есть лучший способ сделать это, что будет:

  1. уменьшить общее время сценария.
  2. Уменьшить нагрузку на процессор.

Ниже приведен пример сценария:

:: ------------------------------------------------------ 
:: Running Multiple Commands 
:: ------------------------------------------------------ 

for /f "delims=?" %%A in (dir-selected_tmp.txt) do ( 
set filepath=%%A 
call :filepathparse 
call :md5hashchk 
call :versionchk 
call :densitychk 
call :processchk 
call :mutexchk 
call :networkchk 
call :injectedchk 
call :persistservicechk 
call :servicedllchk 
call :persistrunchk 
call :persistothchk 
call :unsigneddllchk 
call :filesysag 
) 
goto :comparison 

:: #################################################################### 

:filepathparse 
for %%B in ("%filepath%") do (
set filename=%%~nxB 
) 
goto :eof 

:: #################################################################### 

:md5hashchk 

for /f "delims= " %%b in ('md5deep.exe "%filepath%"') do set hashvalue=%%b 
goto :eof 

:: #################################################################### 

:versionchk 

for /f "delims= " %%e in ('sigcheck.exe /accepteula -q -n "%filepath%"') do set versionvalue=%%e 
goto :eof 

:: #################################################################### 

:densitychk 

for /f "delims= " %%d in ('densityscout.exe -p 0.1 "%filepath%"') do set densityvalue=%%d 
goto :eof 

:: #################################################################### 

:processchk 

find.exe /I "%filepath%" %temp_outpath%\wmic-processes.txt > nul 2>&1 && goto processexist 
set isprocess=NoActiveProc 
goto :eof 

:processexist 
set isprocess=ActiveProc 
goto :eof 

:: #################################################################### 

:mutexchk 

if "%startup_chk%"=="-b" (
goto :mutexbl 
)  

find.exe /I "%filepath%" %temp_outpath%\filesystem-handles_compared.txt > nul 2>&1 && goto mutexexist 
set ismutex=NoNewActiveMutex 
goto :eof 

:mutexexist 
set ismutex=NewActiveMutex 
goto :eof 

:mutexbl 

find.exe /I "%filepath%" %parsed_outpath%\filesystem-handles.txt > nul 2>&1 && goto mutexexist 
set ismutex=NoNewActiveMutex 
goto :eof 

:mutexexist 
set ismutex=NewActiveMutex 
goto :eof 

:: #################################################################### 

:networkchk 

find.exe /I "%filename%" %temp_outpath%\tcpvcon_tmp.txt > nul 2>&1 && goto networkexist 
set isnetwork=NoActiveNetwork 
goto :eof 

:networkexist 
set isnetwork=ActiveNetwork 
goto :eof 

:: #################################################################### 

:injectedchk 

find.exe /I "%filepath%" %temp_outpath%\injecteddll_tmp.txt > nul 2>&1 && goto injectedexist 
set isinjected=NoActiveInject 
goto :eof 

:injectedexist 
set isinjected=ActiveInject 
goto :eof 

:: #################################################################### 

:persistservicechk 

find.exe /I "%filepath%" %temp_outpath%\autoruns-services_tmp.txt > nul 2>&1 && goto serviceexist 
set isservice=NoInstalledService 
goto :eof 

:serviceexist 
set isservice=InstalledService 
goto :eof 

:: #################################################################### 

:servicedllchk 
find.exe /I "%filepath%" %temp_outpath%\registry_hklm_installed_service_dlls_final.txt > nul 2>&1 && goto servicedllexist 
set isservicedll=NoInstalledServiceDLL 
goto :eof 

:servicedllexist 
set isservicedll=InstalledServiceDLL 
goto :eof 

:: #################################################################### 

:persistrunchk 

find.exe /I "%filepath%" %temp_outpath%\autoruns-run_tmp.txt > nul 2>&1 && goto runpersistexist 
set isrunpersist=NoRunPersist 
goto :eof 

:runpersistexist 
set isrunpersist=RunPersist 
goto :eof 

:: #################################################################### 

:persistothchk 

find.exe /I "%filepath%" %temp_outpath%\autoruns-oth_tmp5.txt > nul 2>&1 && goto persistothexist 
set isothpersist=NoOtherPersist 
goto :eof 

:persistothexist 
set ispersist=OtherPersist 
goto :eof 

:: #################################################################### 

:unsigneddllchk 

find.exe /I "%filepath%" %temp_outpath%\listdlls_temp2.txt > nul 2>&1 && goto unsigneddllexist 
set isunsigneddll=NoUnSignedProcDLL 
goto :eof 

:unsigneddllexist 
set isunsigneddll=UnSignedProcDLL 
goto :eof 

:: #################################################################### 

:filesysag 

:: Compiling Into Syslog Format 

echo %datestamp%^|%currtime%^|%computername%^|%currip%^|%username%^|%lastlogintime%^|"%filepath%"^|%hashvalue%^|%versionvalue%^|%densityvalue%^|%isprocess%^|%ismutex%^|%isnetwork%^|%isinjected%^|%isservice%^|%isservicedll%^|%isrunpersist%^|%isothpersist%^|%isunsigneddll% >> %syslog_outpath%\%computername%-syslog.txt 

:: Compiling Into Parsed Format 

echo "%filepath%"^|%hashvalue%^|%versionvalue%^|%densityvalue%^|%isprocess%^|%ismutex%^|%isnetwork%^|%isinjected%^|%isservice%^|%isservicedll%^|%isrunpersist%^|%isothpersist%^|%isunsigneddll% >> %parsed_outpath%\%computername%-filesystem.txt 
goto :eof 
+0

Действительно нужно посмотреть на другие вызовы подпрограмм - особенно ': unsigneddllchk', которые, похоже, будут делать что-то с результатами предыдущих проверок. Также может оказаться полезным выборка файлов. – Magoo

+0

Я могу поделиться некоторыми из этих деталей. Существует еще один вызов после unsigneddllchk, который в основном принимает все заданные переменные от каждого вызова, а echo - к плоскому текстовому файлу. Итак, вы получаете что-то вроде: C: \ Windows \ system32 \ lsass.exe, ActiveProc, ActiveMutex, NoActiveNetwork, NoInjected ..... и т. Д. Это приведет к итерации каждого файла в списке файлов и использованию find.exe, чтобы узнать, существует ли этот файл, и позволяет говорить о выходе утилиты dump процесса, такой как pslist. Если это существует, то это будет «ActiveProc», если бы не «NoActiveProc». Другие утилиты получают сравнение других данных. – user3011014

+0

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

ответ

0

К сожалению, ваше нежелание предоставить более подробную информацию означает, что мы серьезно retricted на сумму помощи, которую мы можем предложить.

Я бы рекомендовал:

Во-первых, создать список путей файлов юй заинтересованы в

(for /f "delims=?" %%A in (dir-selected_tmp.txt) do echo %%A)>paths_of_interest.txt 

Затем построить временные файлы, содержащие подмножество данных журнала

findstr /I /g:paths_of_interest.txt %temp_outpath%\processes.txt >"%temp%\processes.x.txt" 

Затем повторите процедуру в соответствии с исходной схемой, вместо этого используйте paths_of_interest.txt и

Это должно уменьшить количество повторений, особенно если у вас длинные файлы.


:: ------------------------------------------------------ 
:: Running Multiple Commands 
:: ------------------------------------------------------ 

:: Pre-processing 

SET /a step=1000 
SET /a dirstart=0 
SET "dirskip=" 

:mainloop 
SET /a dirsleft=0 

SETLOCAL enabledelayedexpansion 
(
for /f "%dirskip%delims=?" %%A in (dir-selected_tmp.txt) do (
    SET /a dirsleft+=1 
    IF !dirsleft! leq %step% ECHO %%A 
) 
)>temp_dirs.txt 
endlocal&SET /a dirsleft=%dirsleft% 

FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\wmic-processes.txt" >temp_filepathparse.txt 
if "%startup_chk%"=="-b" (
FINDSTR /i /l /g:temp_dirs.txt "%parsed_outpath%\filesystem-handles.txt" >temp_mutexchk.txt 
) ELSE (
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\filesystem-handles_compared.txt" >temp_mutexchk.txt 
) 
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\tcpvcon_tmp.txt" >temp_networkchk.txt 
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\injecteddll_tmp.txt" >temp_injectedchk.txt 
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\autoruns-services_tmp.txt" >temp_persistservicechk.txt 
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\registry_hklm_installed_service_dlls_final.txt" >temp_servicedllchk.txt 
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\autoruns-run_tmp.txt" >temp_persistrunchk.txt 
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\autoruns-oth_tmp5.txt" >temp_persistothchk.txt 
FINDSTR /i /l /g:temp_dirs.txt "%temp_outpath%\listdlls_temp2.txt" >temp_unsigneddllchk.txt 

for /f "delims=" %%A in (temp_dirs.txt) do ( 
set "filepath=%%A" 
call :filepathparse 

.... 

call :filesysag 
) 

SET /a dirstart=%dirstart%+%step% 
SET /a dirsleft=%dirsleft%-%step% 
IF dirsleft gtr 0 SET dirskip=SKIP=%dirstart%&GOTO mainloop 

goto :comparison 

Затем просто замените имя файла в каждой из ваших подпрограмм :processchk к :unsigneddllchk с соответствующим temp_whatever.txt файла, созданного в предварительной обработке. Переключатель на mutex уже выполнен в предварительной обработке.

Это должно уменьшить поиск, выполненный командой find, и, следовательно, общее время выполнения, выбирая только те строки, содержащие целевые строки, в создаваемые файлы temp_ *.

[Редактировать в ответ на дополнительную информацию, представленную]

Примечание блок предварительной обработки перед первым findstr было изменено, и что теперь блок-пост-обработки между call :filesysag ) и goto :comparison

Объект здесь для уменьшения размера файла temp_dirs.txt. Я произвольно выбрал 1000 (размер step), но понятия не имею, как большой step должен быть.Чем больше, тем быстрее будет процесс, но если он слишком велик, temp_dirs.txt будет слишком большим для обработки findstr.

Обратите внимание на использование синтаксического анализа на линии endlocal&SET /a dirsleft=%dirsleft%, которая использует систему синтаксического анализа для перемещения измененного значения dirsleft из блока setlocal/endlocal.

+0

Хорошо, я добавил код, о котором идет речь. Обратите внимание, что «dir-selected.txt» является плоской текстовый файл с просто списком каталогов с использованием команд \t dir "C: \"/B/N/ON/S и dir "C: \"/B/N/ON/S/A: H. Другие файлы, на которые ссылаются в структура find.exe - это все снова текстовые файлы с выводами команд, запущенных ранее в скрипте. В этом случае цикл, который у меня есть (особенно при запуске команды find), увеличивает процессор до 100%. Мне нужно найти лучший способ структурировать цикл или запустить другую команду, отличную от find (например, grep), чтобы получить такой же результат. Проблема csrss.exe. – user3011014

+0

Итак, проблема, с которой я столкнулся, заключается в том, что FINDSTR не выполняется. Это порождает ошибку: «Строка поиска слишком длинная». Мне нужно переместить последний ")" in "(для/f" delims =? "%% A в (dir-selected_tmp.txt) сделать ECHO %% A)> temp_dirs.txt" где-то позже в скрипте, что позволяет ему анализировать одну строку за раз? Сейчас он пытается найти str во всем файле (который содержит список 8000+ строк ...). – user3011014

Смежные вопросы