Работа с файлами. Часть 1. Получаем HEX-код

Цикл статей по работе с файлами: 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).
Теги:
INTRO, будет, START, гордостью, затем, шифрует, какому, Алгоритмов, алгоритму, байты, прочитала, бинарно, интерфейсом, пользователя, лёгким, которая, читает, загружаемый, любой, попробую
Добавлено: 24 Февраля 2015 19:55:38 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...