Blog. Just Blog

Расчет хеша MD5 на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Функция расчета хеша MD5 на Ассемблере. Готовых решений на FASM как всегда не было, пришлось портировать из MASM. Для работы процедуры в сегменте .data надо подготовить следующие данные:
  1. ; Сегмент данных
  2. section '.data' data readable writeable  
  3. ...
  4. ; Шаблоны функции wsprintf для перевода хеша в строковый вид,
  5. ; при необходимости можно оставить только какой-нибудь один
  6. szMD5Format1 db '%.8X%.8X%.8X%.8X',0  ; Для получения заглавных букв
  7. szMD5Format2 db '%.8x%.8x%.8x%.8x',0  ; Для маленьких букв в строке хеша
  8.  
  9. stMD5Result:
  10.   stdtA      dd ?   ; Переменные для получения и хранения
  11.   stdtB      dd ?   ; результата хеширования
  12.   stdtC      dd ?
  13.   stdtD      dd ?
  14.  
  15. stMD5Hash    rb 33  ; Буфер для строки хеша в формате ASCIIZ
А вот собственно сама процедура хеширования и пример использования:
  1. ;-------------------------------------------------------
  2. ; Процедура расчета хеша MD5
  3. ; На входе:
  4. ; dta, dtb, dtc, dtd - начальные значения MD5, по умолчанию = 0
  5. ; ptBuffer - указатель на буфер от которого считается хеш
  6. ; dtBufferLength - длина буфера в байтах
  7. ; На выходе:
  8. ; Заполненные переменные stdtA, stdtB, stdtC, stdtD
  9. ;-------------------------------------------------------
  10. proc  procMD5hash dta, dtb, dtc, dtd, ptBuffer, dtBufferLength
  11.       push    eax ebx ecx edx edi esi
  12.  
  13.       ; phase I - padding
  14.       mov     edi,[ptBuffer]
  15.       mov     eax,[dtBufferLength]
  16.  
  17.       inc     eax
  18.       add     edi,eax
  19.       mov     byte [edi-1],080h
  20.  
  21.       xor     edx,edx
  22.  
  23.       mov     ebx,64
  24.       div     ebx
  25.  
  26.       neg     edx
  27.       add     edx,64
  28.  
  29.       cmp     edx,8
  30.       jae     @f
  31.  
  32.       add     edx,64
  33. @@:
  34.       mov     ecx,edx
  35.       xor     al,al
  36.       rep     stosb
  37.  
  38.       mov     eax,[dtBufferLength]
  39.  
  40.       inc     edx
  41.       add     [dtBufferLength],edx
  42.  
  43.       xor     edx,edx
  44.  
  45.       mov     ebx,8
  46.       mul     ebx
  47.  
  48.       mov     dword [edi-8],eax
  49.       mov     dword [edi-4],edx
  50.  
  51.       mov     edx,[dtBufferLength]
  52.  
  53.       mov     edi,[ptBuffer]
  54.  
  55.       ; phase II - chaining variables initialization
  56.  
  57.       mov     [stdtA],067452301h
  58.       mov     [stdtB],0efcdab89h
  59.       mov     [stdtC],098badcfeh
  60.       mov     [stdtD],010325476h
  61.  
  62.       ; phase III - hashing
  63. hashloop:
  64.       mov     eax,[stdtA]
  65.       mov     [dta],eax
  66.       mov     eax,[stdtB]
  67.       mov     [dtb],eax
  68.       mov     eax,[stdtC]
  69.       mov     [dtc],eax
  70.       mov     eax,[stdtD]
  71.       mov     [dtd],eax
  72.  
  73.       stdcall FF,[dta],[dtb],[dtc],[dtd],dword [edi+00*4],07,0d76aa478h
  74.       mov     [dta],eax
  75.       stdcall FF,[dtd],[dta],[dtb],[dtc],dword [edi+01*4],12,0e8c7b756h
  76.       mov     [dtd],eax
  77.       stdcall FF,[dtc],[dtd],[dta],[dtb],dword [edi+02*4],17,0242070dbh
  78.       mov     [dtc],eax
  79.       stdcall FF,[dtb],[dtc],[dtd],[dta],dword [edi+03*4],22,0c1bdceeeh
  80.       mov     [dtb],eax
  81.       stdcall FF,[dta],[dtb],[dtc],[dtd],dword [edi+04*4],07,0f57c0fafh
  82.       mov     [dta],eax
  83.       stdcall FF,[dtd],[dta],[dtb],[dtc],dword [edi+05*4],12,04787c62ah
  84.       mov     [dtd],eax
  85.       stdcall FF,[dtc],[dtd],[dta],[dtb],dword [edi+06*4],17,0a8304613h
  86.       mov     [dtc],eax
  87.       stdcall FF,[dtb],[dtc],[dtd],[dta],dword [edi+07*4],22,0fd469501h
  88.       mov     [dtb],eax
  89.       stdcall FF,[dta],[dtb],[dtc],[dtd],dword [edi+08*4],07,0698098d8h
  90.       mov     [dta],eax
  91.       stdcall FF,[dtd],[dta],[dtb],[dtc],dword [edi+09*4],12,08b44f7afh
  92.       mov     [dtd],eax
  93.       stdcall FF,[dtc],[dtd],[dta],[dtb],dword [edi+10*4],17,0ffff5bb1h
  94.       mov     [dtc],eax
  95.       stdcall FF,[dtb],[dtc],[dtd],[dta],dword [edi+11*4],22,0895cd7beh
  96.       mov     [dtb],eax
  97.       stdcall FF,[dta],[dtb],[dtc],[dtd],dword [edi+12*4],07,06b901122h
  98.       mov     [dta],eax
  99.       stdcall FF,[dtd],[dta],[dtb],[dtc],dword [edi+13*4],12,0fd987193h
  100.       mov     [dtd],eax
  101.       stdcall FF,[dtc],[dtd],[dta],[dtb],dword [edi+14*4],17,0a679438eh
  102.       mov     [dtc],eax
  103.       stdcall FF,[dtb],[dtc],[dtd],[dta],dword [edi+15*4],22,049b40821h
  104.       mov     [dtb],eax
  105.  
  106.       ; round 2
  107.       stdcall GG,[dta],[dtb],[dtc],[dtd],dword [edi+01*4],05,0f61e2562h
  108.       mov     [dta],eax
  109.       stdcall GG,[dtd],[dta],[dtb],[dtc],dword [edi+06*4],09,0c040b340h
  110.       mov     [dtd],eax
  111.       stdcall GG,[dtc],[dtd],[dta],[dtb],dword [edi+11*4],14,0265e5a51h
  112.       mov     [dtc],eax
  113.       stdcall GG,[dtb],[dtc],[dtd],[dta],dword [edi+00*4],20,0e9b6c7aah
  114.       mov     [dtb],eax
  115.       stdcall GG,[dta],[dtb],[dtc],[dtd],dword [edi+05*4],05,0d62f105dh
  116.       mov     [dta],eax
  117.       stdcall GG,[dtd],[dta],[dtb],[dtc],dword [edi+10*4],09,002441453h
  118.       mov     [dtd],eax
  119.       stdcall GG,[dtc],[dtd],[dta],[dtb],dword [edi+15*4],14,0d8a1e681h
  120.       mov     [dtc],eax
  121.       stdcall GG,[dtb],[dtc],[dtd],[dta],dword [edi+04*4],20,0e7d3fbc8h
  122.       mov     [dtb],eax
  123.       stdcall GG,[dta],[dtb],[dtc],[dtd],dword [edi+09*4],05,021e1cde6h
  124.       mov     [dta],eax
  125.       stdcall GG,[dtd],[dta],[dtb],[dtc],dword [edi+14*4],09,0c33707d6h
  126.       mov     [dtd],eax
  127.       stdcall GG,[dtc],[dtd],[dta],[dtb],dword [edi+03*4],14,0f4d50d87h
  128.       mov     [dtc],eax
  129.       stdcall GG,[dtb],[dtc],[dtd],[dta],dword [edi+08*4],20,0455a14edh
  130.       mov     [dtb],eax
  131.       stdcall GG,[dta],[dtb],[dtc],[dtd],dword [edi+13*4],05,0a9e3e905h
  132.       mov     [dta],eax
  133.       stdcall GG,[dtd],[dta],[dtb],[dtc],dword [edi+02*4],09,0fcefa3f8h
  134.       mov     [dtd],eax
  135.       stdcall GG,[dtc],[dtd],[dta],[dtb],dword [edi+07*4],14,0676f02d9h
  136.       mov     [dtc],eax
  137.       stdcall GG,[dtb],[dtc],[dtd],[dta],dword [edi+12*4],20,08d2a4c8ah
  138.       mov     [dtb],eax
  139.  
  140.       ; round 3
  141.       stdcall HH,[dta],[dtb],[dtc],[dtd],dword [edi+05*4],04,0fffa3942h
  142.       mov     [dta],eax
  143.       stdcall HH,[dtd],[dta],[dtb],[dtc],dword [edi+08*4],11,08771f681h
  144.       mov     [dtd],eax
  145.       stdcall HH,[dtc],[dtd],[dta],[dtb],dword [edi+11*4],16,06d9d6122h
  146.       mov     [dtc],eax
  147.       stdcall HH,[dtb],[dtc],[dtd],[dta],dword [edi+14*4],23,0fde5380ch
  148.       mov     [dtb],eax
  149.       stdcall HH,[dta],[dtb],[dtc],[dtd],dword [edi+01*4],04,0a4beea44h
  150.       mov     [dta],eax
  151.       stdcall HH,[dtd],[dta],[dtb],[dtc],dword [edi+04*4],11,04bdecfa9h
  152.       mov     [dtd],eax
  153.       stdcall HH,[dtc],[dtd],[dta],[dtb],dword [edi+07*4],16,0f6bb4b60h
  154.       mov     [dtc],eax
  155.       stdcall HH,[dtb],[dtc],[dtd],[dta],dword [edi+10*4],23,0bebfbc70h
  156.       mov     [dtb],eax
  157.       stdcall HH,[dta],[dtb],[dtc],[dtd],dword [edi+13*4],04,0289b7ec6h
  158.       mov     [dta],eax
  159.       stdcall HH,[dtd],[dta],[dtb],[dtc],dword [edi+00*4],11,0eaa127fah
  160.       mov     [dtd],eax
  161.       stdcall HH,[dtc],[dtd],[dta],[dtb],dword [edi+03*4],16,0d4ef3085h
  162.       mov     [dtc],eax
  163.       stdcall HH,[dtb],[dtc],[dtd],[dta],dword [edi+06*4],23,004881d05h
  164.       mov     [dtb],eax
  165.       stdcall HH,[dta],[dtb],[dtc],[dtd],dword [edi+09*4],04,0d9d4d039h
  166.       mov     [dta],eax
  167.       stdcall HH,[dtd],[dta],[dtb],[dtc],dword [edi+12*4],11,0e6db99e5h
  168.       mov     [dtd],eax
  169.       stdcall HH,[dtc],[dtd],[dta],[dtb],dword [edi+15*4],16,01fa27cf8h
  170.       mov     [dtc],eax
  171.       stdcall HH,[dtb],[dtc],[dtd],[dta],dword [edi+02*4],23,0c4ac5665h
  172.       mov     [dtb],eax
  173.  
  174.       ; round 4
  175.       stdcall II,[dta],[dtb],[dtc],[dtd],dword [edi+00*4],06,0f4292244h
  176.       mov     [dta],eax
  177.       stdcall II,[dtd],[dta],[dtb],[dtc],dword [edi+07*4],10,0432aff97h
  178.       mov     [dtd],eax
  179.       stdcall II,[dtc],[dtd],[dta],[dtb],dword [edi+14*4],15,0ab9423a7h
  180.       mov     [dtc],eax
  181.       stdcall II,[dtb],[dtc],[dtd],[dta],dword [edi+05*4],21,0fc93a039h
  182.       mov     [dtb],eax
  183.       stdcall II,[dta],[dtb],[dtc],[dtd],dword [edi+12*4],06,0655b59c3h
  184.       mov     [dta],eax
  185.       stdcall II,[dtd],[dta],[dtb],[dtc],dword [edi+03*4],10,08f0ccc92h
  186.       mov     [dtd],eax
  187.       stdcall II,[dtc],[dtd],[dta],[dtb],dword [edi+10*4],15,0ffeff47dh
  188.       mov     [dtc],eax
  189.       stdcall II,[dtb],[dtc],[dtd],[dta],dword [edi+01*4],21,085845dd1h
  190.       mov     [dtb],eax
  191.       stdcall II,[dta],[dtb],[dtc],[dtd],dword [edi+08*4],06,06fa87e4fh
  192.       mov     [dta],eax
  193.       stdcall II,[dtd],[dta],[dtb],[dtc],dword [edi+15*4],10,0fe2ce6e0h
  194.       mov     [dtd],eax
  195.       stdcall II,[dtc],[dtd],[dta],[dtb],dword [edi+06*4],15,0a3014314h
  196.       mov     [dtc],eax
  197.       stdcall II,[dtb],[dtc],[dtd],[dta],dword [edi+13*4],21,04e0811a1h
  198.       mov     [dtb],eax
  199.       stdcall II,[dta],[dtb],[dtc],[dtd],dword [edi+04*4],06,0f7537e82h
  200.       mov     [dta],eax
  201.       stdcall II,[dtd],[dta],[dtb],[dtc],dword [edi+11*4],10,0bd3af235h
  202.       mov     [dtd],eax
  203.       stdcall II,[dtc],[dtd],[dta],[dtb],dword [edi+02*4],15,02ad7d2bbh
  204.       mov     [dtc],eax
  205.       stdcall II,[dtb],[dtc],[dtd],[dta],dword [edi+09*4],21,0eb86d391h
  206.       mov     [dtb],eax
  207.  
  208.       mov     eax,[dta]
  209.       add     [stdtA],eax
  210.       mov     eax,[dtb]
  211.       add     [stdtB],eax
  212.       mov     eax,[dtc]
  213.       add     [stdtC],eax
  214.       mov     eax,[dtd]
  215.       add     [stdtD],eax
  216.  
  217.       add     edi,64
  218.  
  219.       sub     edx,64
  220.       jnz     hashloop
  221.  
  222.       ; phase IV - results
  223.  
  224.       mov     ecx,4
  225.       mov     esi,stMD5Result
  226. @@:
  227.       mov     eax,dword [esi]
  228.       xchg    al,ah
  229.       rol     eax,16
  230.       xchg    al,ah
  231.       mov     dword [esi],eax
  232.  
  233.       add     esi,4
  234.  
  235.       loop    @b
  236.  
  237.       pop     esi edi edx ecx ebx eax
  238.  
  239.       ret
  240. endp
  241.  
  242. ; Вспомогательная функция
  243. proc  FF var1,var2,var3,var4,x,s,t
  244.       ; a = b + ((a + F(b,c,d) + x + t) << s )
  245.       push    ebx ecx
  246.  
  247.       mov     eax,[var2]
  248.       mov     ebx,[var3]
  249.       mov     ecx,[var4]
  250.  
  251.       ; F(x,y,z) = (x and y) or ((not x) and z)
  252.       and     ebx,eax
  253.       not     eax
  254.       and     eax,ecx
  255.       or      eax,ebx
  256.  
  257.       add     eax,[var1]
  258.       add     eax,[x]
  259.       add     eax,[t]
  260.  
  261.       mov     ecx,[s]
  262.       rol     eax,cl
  263.  
  264.       add     eax,[var2]
  265.  
  266.       pop     ecx ebx
  267.       ret
  268. endp
  269.  
  270. ; Вспомогательная функция
  271. proc  GG var1,var2,var3,var4,x,s,t
  272.       push    ebx ecx
  273.       ; a = b + ((a + G(b,c,d) + x + t) << s)
  274.  
  275.       mov     eax,[var2]
  276.       mov     ebx,[var3]
  277.       mov     ecx,[var4]
  278.  
  279.       ; G(x,y,z) = (x and z) or (y and (not z))
  280.       and     eax,ecx
  281.       not     ecx
  282.       and     ecx,ebx
  283.       or      eax,ecx
  284.  
  285.       add     eax,[var1]
  286.       add     eax,[x]
  287.       add     eax,[t]
  288.  
  289.       mov     ecx,[s]
  290.       rol     eax,cl
  291.  
  292.       add     eax,[var2]
  293.  
  294.       pop     ecx ebx
  295.       ret
  296. endp
  297.  
  298. ; Вспомогательная функция
  299. proc  HH var1,var2,var3,var4,x,s,t
  300.       push    ebx ecx
  301.       ; a = b + ((a + H(b,c,d) + x + t) << s)
  302.  
  303.       mov     eax,[var2]
  304.       mov     ebx,[var3]
  305.       mov     ecx,[var4]
  306.  
  307.       ; H(x,y,z) = x xor y xor z
  308.       xor     eax,ebx
  309.       xor     eax,ecx
  310.  
  311.       add     eax,[var1]
  312.       add     eax,[x]
  313.       add     eax,[t]
  314.  
  315.       mov     ecx,[s]
  316.       rol     eax,cl
  317.  
  318.       add     eax,[var2]
  319.  
  320.       pop     ecx ebx
  321.       ret
  322. endp
  323.  
  324. ; Вспомогательная функция
  325. proc  II var1,var2,var3,var4,x,s,t
  326.       push    ebx ecx
  327.       ; a = b + ((a + I(b,c,d) + x + t) << s)
  328.  
  329.       mov     eax,[var2]
  330.       mov     ebx,[var3]
  331.       mov     ecx,[var4]
  332.  
  333.       ; I(x,y,z) = y xor (x or (not z))
  334.       not     ecx
  335.       or      eax,ecx
  336.       xor     eax,ebx
  337.  
  338.       add     eax,[var1]
  339.       add     eax,[x]
  340.       add     eax,[t]
  341.  
  342.       mov     ecx,[s]
  343.       rol     eax,cl
  344.  
  345.       add     eax,[var2]
  346.  
  347.       pop     ecx ebx
  348.       ret
  349. endp
Пример использования:
  1. ; Сегмент данных
  2. section '.data' data readable writeable  
  3. ...
  4. somedata db 'Yeah! I like Flat Assembler!',0 ; Исходные данные для хеширования
  5.  
  6. ; Сегмент кода
  7. section '.code' code readable executable
  8.         ...
  9.         ; Расчет длины строки. Для бинарных данных lstrlen лучше не использовать
  10.         invoke  lstrlen,somedata
  11.         ; Расчет MD5
  12.         stdcall procMD5hash,0,0,0,0,somedata,eax
  13.         ; Перевод в строку, буквы заглавные
  14.         invoke  wsprintf,stMD5Hash,szMD5Format1,[stdtA],[stdtB],[stdtC],[stdtD]
  15.         ...
В результате выполнения приведенного пример в буфере stMD5Hash будет строка хеша MD5 "475023083BE370BCC9CBE9C300EA3D4A" в формате ASCIIZ. В приложении пример программы, считающей хеш MD5 от введенной строки.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

MD5.Demo.zip (5,171 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 10140 | Комментариев: 5

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Vitalij (01.06.2013 в 15:20):
Спасибо! не ожидал найти готовый модуль сразу на FASM Теперь просто вставлю его в свой SIP-Phohe... :)
Alex (12.05.2013 в 14:28):
Спасибо за ответ, просто не знал про такое правило.
ManHunter (12.05.2013 в 00:46):
Это не проблема, это правило. После wsprintf ВСЕГДА следует коррекция стека.
Alex (12.05.2013 в 00:42):
Столкнулся с проблемой. После вызова wsprintf в стеке остаются передаваемые ей параметры в размере 6x4байт, что при многократном вызове в цикле приводит к переполнению стека. Приходится после вызова менять вершину стека add esp,24. Это только у меня такая проблема или есть еще у кого? :)
Николай (10.12.2012 в 04:59):
Спасибо большое! Уже перерыл кучу сайтов. Там в основном C++ со своими классами, а тут просто и понятно!

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0051 сек.) / Память: 4.5 Mb
Наверх