Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Кейген своими руками

GL#0M (gl00m-crk@yandex.ru)

Спецвыпуск: Хакер, номер #057, стр. 057-044-3


.text:00401F45 pushesi

.text:00401F46 xor esi, esi

.text:00401F48 testebx, ebx

.text:00401F4A jle short loc_401F75

.text:00401F4C pushebp

.text:00401F4D mov ebp, [esp+8+lpb]; EBP = указатель на буфер результата

.text:00401F51 pushedi

.text:00401F52 mov edi, [esp+0Ch+lps]; EDI = указатель на буфер данных

.text:00401F56

.text:00401F56 loc_401F56: ; CODE XREF: HexFromHexStr+31 j

.text:00401F56 lea eax, [esp+0Ch+cb]; EAX = указатель на буфер для байта результата

.text:00401F5A pusheax

.text:00401F5B pushedi

.text:00401F5C callsub_401E80; преобразует два байта строки в hex-число

.text:00401F61 mov cl, byte ptr [esp+14h+cb] ; CL = результирующий байт

.text:00401F65 add esp, 8

.text:00401F68 mov [esi+ebp], cl; заносим его в буфер результата

.text:00401F6B inc esi

.text:00401F6C add edi, 2

.text:00401F6F cmp esi, ebx

.text:00401F71 jlshort loc_401F56

.text:00401F73 pop edi

.text:00401F74 pop ebp

.text:00401F75

.text:00401F75 loc_401F75: ; CODE XREF: HexFromHexStr+A j

.text:00401F75 pop esi

.text:00401F76 pop ebx

.text:00401F77 retn

Дальше идет собственно то, ради чего я все это затеял, поэтому приведу теоретические выдержки из книги "Прикладная криптография".

Blowfish - это 64-битный блочный шифр с ключом переменной длины.

Алгоритм включает два этапа:

1. SetKey - развертывание ключа;

2. Encrypt/Decrypt - шифровка/дешифровка данных.

Развертывание ключа преобразует ключ длиной до 56 байт в несколько массивов подключей общим объемом 4168 байт.

Шифрование данных состоит из простой функции, последовательно выполняемой 16 раз. Каждый этап состоит из зависимой от ключа перестановки и зависимой от ключа и данных подстановки. Используются только сложения и XOR двойных слов. Единственными дополнительными операциями на каждом этапе являются четыре извлечения данных из индексированного массива.

В Blowfish используется много подключей. Так называемые массивы PBox и SBox. Массив PBox состоит из 18-ти подключей (двойных слов). Каждый из четырех массивов SBox содержит 256 подключей (двойных слов).

Дешифрование выполняется точно так же, как и шифрование, но подключи PBox используются в обратном порядке.

Для дальнейшего понимания кода, я думаю, достаточно. Теперь мы без труда можем распознать Blowfish, а уж если вооружиться его исходным кодом, то тем более ;). (Исходные коды Blowfish на C++ найдешь на диске с журналом.)

Продолжим...

00409B58 . 68 58100000push1058h

00409B5D . E8 512E0100callAlloc

00409B62 . 8BD0 mov edx, eax; edx = указатель на выделенную память

00409B64 . 83C4 10add esp, 10h

Странный размер... Ничего не напоминает =)? Правильно! Эта память будет предназначена для массивов подключей развернутого ключа. Сразу предупрежу, что этого выделения памяти здесь могло и не быть, это лишь частный случай.

Далее мы можем видеть обычный для программ, написанных на Microsoft Visual C++, способ получения длины строки.

00409B77 . 8D4C24 24lea ecx, dword ptr [esp+24h]; eсx = указатель на вспомогательный буфер

00409B7B . 83CE FForesi, 0FFFFFFFFh

00409B7E . 51 pushecx ; 3 параметр

Назад на стр. 057-044-2  Содержание  Вперед на стр. 057-044-4