Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите разобраться с кодом

5.9K
13 февраля 2007 года
Eksell
49 / / 16.11.2005
Доброго времени суток уважаемые форумчане!
Дело в том что у меня есть интересная для меня программа каторая шифрует/расшифровывает файлы.
Я нашел ее в интернете, к сожалению исходник не содержит комментов, а как она работает я не очень представляю..., маловато знаний в программировании... Нужно мне это для курсовой работы...
Помогите, кому не трудно, откомментируйте плиз две основные процидуры, желательно по подробнее, очень нужно, буду вам очень признателен за помощь.

Вот две процедуры:

Код:
procedure GetCode1(InputFile:string; OutPutFile:string; pass:string);
var
  f   : TMemoryStream;
  i   : Integer;
  l   : Byte;
  s,k : PChar;
  t   : TTime;
begin
  l:=Length(pass);
  if l=0 then exit;
  GetMem(k,l+1);
  StrPCopy(k,pass);
  f:=TMemoryStream.Create;
  try
    f.LoadFromFile(InputFile);
    i:=f.Size;
    GetMem(s,i+1);
    f.Position:=0;
    f.ReadBuffer(s^,i);
    asm
      PUSH EDI
      PUSH EDX
      PUSH EBX
      PUSH CX
      MOV EDI,&s
      MOV EDX,&i
      @L1: MOV EBX,&k
      MOV CL,&l
      @L2: MOV AL,[EBX]
      XOR AL,[EDI]
      XOR AL,$55
      MOV [EDI],AL
      INC EBX
      INC EDI
      DEC EDX
      JZ @L3
      DEC CL
      JNZ @L2
      JMP @L1
      @L3: POP CX
      POP EBX
      POP EDX
      POP EDI
   end;
   f.Position:=0;
   f.WriteBuffer(s^,i);
   f.SaveToFile(OutPutFile);
   finally
     f.Free;
     FreeMem(k);
     FreeMem(s);
   end;
end;
 
procedure GetDeCode1(InputFile:string; OutPutFile:string; pass:string);
var
  f     : TMemoryStream;
  m,j,i : Integer;
  l     : Byte;
  s,k   : PChar;
  t     : TTime;
begin
  l:=Length(pass);
  if l=0 then exit;
  GetMem(k,l+1);
  StrPCopy(k,pass);
  f:=TMemoryStream.Create;
  try
    f.LoadFromFile(InputFile);
    i:=f.Size;
    GetMem(s,i+1);
    f.Position:=0;
    f.ReadBuffer(s^,i);
    m:=0;
    for j:=0 to i-1 do
    begin
      s[j]:=Char(Byte(s[j])xor Byte(k[m])xor $55);
      Inc(m);
      if m=l then m:=0;
    end;
    f.Position:=0;
    f.WriteBuffer(s^,i);
    f.SaveToFile(OutPutFile);
  finally
    f.Free;
    FreeMem(k);
    FreeMem(s);
  end;
end;


Или подскажите хотябы принцип по которому программа кодирует файл...
Спасибо заранее.
402
13 февраля 2007 года
ToRNaDo
70 / / 27.01.2004
Каждый символ текста XOR'ится с паролем, затем XOR'ится с байтом $55

s[j]:=Char(Byte(s[j])xor Byte(k[m])xor $55);

и в ассемблере тоже самое, только быстрее. XOR обратимая операция.
309
13 февраля 2007 года
el scorpio
1.1K / / 19.09.2006
Код:
procedure GetCode1(InputFile:string; OutPutFile:string; pass:string);
var
f : TMemoryStream;
i : Integer;
l : Byte;
s,k : PChar;
t : TTime;
begin
l:=Length(pass); // Определяем длину строки
// (Программа идёт на XYZ если строка длиннее 256 символов :( )
if l=0 then exit; // Если длина равна нулю, выходим (или см. выше)
GetMem(k,l+1); // Требуем память, равную длине строки
StrPCopy(k,pass); // Копируем строку в затребованную память
f:=TMemoryStream.Create; // Создаём объект - поток памяти????
try // Блок обработки ошибок
f.LoadFromFile(InputFile); // Загрузка файла
i:=f.Size; // Определяем его размер
GetMem(s,i+1); // Требуем память, равную длине файла
// (ежели машина не офигеет)
f.Position:=0; // Указатель объекта на начало файла
f.ReadBuffer(s^,i); // Читаем файл в память
asm // Здесь идёт нечто асматическое - просьба прокомментировать знатокам ;)
PUSH EDI
PUSH EDX
PUSH EBX
PUSH CX
MOV EDI,&s
MOV EDX,&i
@L1: MOV EBX,&k
MOV CL,&l
@L2: MOV AL,[EBX]
XOR AL,[EDI]
XOR AL,$55
MOV [EDI],AL
INC EBX
INC EDI
DEC EDX
JZ @L3
DEC CL
JNZ @L2
JMP @L1
@L3: POP CX
POP EBX
POP EDX
POP EDI
end;
f.Position:=0; // возвращаем указатель объекта на начало файла
f.WriteBuffer(s^,i); // Записываем файл
f.SaveToFile(OutPutFile); // Сохраняем файл
finally
f.Free; // Удаляем объект
FreeMem(k); // Освобождаем память
FreeMem(s);
end;
end;
 
procedure GetDeCode1(InputFile:string; OutPutFile:string; pass:string);
var
f : TMemoryStream;
m,j,i : Integer;
l : Byte;
s,k : PChar;
t : TTime;
begin
l:=Length(pass);
if l=0 then exit;
GetMem(k,l+1);
StrPCopy(k,pass);
f:=TMemoryStream.Create;
try
f.LoadFromFile(InputFile);
i:=f.Size;
GetMem(s,i+1);
f.Position:=0;
f.ReadBuffer(s^,i);
m:=0; // Всё то же самое
for j:=0 to i-1 do // Цикл по длине файла
begin
s[j]:=Char(Byte(s[j])xor Byte(k[m])xor $55); // Что-то ксорим
Inc(m); //Увеличиваем m
if m=l then m:=0; // Обнуляем m, ежели оно равно длине строки
// (вспоминаем про ограничение на 256)
end; // Далее всё то же самое
f.Position:=0;
f.WriteBuffer(s^,i);
f.SaveToFile(OutPutFile);
finally
f.Free;
FreeMem(k);
FreeMem(s);
end;
end;

В общем, непонятно, что за параметр pass. Предположительно - это пароль. В принципе логично ограничение на 256 символов, но кто знает....


Алгоритм в общем: функция "ксорит" указанный файл исходным паролем, а потом производит повторный XOR (обратимая арифметическо-логическая операция)

Хотя сам код можно было бы написать и проще...
5.9K
13 февраля 2007 года
Eksell
49 / / 16.11.2005
Огромное Спасибо вам El Scorpio и ToRNaDo за помощь, я в программирование пока еще не очень разбираюсь (только начал изучать), поэтому не все мне пока ясно. Ну чтож, будем изучать... )
Еще раз спасибо вам за помощь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог