Решил хакер блины печь. Первый блин у него вышел, как водится, комом. А второй - экзешником.
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
ifnot FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
MemoryStream.Seek(0, soFromBeginning);
// seek to end of File // ans Ende der Datei Seeken
aStream.Seek(0, soFromEnd);
// copy data from MemoryStream // Daten vom MemoryStream kopieren
aStream.CopyFrom(MemoryStream, 0);
// save Stream-Size // die Streamgro?e speichern
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
ifnot FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
// seek to position where Stream-Size is saved // zur Position seeken wo Streamgro?e gespeichert
aStream.Seek(-SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size thenbegin
aStream.Free;
Exit;
end;
// seek to position where data is saved // zur Position seeken an der die Daten abgelegt sind
aStream.Seek(-iSize, soFromEnd);
MemoryStream.SetSize(iSize - SizeOf(Integer));
MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
MemoryStream.Seek(0, soFromBeginning);
finally
aStream.Free;
end;
Result := True;
end;
procedure TForm1.SaveClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile('Test.exe', aStream);
aStream.Free;
end;
procedure TForm1.LoadClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
LoadFromFile('Test.exe', aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;
{
Note:
You can't proof whether additional data is attached or not.
To reach this, you would have to create a checksumm of the
MemoryStream and attach it.
}
Программный код на языке Delphi, который предназначен для прикрепления данных к исполняемому файлу (EXE) и загрузки этих данных из EXE-файла.
Функция AttachToFile принимает два параметра: AFileName, имя EXE-файла, и MemoryStream, содержащий данные для прикрепления. Функция проверяет, существует ли указанный файл. Если файл существует, она открывает его в режиме записи (fmOpenWrite or fmShareDenyWrite) с помощью объекта TFileStream, перемещается к концу файла, копирует данные из MemoryStream в файловый поток и записывает размер MemoryStream в конец файла.
Функция LoadFromFile принимает два параметра: AFileName, имя EXE-файла, и MemoryStream, который будет содержать загруженные данные. Функция проверяет, существует ли указанный файл. Если файл существует, она открывает его в режиме чтения (fmOpenRead or fmShareDenyWrite) с помощью объекта TFileStream, перемещается к позиции, где хранится размер прикрепленных данных (в конце файла), читает размер и затем перемещается к началу прикрепленных данных. Затем она устанавливает размер MemoryStream в прочитанный размер минус размер целого числа (которое было записано ранее) и копирует данные из файлового потока в MemoryStream.
Процедуры SaveClick и LoadClick демонстрируют, как использовать эти функции. Процедура SaveClick сохраняет текст в мемо-окне (Memo1) в память, прикрепляет эти данные к EXE-файлу с именем 'Test.exe' и затем освобождает память. Процедура LoadClick загружает прикрепленные данные из EXE-файла 'Test.exe' в новый памятный поток, загружает эти данные в мемо-окно (Memo1) и затем освобождает память.
Обратите внимание, что нельзя доказать, прикреплены ли данные к файлу без использования внешнего инструмента или другого программного обеспечения. Для проверки прикрепления данных необходимо создать контрольную сумму MemoryStream и прикрепить ее вместе с фактическими данными.
В улучшенной версии кода добавлены комментарии, чтобы объяснить цель каждой функции. Также были изменены имена переменных для лучшей читаемости, а объект TFileStream был заключен в блок try-finally, чтобы обеспечить его правильное освобождение, независимо от возникновения исключения. Были удалены ненужные скобки вокруг условия в операторе if. Код был реформатирован для соответствия конвенциям кодирования Delphi.
Добавить данные в EXE-файл и получить их с помощью функций AttachToFile и LoadFromFile.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.