Низове в Windows: Как да извлечете текст от двоични файлове стъпка по стъпка

  • Комбинира strings.exe, PowerShell и WSL/GNU низове, за да обхване ASCII и Unicode.
  • Подобрен с FLOSS, PEStudio, ExifTool и certutil за динамични низове и метаданни.
  • Използвайте Select-String с -Encoding, -AllMatches, -Context и -Raw за фино филтриране.

Strings

Ако някога сте отваряли изпълним файл и сте си мислили, че е безсмислен, не сте сами; обаче, скрити сред това море от байтове са Четими от човек текстови низове, които разкриват пътища, DLL файлове, грешки и криминалистични уликиРазкриването им с правилните инструменти в Windows ви позволява да разберете какво представлява един двоичен файл, без да го разглобявате или отстранявате грешки.

В тази обиколка ще научите как да използвате strings.exe (Sysinternals), PowerShell (Select-String, Get-Content) както и командата GNU strings от WSL, плюс FLOSS и помощни програми като PEStudio, ExifTool или certutil. Ще видите как да локализирате текст в ASCII и Unicode/UTF-16LE, да извличате генерирани от изпълнението низове, да откривате вграден XML, да проверявате алтернативни потоци в NTFS и разчитат на метаданни, подписи и хешове за да контекстуализирате намереното. Разчитайте на ExifTool за общи метаданни и ръководството за премахване на метаданни от документи на Office когато е необходимо да почистите чувствителна информация.

Какво представляват низовете в PE двоичен файл и защо са важни?

Веригата не е нищо повече от поредица от байтове, интерпретирана с кодиране (ASCII, UTF-8, UTF-16/Unicode). В Windows, PE изпълнимите файлове често съдържат импортирани имена на функции, съобщения, пътища, XML манифести, OCSP/CRL URL адреси и DOS предупреждения като „Тази програма не може да се изпълнява в DOS режим“. Този текст е показателен. зависимости, функционалност и дори сигнали за борба с грешките (напр. IsDebuggerPresent, LoadLibrary, GetProcAddress).

Когато четете вериги, отделяйте зърното от плявата. Интересувате се домейни, пътища, имена на DLL файлове, ключове в системния регистър, опции на командния ред и всякакви следи, които предполагат поведение. Виждането на препратки към VeriSign/Microsoft не гарантира валиден подпис, но е индикация за проверка на автентичността със системни инструменти.

Основи на Windows: Sysinternals strings.exe и FLOSS

Най-прекият начин да започнете работа с Windows е strings.exe (от Sysinternals). Сканира файла и извлича всички четливи текстови низове, които открие, идеално за първоначална проверка. Основен случай на употреба би бил:

strings.exe binario.exe > cadenas.txt

В резултата ще видите всичко: XML манифести, импортирани DLL файлове, съобщения за грешки, вътрешни маршрути и интерфейсни текстовеАко подозирате, че двоичният файл е опакован или обфускиран, допълнете с ФЛОС (FLARE/FireEye), който се опитва да извлече низове, които са конструирани по време на изпълнение и не са статично открити от strings.exe.

Разчитайте на статични зрители, като например PEStudio (индикатори, внос, ресурси, фирми, ентропия) и в ExifTool за общи метаданни. Кръстосаното препращане към резултатите намалява фалшивите положителни резултати и ви помага приоритизирайте какво да разследвате по-нататък без да губят часове.

PowerShell за търсене и филтриране на текст: Select-String подробно

PowerShell се предлага с вграден „grep“: Изберете-низРаботи с редове и използва регулярни изрази, за да намира модели във файлове или в изхода на други команди. По подразбиране показва файла, номера на реда и съдържанието, където се появява съвпадението, и може Връщане на множество съвпадения на ред, правене на съвпаденията чувствителни към малки и големи букви или връщане само на булеви стойности.

Ключови понятия за работа с файлове: -Пътека за избор на маршрути (приема заместващи символи), -Модел за текста или регулярния израз, който да се търси, -Всички съвпадения да се намерят всички срещания на всеки ред, -Разпознаване на главни и малки букви ако имате нужда от чувствителност към главни и малки букви и -Кодиране за да се дефинира очакваното кодиране (UTF-8, Unicode/UTF-16, OEM и др.).

Също така е полезно -Контекст за показване на редове преди/след, -Включване/-Изключване да филтрирате по модели на имена, -Несъответствие за да обърнете търсенето, -Списък да върне само първото съвпадение за файл, -Тихо за булев изход и -Необработено така че изходът да е само съответстващият текст, вместо богати обекти.

Малко практични рецепти, които обхващат типични случаи с кодиране и множество файлове:

# Buscar "Microsoft" distinguiendo mayúsculas/minúsculas en todos los .txt del directorio actual
Select-String -Path .\*.txt -Pattern 'Microsoft' -CaseSensitive

# Encontrar TODAS las apariciones (no solo la primera por línea)
Select-String -Path .\log.txt -Pattern 'ERROR' -AllMatches

# Mostrar 2 líneas antes y 3 después de una coincidencia
Select-String -Path .\registro.txt -Pattern 'FATAL' -Context 2,3

# Solo decir si existe el patrón (True/False)
Select-String -Path .\*.conf -Pattern '^Port\s+22$' -Quiet

# Forzar lectura como UTF-16 (Unicode LE), típico en cadenas de binarios Windows
Select-String -Path .\dump_strings.txt -Pattern '<\?xml' -Encoding Unicode

Два важни нюанса при канализиране на обекти: с -InputObject цялата колекция се третира като един комбиниран низ, докато ако конвейерни вериги се обработват елемент по елемент. Освен това, обектите Информация за файла се четат като път (съдържание на файла), а не като неговия ToString(); и ако искате форматирано текстово представяне на сложни обекти, Out-String е ваш приятел преди Select-String.

Четене на двоични файлове като байтове в PowerShell и разбиране на NTFS ADS

Понякога не е достатъчно само да търсиш, нужно е зарежда двоичния файл като байтове, за да работи на ниско нивоPowerShell улеснява това с Get-Content и параметъра -AsByteStream (най-добре комбиниран с -Raw), за да получите ], върху който да филтрирате, измервате или нарязвате:

$bytes = Get-Content -Path .\binario.exe -AsByteStream -Raw
$bytes.Length

Ако заподозреният е огромен текстов файл, изберете между ред по ред или сурово четене с -Raw. А когато се интересувате само от края на файл, който расте (лог файлове), използвайте -Опашка или -ОбщБрой да се ограничи входно-изходният процес и да се ускори триажът.

В NTFS, не забравяйте Алтернативни потоци от данни (ADS): данни, които се предават в паралелни потоци, свързани с файл. Можете да ги изброите и прочетете по следния начин:

# Ver streams disponibles
Get-Item -Path .\sospechoso.txt -Stream *

# Leer el stream primario y uno alternativo
Get-Content -Path .\sospechoso.txt -Stream ':$DATA'
Get-Content -Path .\sospechoso.txt -Stream 'Oculto'

Когато пътят съдържа специални символи, използвайте -LiteralPath, за да се избегнат интерпретации на заместващи символиФилтрирането с -Include/-Exclude или -Filter ви спестява писането на ненужни цикли и ви позволява да обработва цели партиди последователно.

WSL/GNU низове: чудесен съюзник за бърз скрининг

Ако работите с WSL или Linux, командата струни Това е класика. За да получите бърз преглед на полезни низове, комбинирайте минимална дължина, отмествания и кодировки, а след това филтър с grep:

# Básico
strings ejemplo.bin

# Ignorar morralla: cadenas de 10 o más
strings -n 10 ejemplo.bin

# Mostrar desplazamiento (hex) de cada cadena
strings -t x ejemplo.bin

# Forzar codificación UTF-16LE (Windows)
strings -e S ejemplo.bin

# Encadenar con head para una vista rápida
strings archivo1.bin archivo2.bin | head -n 100

Тези трикове са златни за намиране URL адреси, разширения, модели на конфигурация, имена на ресурси и други индикатори. Ако двоичният файл е силно обфускиран, ще видите малко низове; тогава ще трябва да преминете към инструменти, които реконструират текст по време на изпълнение или динамичен анализ.

Намиране и извличане на XML, вграден в изпълними файлове

Много EXE-та носят XML фрагменти като манифести или конфигурации в ясен вид (ASCII/Unicode). За да ги намерите от PowerShell, потърсете етикетите за начало на документа или функции и, ако е приложимо, анализирайте блока като XML:

# 1) Volcar posibles cadenas (UTF-16) a un archivo intermedio si hace falta
strings.exe binario.exe > dump_strings.txt

# 2) Buscar el inicio de XML (en Unicode, usa -Encoding Unicode)
$xmlLines = Select-String -Path .\dump_strings.txt -Pattern '<\?xml' -Encoding Unicode

# 3) O leer directamente el EXE como texto Unicode y capturar el bloque
$text = Get-Content -Path .\binario.exe -Encoding Unicode -Raw
$match = ::Match($text, '<\?xml*?</+>')
if ($match.Success) {
  $xml = $match.Value
  $xml.DocumentElement | Format-List -Property *
}

Когато блокът е кодиран, ще видите Base64 или шестнадесетични обграждащи тагове, с certutil Много е удобно да се декодира:

# Base64 a binario
certutil -decode in.txt out.bin

# Hex a binario
certutil -decodehex in.hex out.bin

Ако е необходимо да валидирате подпис или да видите веригата от сертификати, Get-AuthenticodeSignature в PowerShell и certutil -asn/-dump Те ви дават контекста, който само низовете не показват. Така можете да разберете дали този XML е манифест, политика или конфигурация, която двоичният файл консумира.

Подписи и метаданни: какво ви казват сертификатите

Низовете често включват имена на CA (VeriSign, Thawte), OCSP/CRL пътища или идентификатори. Това ви подканва да проверите дали двоичният файл е цифрово подписано и ако проверката е валиднаМожете да разчитате на специализирани инструменти, като например sigcheck за анализ на сигнатура и репутация. В Windows проверете свойствата на файла или изпълнете:

# Firma del ejecutable
Get-AuthenticodeSignature .\binario.exe | Format-List

# Volcado ASN.1 de un DER/P7
certutil -asn firma.der

# Hash rápido para inventario/IOC
certutil -hashfile .\binario.exe SHA256

Наличието на препратки към сертификати не предполага доверие: има сертификати изтекъл или отменен което ще продължи да оставя следи от ресурси. Това несъответствие, съчетано с подозрителни вериги, е друг индикатор, който трябва да се вземе предвид при триажа.

Когато низовете не са достатъчни: опаковане, обфускация и ентропия

Ако резултатът е лош, изпълнимият файл може да е пакетиран (UPX, варианти) или с компресирани/криптирани данниВижте ентропията на PE секциите (високо = компресия/криптиране) и опитайте FLOSS за динамични низове. PEStudio улеснява преглеждането на ентропия, импорт, ресурси и флагове само с няколко кликвания.

UPX се открива и разопакова лесно, но има домашно приготвени обфускации, базирани на XOR и декриптиране по време на изпълнение. В тези случаи низовете ще се появят в памет по време на изпълнение, не в статичния двоичен файл, така че помислете за закачане, API проследяване или изпълнение в sandbox, ако е необходимо да се стигне по-далеч.

Спестяващ време работен процес за статично триажиране

Поръчка, която рядко се проваля: 1) Идентифицирайте типа и архитектурата (заглавки, "файл", xxd). 2) Изчислете хешове (MD5/SHA-1/SHA-256) за инвентаризация и IOC. 3) Извличане на низове с strings.exe и GNU strings, филтрирайте по дължина и потърсете модели. 4) Опитайте с ФЛОС ако подозирате генериране по време на изпълнение. 5) Вижте метаданни и подпис с PEStudio/ExifTool/PowerShell. 6) Използвайте certutil за декодиране на блобове и дъмп на ASN.1. 7) Проверете NTFS реклами в случай че има алтернативни данни. 8) Признаци на обфускация и ентропия да реши дали да премине към динамичен подход.

Ако анализирате злонамерен софтуер или искате повече PE контекст, инструменти като PEV/PEframe предоставят: традиционни хешове, ssdeep (размито хеширане), imphash (базиран на IAT), пакетиращи инструменти, мютекси и криптографски функции. В допълнение, помощни програми като те ловят риба (ентропия, времеви марки) или пепак за фирмите за опаковане, които ще ви помогнат да сортирай бързо.

Програмно четене и запис на двоични файлове: C++, Python и ASP.NET

В допълнение към извличането на низове, е полезно да знаете как да боравите с ниско ниво на двоичен код. В C++ класът fstream в режим iOS::binary позволява директно четене/запис и позициониране със seekg/seekp (в байтове). Бъдете внимателни, когато използвате самостоятелни обекти (напр. char масиви в структури) и с подравняване/endianness ако ще премествате файлове между платформи или компилатори.

// Guardar un registro binario
struct Persona { char nombre; int edad; char telefono; };
Persona p{ "Baltasar", 33, "988387028" };
std::ofstream f("datos.bin", std::ios::binary);
if (f.is_open()) f.write(reinterpret_cast<const char*>(&p), sizeof(Persona));

В Python, за да извлечете структурирани числа от двоичен файл, помислете за структура.разопаковане след отваряне с „rb“. Ако търсите да намерите текстови модели, можете чете всичко като байтове и търси разделени последователности (напр. между ясни маркери) или конвертирайте блок в низ с правилното кодиране и филтрирайте с регекс.

with open('archivo.bin', 'rb') as f:
    data = f.read()
# Buscar secuencia UTF-16LE de '<?xml'
needle = '<?xml'.encode('utf-16le')
pos = data.find(needle)
if pos != -1:
    # Extrae una ventana y decodifica con cuidado
    snippet = data.decode('utf-16le', errors='ignore')

Ако разработвате в мрежата с .NET и трябва да върнете двоичен файл на браузъра, не забравяйте да зададете Подходящ ContentType и записване на файла в HTTP потокаТипичен модел в ASP.NET (VB) е да се използва Response.ContentType = "application/pdf" и Response.WriteFile с физическия път, завършващ с Response.End на предотвратяване на объркване на друг изход.

Select-String: Параметри и трикове, които правят разликата

Въпреки че е лесен за използване, Select-String има по-малко известни опции, които си струва да се усвоят. - Култура (на PS 7+) ви позволява да коригирате сравненията, като вземете предвид културата, или да наложите „Ординално“ за бързи двоични сравнения, което се комбинира с -SimpleMatch избягва интерпретацията на регулярни изрази и ускорява буквалното търсене.

Кодирането по подразбиране в съвременния PowerShell е UTF-8 без BOM, но можете да укажете -Кодиране изрично: ASCII, OEM, Unicode (UTF-16 LE), UTF8/UTF8BOM/UTF8NoBOM, UTF32 и дори числови кодови страници (напр. -Encoding 1252). Това е ключово при анализа на Unicode низови дъмпове или файлове с липсваща спецификация на материалите (BOM).

Ако ви е необходимо само първото съвпадение за файл, за да създадете списък с резултати, изтеглете от -СписъкЗа да изключите това, което съвпада (напр. редове, които НЕ съдържат „Get“ или „Set“), използвайте -Несъответствие с множество шаблони. А когато искате само съответстващия текст в стил grep/findstr, -Необработено опростява изхода.

# Excluir líneas que contengan Get o Set
Select-String -Path .\Command.txt -Pattern 'Get','Set' -NotMatch

# Mostrar solo el fragmento que coincide (modo "crudo")
Select-String -Path .\*.log -Pattern '0x+' -Raw

Не забравяйте, че нормалният изход е обект Информация за мача с полезни свойства (Път, Номер на ред, Линия, Съвпадения). Можете да се свързвате верижно с Get-Member да ги инспектирате и след това да ги форматирате както сметнете за добре с Select-Object, Export-CSV или Списък с формати в зависимост от вашата цел.

Случаи от реалния живот: Unicode, отмествания и полезни шаблони

Много двоични версии на Windows запазват текст в UTF-16LEАко strings.exe ви даде основен дъмп, помислете за повторното му анализиране с фокус върху Unicode и търсене на полезни последователности: "http", "\\\\" за пътища, ".exe", "api" или XML тагове. След това филтрирайте с форсиране на Select-String -Unicode кодиране за да не пропускат мачове.

# Volcado con GNU strings (WSL) en UTF-16LE y luego filtrado
strings -e S binario.exe | grep -E '(http|\\\\|\.exe|<\?xml)'

Ако искате да знаете където живее всяка верига Във файла, за да се съпоставят PE секции, използвайте "strings -tx" и свържете отместванията с PE viewer. Това може да ви помогне да решите дали даден текст е в .rdata, .text или в ресурси, което променя интерпретация на констатацията.

Сигурност и пясъчник: минимални предпазни мерки

Когато работите с потенциално злонамерени проби, задайте минимална политика: използвайте виртуални машини, не стартирайте двоичния файл на главния хост, проверете целостта с хешове и сравнете в репутационни услуги, ако случаят го позволява, а в случаи на подозрителни документи проверете как Идентифицирайте злонамерен PDF файл в WindowsАко решите да го стартирате, направете го в изолирана среда с пясъчник и с наблюдение на мрежа/файлове/логове за заснемане на низове, които се появяват само по време на изпълнение.

Като част от вашата дисциплина, запазете резултатите (хешове, съответните низове, метаданни, подпис) и етикетирайте всеки артефакт с дата и контекст. Този ред ще ви позволи да се върнете назад и да възпроизведете анализа, както и да сравните семейства и варианти с размито хеширане (ssdeep) и imphash.

Работейки с този подход и помощните програми, които видяхме, ще можете да извлечете за минути целия ценен текст, който двоичният файл на Windows оставя открит: от вградени Unicode низове до скрит XML, включително пътища, крайни точки и подписи. Докато свиквате с комбинирането strings.exe, Select-String, FLOSS, certutil, PEStudio/ExifTool и WSL/GNU низове, ще получите скорост и точност, ще намалите шума и ще имате солидна основа за вземане на решение дали да ескалирате до динамичен анализ, да обърнете или да затворите разследването.

sigcheck
Свързана статия:
sigcheck: Проверете целостта на вашите файлове в Windows