Blog. Just Blog

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

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

Алгоритм хеширования Jenkins на Ассемблере

27.12.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Семейство хеш-функций Jenkins ведет свою историю с 1997 года, когда этот алгоритм был впервые опубликован. Автором является Bob Jenkins, известный специалист в области создания генераторов псевдослучайных чисел и криптографии. Несмотря на кажущуюся простоту, хеш Jenkins обладает высокой скоростью работы и отличным лавинным эффектом. Даже на небольших объемах данных количество коллизий минимальное. Вот вариант этого алгоритма на Ассемблере.
  1. ;---------------------------------------------
  2. ; Функция вычисления хеша Jenkins
  3. ; Copyright (C) ManHunter / PCL
  4. ; https://www.manhunter.ru
  5. ;---------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       EAX = полученный хеш
  11. ;---------------------------------------------
  12. proc    Jenkins 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.         je      .loc_ret
  22.  
  23.         mov     esi,[lpData]
  24. @@:
  25.         lodsb
  26.         movzx   eax,al
  27.  
  28.         ; hash += key[i];
  29.         add     ebx,eax
  30.  
  31.         ; hash += hash << 10;
  32.         mov     eax,ebx
  33.         shl     eax,10
  34.         add     ebx,eax
  35.  
  36.         ; hash ^= hash >> 6;
  37.         mov     eax,ebx
  38.         shr     eax,6
  39.         xor     ebx,eax
  40.  
  41.         ; i++
  42.         dec     ecx
  43.         jnz     @b
  44.  
  45. .loc_ret:
  46.         ; hash += hash << 3;
  47.         mov     eax,ebx
  48.         shl     eax,3
  49.         add     ebx,eax
  50.  
  51.         ; hash ^= hash >> 11;
  52.         mov     eax,ebx
  53.         shr     eax,11
  54.         xor     ebx,eax
  55.  
  56.         ; hash += hash << 15;
  57.         mov     eax,ebx
  58.         shl     eax,15
  59.         add     eax,ebx
  60.  
  61.         pop     esi ecx ebx
  62.         ret
  63. endp
Функции передаются два параметра: указатель на данные и размер этих данных, на выходе DWORD с полученным значением хеша.

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

Алгоритм хеширования MaHash8 на Ассемблере

28.09.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
MaHash8 - эффективная функция с высокой производительностью, которая позволяет выполнять операции хеширования с минимальным количеством коллизий. Она основана на простых операциях, имеет очень понятную структуру и легко реализуется на различных языках программирования.

В алгоритме MaHash8 для хеширования используется таблица подстановки, позаимствованная из криптоалгоритма Skipjack. Если не хотите таскать готовую таблицу, то ее можно создавать динамически, используя формулы по приведенной ссылке.
  1. sTable  db 0a3h,0d7h,009h,083h,0f8h,048h,0f6h,0f4h,0b3h,021h,015h,078h
  2.         db 099h,0b1h,0afh,0f9h,0e7h,02dh,04dh,08ah,0ceh,04ch,0cah,02eh
  3.         db 052h,095h,0d9h,01eh,04eh,038h,044h,028h,00ah,0dfh,002h,0a0h
  4.         db 017h,0f1h,060h,068h,012h,0b7h,07ah,0c3h,0e9h,0fah,03dh,053h
  5.         db 096h,084h,06bh,0bah,0f2h,063h,09ah,019h,07ch,0aeh,0e5h,0f5h
  6.         db 0f7h,016h,06ah,0a2h,039h,0b6h,07bh,00fh,0c1h,093h,081h,01bh
  7.         db 0eeh,0b4h,01ah,0eah,0d0h,091h,02fh,0b8h,055h,0b9h,0dah,085h
  8.         db 03fh,041h,0bfh,0e0h,05ah,058h,080h,05fh,066h,00bh,0d8h,090h
  9.         db 035h,0d5h,0c0h,0a7h,033h,006h,065h,069h,045h,000h,094h,056h
  10.         db 06dh,098h,09bh,076h,097h,0fch,0b2h,0c2h,0b0h,0feh,0dbh,020h
  11.         db 0e1h,0ebh,0d6h,0e4h,0ddh,047h,04ah,01dh,042h,0edh,09eh,06eh
  12.         db 049h,03ch,0cdh,043h,027h,0d2h,007h,0d4h,0deh,0c7h,067h,018h
  13.         db 089h,0cbh,030h,01fh,08dh,0c6h,08fh,0aah,0c8h,074h,0dch,0c9h
  14.         db 05dh,05ch,031h,0a4h,070h,088h,061h,02ch,09fh,00dh,02bh,087h
  15.         db 050h,082h,054h,064h,026h,07dh,003h,040h,034h,04bh,01ch,073h
  16.         db 0d1h,0c4h,0fdh,03bh,0cch,0fbh,07fh,0abh,0e6h,03eh,05bh,0a5h
  17.         db 0adh,004h,023h,09ch,014h,051h,022h,0f0h,029h,079h,071h,07eh
  18.         db 0ffh,08ch,00eh,0e2h,00ch,0efh,0bch,072h,075h,06fh,037h,0a1h
  19.         db 0ech,0d3h,08eh,062h,08bh,086h,010h,0e8h,008h,077h,011h,0beh
  20.         db 092h,04fh,024h,0c5h,032h,036h,09dh,0cfh,0f3h,0a6h,0bbh,0ach
  21.         db 05eh,06ch,0a9h,013h,057h,025h,0b5h,0e3h,0bdh,0a8h,03ah,001h
  22.         db 005h,059h,02ah,046h
Ассемблерный вариант 32-битной версии функции MaHash8 выглядит примерно так. Я постарался ее максимально оптимизировать, в результате этого функция не использует никакие внешние данные и не требует выделения дополнительной памяти, все расчеты выполняются внутри нее.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления хеша MaHash8
  3. ; Автор: ManHunter / PCL
  4. ; https://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       EAX = полученный хеш
  11. ;-----------------------------------------------------------------------
  12. proc    MaHash8 lpData:DWORD, dSize:DWORD
  13.         locals
  14.                 hash1 dd ?
  15.                 hash2 dd ?
  16.         endl
  17.  
  18.         push    ebx ecx edx esi edi
  19.  
  20.         mov     esi,[lpData]
  21.         mov     eax,[dSize]
  22.         mov     [hash1],eax
  23.         mov     [hash2],eax
  24.         xor     ecx,ecx
  25. .loc_loop:
  26.         cmp     ecx,[dSize]
  27.         je      .loc_done
  28.  
  29.         mov     al,byte[esi]
  30.         add     eax,ecx
  31.         movzx   eax,al
  32.         movzx   edx,byte[sTable+eax]
  33.         add     [hash1],edx
  34.  
  35.         mov     edx,[hash1]
  36.         shl     edx,6
  37.         mov     eax,[hash1]
  38.         shr     eax,11
  39.         xor     eax,edx
  40.         add     eax,[hash1]
  41.         rol     eax,14
  42.         mov     [hash1],eax
  43.  
  44.         lodsb
  45.         add     eax,ecx
  46.         movzx   eax,al
  47.         movzx   edx,byte[sTable+eax]
  48.         add     [hash2],edx
  49.  
  50.         mov     edx,[hash2]
  51.         shl     edx,6
  52.         mov     eax,[hash2]
  53.         shr     eax,11
  54.         xor     eax,edx
  55.         add     eax,[hash2]
  56.         rol     eax,18
  57.         mov     [hash2],eax
  58.  
  59.         mov     ebx,[hash1]
  60.         mov     edi,[hash2]
  61.  
  62.         mov     eax,ebx
  63.         shr     eax,16
  64.         movzx   edx,ax
  65.         mov     eax,edi
  66.         shl     eax,16
  67.         or      eax,edx
  68.         mov     [hash1],eax
  69.  
  70.         mov     eax,edi
  71.         shr     eax,16
  72.         movzx   edx,ax
  73.         mov     eax,ebx
  74.         shl     eax,16
  75.         or      eax,edx
  76.         mov     [hash2],eax
  77.  
  78.         inc     ecx
  79.         jmp     .loc_loop
  80.  
  81. .loc_done:
  82.         mov     eax,[hash2]
  83.         xor     eax,[hash1]
  84.  
  85.         pop     edi esi edx ecx ebx
  86.         ret
  87. endp
На выходе передаются два параметра: lpData - указатель на блок данных, которые надо прохешировать, и dSize - длина этих данных. Результат возвращается в регистре EAX.

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

Использование системных функций хеширования

07.05.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Использование системных функций хеширования

Я уже выкладывал на сайте ассемблерные реализации алгоритмов хеширования MD4, MD5 и SHA1. Но в Windows есть уже готовые функции для подсчета не только этих хешей, но и некоторых других. Конечно, делать все самому гораздо приятнее для души и полезнее для мозгов, но почему бы не переложить часть работы на систему? Как говорил один мой хороший товарищ: "У лошади голова большая, вот пусть она и думает".

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

Исследование защиты программы HashTab Shell Extension

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

Скриншот программы HashTab Shell Extension

HashTab Shell Extension - расширение стандартного Проводника Windows, которое позволяет подсчитывать контрольные суммы и хэши файлов прямо на вкладке свойств. Собственно, никаких ограничений по функционалу в программе нет, вся разница между бесплатной и платной версией заключается только в надоедливой надписи, что программа не лицензирована для коммерческого использования. Так что это будет не совсем исследование защиты, а так, косметическая операция. В конце концов, нельзя же все ломать, надо на чем-то и сидеть :)

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

Расчет 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, разница только в используемых регистрах и размере блоков, используемых для цикла хеширования.

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

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