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;
Помогите разобраться с кодом
Дело в том что у меня есть интересная для меня программа каторая шифрует/расшифровывает файлы.
Я нашел ее в интернете, к сожалению исходник не содержит комментов, а как она работает я не очень представляю..., маловато знаний в программировании... Нужно мне это для курсовой работы...
Помогите, кому не трудно, откомментируйте плиз две основные процидуры, желательно по подробнее, очень нужно, буду вам очень признателен за помощь.
Вот две процедуры:
Код:
Или подскажите хотябы принцип по которому программа кодирует файл...
Спасибо заранее.
s[j]:=Char(Byte(s[j])xor Byte(k[m])xor $55);
и в ассемблере тоже самое, только быстрее. XOR обратимая операция.
Код:
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;
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 (обратимая арифметическо-логическая операция)
Хотя сам код можно было бы написать и проще...
Еще раз спасибо вам за помощь.