Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Расчет Fletcher's Checksum на Ассемблере

15.02.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм Fletcher's Checksum был назван в честь его автора - Джона Флетчера (John Fletcher), который разрабатывал проекты для систем дальней связи, тяжелой промышленности, спутниковой навигации и даже NASA. Ему потребовался максимально быстрый и компактный алгоритм для контроля целостности передаваемых данных. Для обработки больших объемов данных Fletcher's Checksum не подходит, так как велика вероятность коллизий (количество возможных значений контрольной суммы всего 65535). Этот алгоритм наиболее эффективен для обнаружения погрешности в несколько бит, например, искажение пакета данных в случае помех при передаче по линии связи. Дальнейшее развитие алгоритма Fletcher's Checksum привело к появлению алгоритма Adler-32, о котором я писал раньше.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления контрольной суммы Флетчера
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       AX = полученный хеш
  11. ;-----------------------------------------------------------------------
  12. proc    fletcher lpData:DWORD, dSize:DWORD
  13.         push    ebx ecx esi
  14.  
  15.         ; Инициализация
  16.         xor     ebx,ebx
  17.  
  18.         ; Длина строки
  19.         mov     ecx,[dSize]
  20.         or      ecx,ecx
  21.         jz      .loc_ret
  22.  
  23.         ; Указатель на начало строки
  24.         mov     esi,[lpData]
  25.  
  26.         ; Хеширование
  27. .loc_checksum:
  28.         lodsb
  29.         add     bl,al
  30.         add     bh,bl
  31.         loop    .loc_checksum
  32.  
  33. .loc_ret:
  34.         movzx   eax,bx
  35.  
  36.         pop     esi ecx ebx
  37.         ret
  38. endp
Параметры вызова: lpData - указатель на данные, для которых надо подсчитать контрольную сумму, dSize - размер данных. 16-битное значение контрольной суммы возвращается в регистре EAX. Алгоритм легко преобразуется в вариант Fletcher-32 и Fletcher-64, разница только в используемых регистрах и размере блоков, используемых для цикла хеширования.

Читать статью целиком »
Просмотров: 644 | Комментариев: 0

Расчет MurmurHash на Ассемблере

29.01.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
MurmurHash - семейство простых и быстрых хеш-функций. Необычное название произошло от двух базовых операций - умножение (MUltiply) и циклический битовый сдвиг (Rotate), которые используются в основном цикле хеширования. К достоинствам алгоритма Murmur можно отнести простоту реализации, хорошее распределение, мощный лавинный эффект, высокую скорость работы и сравнительно высокую устойчивость к коллизиям. Первая версия, разработанная Остином Апплеби (Austin Appleby), самая простая в реализации:
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления хеша Murmur
  3. ; Автор: ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ;       dSeed  - соль
  10. ; На выходе:
  11. ;       EAX = полученный хеш
  12. ;-----------------------------------------------------------------------
  13. proc    Murmur lpData:DWORD, dSize:DWORD, dSeed:DWORD
  14.         push    ebx ecx edx esi edi
  15.  
  16.         MAGIC = 0xC6A4A793
  17.  
  18.         mov     ebx,[dSize]
  19.         imul    ecx,ebx,MAGIC
  20.         mov     edx,[dSeed]
  21.         xor     ecx,edx
  22.  
  23.         mov     esi,[lpData]
  24.  
  25. .loc_loop:
  26.         cmp     ebx,4
  27.         jb      .loop_done
  28.  
  29.         mov     eax,dword [esi]
  30.         add     ecx,eax
  31.         imul    ecx,MAGIC
  32.         mov     eax,ecx
  33.         shr     eax,16
  34.         xor     ecx,eax
  35.  
  36.         add     esi,4
  37.         sub     ebx,4
  38.         jmp     .loc_loop
  39.  
  40. .loop_done:
  41.         cmp     ebx,3
  42.         je      .loc_tail_3
  43.         cmp     ebx,2
  44.         je      .loc_tail_2
  45.         cmp     ebx,1
  46.         je      .loc_tail_1
  47.         jmp     .loc_finish
  48.  
  49. .loc_tail_3:
  50.         movzx   eax,byte[esi+2]
  51.         shl     eax,16
  52.         add     ecx,eax
  53. .loc_tail_2:
  54.         movzx   eax,byte[esi+1]
  55.         shl     eax,8
  56.         add     ecx,eax
  57. .loc_tail_1:
  58.         movzx   eax,byte[esi]
  59.         add     ecx,eax
  60.         imul    ecx,MAGIC
  61.         mov     eax,ecx
  62.         shr     eax,16
  63.         xor     ecx,eax
  64.  
  65. .loc_finish:
  66.         imul    ecx,MAGIC
  67.  
  68.         mov     eax,ecx
  69.         shr     eax,10
  70.         xor     ecx,eax
  71.  
  72.         imul    ecx,MAGIC
  73.  
  74.         mov     eax,ecx
  75.         shr     eax,17
  76.         xor     eax,ecx
  77.  
  78.         pop     edi esi edx ecx ebx
  79.         ret
  80. endp
На входе функции передаются три параметра: lpData - указатель на строку данных, для которых надо подсчитать хеш, dSize - размер данных (длина строки), dSeed - соль для пользовательской модификации хеша.

Читать статью целиком »
Просмотров: 797 | Комментариев: 9

Программы для поиска криптоалгоритмов в исполняемых файлах

04.11.2015 | Категория: Темная сторона Силы | Автор: ManHunter

Программы для поиска криптоалгоритмов в исполняемых файлах

При анализе различных защит часто приходится определять, какой алгоритм был использован для шифрования данных или преобразований регистрационного имени в правильный серийный номер. Часто авторы не изобретают велосипедов, а используют готовые алгоритмы шифрования или хеширования. Вы должны понимать, что алгоритмы шифрования и алгоритмы хеширования - это разные вещи, но для удобства в статье я буду называть их просто "криптоалгоритмами". Если алгоритмы стандартные, то их можно идентифицировать, например, по характерным константам-полиномам, таблицам преобразований или по последовательности выполняемых операций (хорошие статьи по этой теме на английском можно почитать тут). Для поиска криптоалгоритмов в исполняемых файлах созданы специальные программы, небольшой обзор которых я подготовил в этой статье.

Читать статью целиком »
Просмотров: 4374 | Комментариев: 10

Исследование защиты программы MD5 CrackFAST

06.08.2015 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы MD5 CrackFAST

Программа MD5 CrackFAST предназначена для взлома хэшей MD5. Взлом выполняется прямым перебором, без использования таблиц, поэтому для больших строк о положительном результате можно сразу забыть. Но и без этого в незарегистрированной версии программы есть принудительное ограничение - восстанавливаются строки не более 3 символов длиной.

Читать статью целиком »
Просмотров: 3822 | Комментариев: 7

Расчет CRC24 на Ассемблере

05.01.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
CRC24 - еще одна разновидность контрольной суммы. Как можно увидеть из названия, ее размер составляет 24 бита, или 3 байта. Я пока не нашел практического применения этому хешу, так же как и программ, использующих его. Но раз есть алгоритм, то почему бы его не реализовать на Ассемблере? Начнем с наиболее компактной реализации без использования таблицы.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления хеша CRC24
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       EAX = полученный хеш
  11. ;-----------------------------------------------------------------------
  12. proc    CRC24 lpData:DWORD, dSize:DWORD
  13.         push    ebx ecx edx esi
  14.  
  15.         CRC24_POLYNOM = 1864CFBh
  16.  
  17.         ; Инициализация
  18.         mov     eax,0B704CEh
  19.  
  20.         ; Длина строки
  21.         cmp     [dSize],0
  22.         je      .loc_ret
  23.  
  24.         ; Указатель на начало строки
  25.         xor     ecx,ecx
  26. @@:
  27.         ; Получить символ из строки
  28.         mov     ebx,[lpData]
  29.  
  30.         movzx   edx,byte [ebx+ecx]
  31.         shl     edx,16
  32.         xor     eax,edx
  33.  
  34.         xor     esi,esi
  35. .loc_cycle:
  36.         shl     eax,1
  37.         test    eax,1000000h
  38.         jz      .loc_next
  39.         xor     eax,CRC24_POLYNOM
  40.         jmp     .loc_next
  41. .loc_next:
  42.         inc     esi
  43.         cmp     esi,8
  44.         jb      .loc_cycle
  45.  
  46.         ; Следующий символ
  47.         inc     ecx
  48.         cmp     ecx,[dSize]
  49.         jb      @b
  50.  
  51. .loc_ret:
  52.         and     eax,0FFFFFFh
  53.  
  54.         pop     esi edx ecx ebx
  55.         ret
  56. endp
По скорости работы этот алгоритм мало чем отличается от безтабличных реализаций CRC32 или CRC16, а для хранения результатов все равно надо будет использовать переменную размера DWORD. Так что каких-то особых преимуществ перед этими хешами у CRC24 нет.

Читать статью целиком »
Просмотров: 3840 | Комментариев: 6

prev 01 02 03 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0189 сек.) / Память: 4.5 Mb
Наверх