Кейген своими руками 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 параметр |