Как использовать выходные данные из SigCheck для создания условной оценки с использованием пакета? - PullRequest
0 голосов
/ 28 марта 2019

Я использую Sigcheck для проверки MachineType исполняемого файла (MSACCESS.EXE)

Если Сигчек говорит, что MachineType исполняемого файла 32-битный GOTO ...

Если Сигчек говорит, что MachineType исполняемого файла 64-битный GOTO ...

Как это можно написать? Выходные данные Sigcheck.exe в терминале:

 c:\program files (x86)\microsoft office\office16\MSACCESS.EXE:
    Verified:       Signed
    Signing date:   9:51 AM 1/23/2019
    Publisher:      Microsoft Corporation
    Company:        Microsoft Corporation
    Description:    Microsoft Access
    Product:        Microsoft Office 2016
    Prod version:   16.0.4813.1000
    File version:   16.0.4813.1000
    MachineType:    32-bit

UPDATE:

Это вывод, который я получаю

Подробнее:

Использование Sigcheck.exe

Сначала я запускаю следующий пакетный скрипт:

@echo off
sigcheck.exe "C:\Program Files (x86)\Microsoft Office\Office16\MSACCESS.EXE"

Вслед за тем, что вы сказали:

Set TestPath=%1
for /F "delims=" %%l in ('sigcheck %TestPath%^|findstr MachineType') do set ArchLine=%%l

if not "%ArchLine%"=="%ArchLine:64=%" echo The file is 64bit
if not "%ArchLine%"=="%ArchLine:32=%" echo The file is 32bit

Не может быть двух ответов 32 / 64bit, так как я указываю только на 1 файл.

Так что в этом случае следует только сказать «Файл 32-битный»

ОБНОВЛЕНИЕ 2:

@echo off

sigcheck.exe "c:\program files (x86)\microsoft office\root\office16\MSACCESS.EXE"

Set TestPath=%1

:: See if sigcheck is in the path
where sigcheck.exe 2>NUL 1>NUL
if not "%ERRORLEVEL%"=="0" echo sigcheck.exe is not in your path && PAUSE

:: Make sure the file exists
if not exist "%TestPath%" echo %TestPath% does not exist && PAUSE

for /F "delims=" %%l in ('sigcheck %TestPath%^|findstr MachineType') do set ArchLine=%%l

if not "%ArchLine%"=="%ArchLine:n/a=%" echo Not an executable file && PAUSE
if not "%ArchLine%"=="%ArchLine:64=%" echo 64bit
if not "%ArchLine%"=="%ArchLine:32=%" echo 32bit

Ниже приводится полный ответ, который я получаю:

Sigcheck v2.72 - File version and signature viewer Copyright (C)
2004-2019 Mark Russinovich Sysinternals - www.sysinternals.com


c:\program files (x86)\microsoft office\root\office16\MSACCESS.EXE:

    Verified:       Signed
    Signing date:   6:18 AM 3/6/2019
    Publisher:      Microsoft Corporation
    Company:        Microsoft Corporation
    Description:    Microsoft Access
    Product:        Microsoft Office
    Prod version:   16.0.11328.20158
    File version:   16.0.11328.20158
    MachineType:    32-bit  does not exist Press any key to continue . . .

1 Ответ

0 голосов
/ 28 марта 2019

Это должно работать. Я убрал материал, который вы должны выяснить.

@echo off

:: Assign the first parameter passed to this batch file to the 
:: following variable.  This batch NEEDs something to look up.
Set PEBinaryPath=%~1

:: Make sure the caller passed at least one command line parameter.
if "%PEBinaryPath%"=="" (
    echo %~nx0 requires one parameter.  
    echo This parameter is the path to a PE binary to check for compiled architecture.
    echo Ie. %~nx0 "%windir%\Sytem32\notepad.exe"
    goto :EOF
)

:: See if sigcheck is in the path
where sigcheck.exe 2>NUL 1>NUL
if not "%ERRORLEVEL%"=="0" echo sigcheck.exe is not in your path&& goto :EOF

:: Make sure the file exists
if not exist "%PEBinaryPath%" echo %PEBinaryPath% does not exist&& goto :EOF

:: Take the output from sigcheck, parse it and put it into a variable called MachineTypeLine
for /F "delims=" %%l in ('sigcheck "%PEBinaryPath%"^|findstr MachineType') do set MachineTypeLine=%%l

:: See if the line contains "n/a", 64, or 32
if not "%MachineTypeLine%"=="%MachineTypeLine:n/a=%" echo Not a PE format binary file&& goto :EOF
if not "%MachineTypeLine%"=="%MachineTypeLine:64=%"  echo 64bit
if not "%MachineTypeLine%"=="%MachineTypeLine:32=%"  echo 32bit

Результаты:

  C:\>test.bat
  test.bat requires one parameter.
  This parameter is the path to a PE binary to check for compiled architecture.
  Ie. test.bat "C:\WINDOWS\Sytem32\notepad.exe"

  C:\>test.bat c:\windows\system.ini
  Not an executable file

  C:\>test.bat c:\bobs\yeruncle.exe
  c:\bobs\yeruncle.exe does not exist

  C:\>test.bat c:\windows\System32\notepad.exe
  64bit

  C:\>test.bat c:\windows\SysWOW64\notepad.exe
  32bit

Как это работает ??

  • For / F запускает команду и помещает найденные вещи в переменную.

  • Выполнение команды / F: sigcheck , но я перенаправляю результаты в findstr для выполнения большей части анализа для меня. Мы НЕ ДОЛЖНЫ делать это таким образом, но это, конечно, весь лот проще, потому что он возвращает мне только строки, содержащие слово " MachineType "

  • Результирующая переменная ( ArchLine ) выглядит (включая пробелы)

    MachineType:    64-bit
  • Затем я использую подстановку строк, чтобы узнать, находится ли искомая строка. Это что-то вроде взлома, но работает. Я заменяю «64» на НИЧЕГО и сравниваю его с исходной строкой. Если строка такая же, в ней не было 64!

Удачи!

...