Цикл статей по работе с файлами: hex-кодом файла, шифровке и дешифровке файлов. Статья 1. Получение HEX-кода .exe файла:
Будет очень много букв, но весь лишний трёп будет ограждён в специальные кавычки. Если ты тут по делу - то просто смотри коды с пояснениями к ним :)
____________________Работа_с_файлами__________________
Собственно в двух словах о том, что реализовывать собираюсь : программка с лёгким для пользователя интерфейсом, которая читает любой загружаемый в неё файл бинарно (байты, мать их), а затем с гордостью шифрует всё что прочитала по какому-либо алгоритму. Алгоритмов попробую сделать несколько (какие - это уже в процессе работы). Ну и соответственно во втором окне будет обратный алгоритм, для расшифровки. + вспомню работу с файлами в delphi, что уже забывается. Ладно, в путь.
Итак, примерный план работ:
1) Вспоминаем работу с файлами в делфи (бинарное открытие и чтение файла)
2) Учимся открывать файл и читать его HEX-код
3) Рассматриваем алгоритмы (тут же выбираем 2-3 нужных)
4) Реализовываем шифровку - расшифровку.
1) Что знаем про файлы в Delphi? Как раз, у файлов есть свои файловые типы. Для бинарной работы соответственно должны быть свои. Это тип FILE, тип CHAR , byte. Пожалуй на этих пока остановлюсь. CHAR - это символьный тип, и не обязательно размер его 1 байт. Может и больше. Тип FILE - тип бинарных файлов, если совсем просто (видит файл как набор байтов). Ну и тип byte - размерность от 0 до 255. Теперь основные операции с файлами :
Assign (переменная, файл) - привязывание переменной к файлу.
Reset - открытие файла для чтения, записи, чтения и записи. В зависимости от параметров.
ReWrite - открытие файла для записи (only).
____________________/Работа_с_файлами__________________
____________________ПОЛУЧАЕМ_HEX-код_файла____________
Форма для работы:
2) Для начала нужно научиться получать HEX-код файла (подразумевается .exe файл).
HEX-код это 16-тиричный код файла (1-9, 10-А, 11-B и т.д до 16-F). Код выводить будем в RichEdit. Почему не во всеми любимый memo? Потому что MEMO прогружается при компиляции как несколько десятков (сотен) тысяч строк. Так что при загрузке hex-кода придётся очень долго ждать из-за грузоёмкости самого компонента. Недолго по-экспериментируя нашли самый оптимальный вариант - RichEdit. Дело в том что прогружается данный компонент динамически, и строки в него заносятся уже в процессе работы.
Сейчас рассмотрим рабочий код, спасибо Mawrat'у c CyberForum, очень помог :)
var
F : File;
Arr : array of Byte;
S, STmp : String;
i, j, Size, H, Len : Integer;
Od : TOpenDialog;
begin
Od := OpenDialog1;
if Od.InitialDir = '' then Od.InitialDir := ExtractFilePath( Application.ExeName ); // Если начальный каталог не задан, то он равен дирректории файла проекта
if not Od.Execute then Exit; // если диалог открытия не вызван, то закрытие
if not FileExists(Od.FileName) then begin // если файл не найден, то выводится сообщение:
MessageBox(
0
,'Файл с заданным именем не найден. Действие отменено.'
,'Файл не найден'
,MB_OK + MB_ICONWARNING + MB_APPLMODAL //Кнопка OK, тип сообщения - WARNING
);
Exit; // Выход из приложения
end;
AssignFile(F, Od.FileName); //Привязываем переменную "F" к файлу открытому через диалог открытия
Reset(F, 1); //Открываем файл в режиме чтение/запись с минимальным блоком доступа в 1 байт.
Size:= FileSize(F); //В переменную SIZE ложится размер файла
SetLength(Arr, Size); // Изменяем размер массива ARR на число Size
BlockRead(F, Arr[0], Size); //Считываем всё содержимое файла в массив Arr.
CloseFile(F); //Закрываем файл
//Формируем текст для RichEdit1.
//Будем формировать текст таким образом, чтобы в каждой строке располагались
//сведения о 16-ти байтах:
Len := Size * 3 + (Size div 16);
if Size mod 16 > 0 then Dec(Len);
SetLength(S, Len);
H := High(Arr);
j := 1;
for i := 0 to H do begin
STmp := IntToHex(Arr[i], 2);
S[j] := STmp[1];
S[j + 1] := STmp[2];
Inc(j, 2);
if i = H then Continue;
if i mod 16 = 15 then begin
S[j] := #13;
S[j + 1] := #10;
Inc(j, 2);
end else begin
S[j] := #9;
Inc(j);
end;
end;
RichEdit1.Text := S;
end;
В работе:
____________________/ПОЛУЧАЕМ_HEX-код_файла____________
На этом первую статью заканчиваю. Во второй попробуем зашифровать hex файла и расшифровать, так же разберём алгоритмы (в частности XOR, RC4).