Вопрос, заданный пользователем, касается создания программы на Delphi, которая бы могла читать и извлекать строки из файлов EXE, аналогично тому, как это делает утилита Strings.exe из набора инструментов Sysinternals. Пользователь хочет не только извлечь все строки из файла EXE, но и использовать это для обнаружения подозрительных файлов, содержащих определенные строки, например, "ekrn.exe" или "Firefox.exe".
Пользователь уже написал код на Delphi, который пытается выполнить задачу, но результат работы кода не соответствует ожидаемому. В результате работы программы вместо чтения строк получаются некорректные символы и коды. Пользователь также упоминает, что некоторые символы в ASCII не отображаются, и предлагается обратить внимание на "printable character".
Подход к решению проблемы
Для решения проблемы можно использовать следующий алгоритм:
Прочитать файл EXE целиком в память.
Пройти по содержимому файла, начиная с первого отображаемого символа (печатаемого), до тех пор, пока не встретится символ, который не является отображаемым (или который не нужно отображать).
Сохранить найденное слово в список.
Повторить шаги 2 и 3 до конца файла.
Пример кода на Object Pascal (Delphi)
program ExtractStringsFromEXE;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.Classes,
Windows;
type
TImageDosHeader = record
e_magic: Word;
// Другие поля структуры DOS-заголовка
end;
TImageNtHeaders = record
Signature: Cardinal;
// Другие поля заголовка NT
end;
const
IMAGE_DOS_SIGNATURE = $4D5A;
IMAGE_NT_SIGNATURE = $4550;
function FileToPtr(const FilePath: string; var Ptr: Pointer; var FileSize: DWORD): Boolean;
begin
// Реализация функции для загрузки файла в память
end;
function FindASCIIStrings(const FilePath, DumpPath: string; MinLength: DWORD): Boolean;
var
Ptr: Pointer;
FileSize: DWORD;
IDH: PImageDosHeader;
INH: PImageNtHeaders;
Offs: DWORD;
SzDump: string;
Len: DWORD;
begin
// Реализация функции для поиска ASCII-строк
end;
var
FileName: string;
begin
FileName := 'E:\AntiDebugg.exe'; // Замените на путь к нужному файлу EXE
FindASCIIStrings(FileName, 'E:\StringsDump.txt', 2); // Замените путь сохранения результата
Readln;
end.
В приведенном коде используется функция FileToPtr для загрузки файла EXE в память, после чего функция FindASCIIStrings ищет и выводит строки длиной более MinLength символов. Важно отметить, что код не является полным решением, а лишь примерным алгоритмом, который необходимо дополнить и адаптировать под конкретные требования.
Заключение
Создание программы для чтения строк из файлов EXE - задача не из простых, но с использованием подходящих алгоритмов и правильного подхода к обработке данных, можно добиться желаемого результата. Важно также учитывать, что некоторые символы в коде могут быть не отображаемыми, и их следует обрабатывать соответствующим образом.
Пользователь запрашивает помощь в разработке программы на Delphi для извлечения строк из файлов EXE, с целью обнаружения подозрительных файлов, и сталкивается с проблемами при интерпретации символов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS