Введение в reverse engineering для начинающих [Денис Юричев] (pdf) читать постранично, страница - 45
Книга в формате pdf! Изображения и текст могут не отображаться!
[Настройки текста] [Cбросить фильтры]
edi
esi
ebp
ebx
; Filename
;
;
;
;
File
Count
Size
Str
; File
; Memory
Переписанный на Си код:
void decrypt_file(char *fin, char* fout, char *pw)
{
FILE *f;
int real_flen, flen;
BYTE *buf;
f=fopen(fin, "rb");
if (f==NULL)
{
printf ("Cannot open input file!\n");
return;
};
fseek (f, 0, SEEK_END);
flen=ftell (f);
fseek (f, 0, SEEK_SET);
buf=(BYTE*)malloc (flen);
fread (buf, flen, 1, f);
fclose (f);
if (memcmp (buf, "QR9", 3)!=0)
{
printf ("File is not crypted!\n");
return;
};
memcpy (&real_flen, buf+3, 4);
decrypt (buf+(3+4), flen-(3+4), pw);
f=fopen(fout, "wb");
fwrite (buf+(3+4), real_flen, 1, f);
fclose (f);
free (buf);
};
OK, посмотрим глубже.
Функция crypt():
.text:00541260
.text:00541260
.text:00541260
.text:00541260
.text:00541260
.text:00541260
.text:00541260
.text:00541261
crypt
proc near
arg_0
arg_4
arg_8
= dword ptr
= dword ptr
= dword ptr
push
mov
4
8
0Ch
ebx
ebx, [esp+4+arg_0]
247
7.2. “QR9”: ЛЮБИТЕЛЬСКАЯ КРИПТОСИСТЕМА ВДОХНОВЛЕННАЯ КУБИКОМ РУБИКА ГЛАВА 7. ЕЩЕ ПРИМЕРЫ
.text:00541265
.text:00541266
.text:00541267
.text:00541268
.text:0054126A
.text:0054126A loc_54126A:
push
push
push
xor
ebp
esi
edi
ebp, ebp
Этот фрагмент кода копирует часть входного буфера во внутренний буфер, который я поже назвал
“cube64”. Длина в регистре ECX. MOVSD означает скопировать 32-битное слово, так что, 16 32-битных слов
это как раз 64 байта.
.text:0054126A
.text:0054126E
.text:00541273
.text:00541275
.text:0054127A
.text:0054127C
.text:0054127D
mov
eax,
mov
ecx,
mov
esi,
mov
edi,
push
1
push
eax
rep movsd
[esp+10h+arg_8]
10h
ebx
; EBX is pointer within input buffer
offset cube64
Вызвать rotate_all_with_password():
.text:0054127F
call
rotate_all_with_password
Скопировать зашифрованное содержимое из “cube64” назад в буфер:
.text:00541284
.text:00541288
.text:0054128A
.text:0054128D
.text:00541290
.text:00541295
.text:0054129A
.text:0054129D
.text:0054129F
mov
eax,
mov
edi,
add
ebp,
add
esp,
mov
ecx,
mov
esi,
add
ebx,
cmp
ebp,
rep movsd
[esp+18h+arg_4]
ebx
40h
8
10h
offset cube64
40h ; add 64 to input buffer pointer
eax ; EBP contain ammount of crypted data.
Если EBP не больше чем длина во входном аргументе, тогда переходим к следующему блоку.
.text:005412A1
.text:005412A3
.text:005412A4
.text:005412A5
.text:005412A6
.text:005412A7
.text:005412A7 crypt
jl
pop
pop
pop
pop
retn
endp
short loc_54126A
edi
esi
ebp
ebx
Реконструированная функция crypt():
void crypt (BYTE *buf, int sz, char *pw)
{
int i=0;
do
{
memcpy (cube, buf+i, 8*8);
rotate_all (pw, 1);
memcpy (buf+i, cube, 8*8);
i+=64;
}
while (i=’a’ && c24)
q-=24;
int quotient=q/3;
int remainder=q % 3;
switch (remainder)
250
7.2. “QR9”: ЛЮБИТЕЛЬСКАЯ КРИПТОСИСТЕМА ВДОХНОВЛЕННАЯ КУБИКОМ РУБИКА ГЛАВА 7. ЕЩЕ ПРИМЕРЫ
{
case 0: for (int i=0; i
Последние комментарии
7 часов 10 минут назад
7 часов 12 минут назад
8 часов 10 минут назад
8 часов 33 минут назад
1 день 2 часов назад
1 день 2 часов назад