Введение в reverse engineering для начинающих [Денис Юричев] (pdf) читать постранично, страница - 48

-  Введение в reverse engineering для начинающих  2.09 Мб, 362с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Денис Юричев

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

2Ch
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