📄 md5.asm
字号:
;Modify by binny at 2003.12.
_MD5Trans1 MACRO
and ebx, eax
not eax
and eax, edx
or eax, ebx
ENDM
_MD5Trans2 MACRO
and eax, edx ; X & Z
not edx ; ~Z
and ebx, edx ; Y & Z
or eax, ebx ; X | Y
ENDM
_MD5Trans3 MACRO
xor eax, ebx ;X ^ Y
xor eax, edx ;X ^ Z
ENDM
_MD5Trans4 MACRO
not edx ; ~Z
or eax, edx ; X | Z
xor eax, ebx ; X ^ Y
ENDM
MD5Trans1 MACRO dwA, dwB, dwC, dwD, dwX, chS, dwT
mov eax, dwB
mov ebx, dwC
mov edx, dwD
_MD5Trans1 ; F ( B,C,D )
mov ecx, dwX
add eax, ecx ; + X[?]
add eax, dwT ; + T
add eax, dwA ; + A
mov cl, chS
rol eax, cl ;rol
add eax, dwB ; + B
mov dwA, eax
ENDM
MD5Trans2 MACRO dwA, dwB, dwC, dwD, dwX, chS, dwT
mov eax, dwB
mov ebx, dwC
mov edx, dwD
_MD5Trans2
add eax, dwA
mov ecx, dwX
add eax, ecx
add eax, dwT
mov cl, chS
rol eax, cl
add eax, dwB
mov dwA, eax
ENDM
MD5Trans3 MACRO dwA, dwB, dwC, dwD, dwX, chS, dwT
mov eax, dwB
mov ebx, dwC
mov edx, dwD
_MD5Trans3
add eax, dwA
mov ecx, dwX
add eax, ecx
add eax, dwT
mov cl, chS
rol eax, cl
add eax, dwB
mov dwA, eax
ENDM
MD5Trans4 MACRO dwA, dwB, dwC, dwD, dwX, chS, dwT
mov eax, dwB
mov ebx, dwC
mov edx, dwD
_MD5Trans4
add eax, dwA
mov ecx, dwX
add eax, ecx
add eax, dwT
mov cl, chS
rol eax, cl
add eax, dwB
mov dwA, eax
ENDM
MD5Finalize proc uses ecx edi \
lpSum:DWORD
mov edi, lpSum
mov ecx, 16
Loop1:
mov eax, dword ptr [edi]
bswap eax
mov dword ptr [edi], eax
add edi, 4
sub ecx, 4
jnz Loop1
EndLoop:
mov eax, ecx
ret
MD5Finalize endp
_CopyMemory proc uses edi esi edx ecx ebx dest:DWORD, src:DWORD, len:DWORD
mov edi, dest
mov esi, src
mov edx, len
mov ecx, edx
shr ecx, 2
mov ebx, ecx
shl ebx, 2
sub edx, ebx
rep movsd
mov ecx, edx
rep movsb
ret
_CopyMemory endp
MD5Pad proc uses edi esi ecx ebx \
lpData:DWORD, iLen:DWORD, iTLen:DWORD
mov ebx, iTLen
mov edi, ebx
mov esi, lpData
add esi, iLen ;esi = lpData+len
and ebx, 3fh ;计算需要填充的比特数
mov ecx, 56
sub ecx, ebx
jg AboveZero ;如果大于0,则不用再补充
add ecx, 40h ;ecx = 需要填充的长度
AboveZero:
;计算总长度
;下面代码保证ebx不超过2^29 bytes
mov ebx, edi
shr ebx, 29
shl edi, 3
mov dword ptr [qwLen], edi
mov dword ptr [qwlen+4], ebx
invoke _CopyMemory, esi, addr PADDING, ecx
add esi, ecx
invoke _CopyMemory, esi, addr qwLen, 8
lea eax, [ecx+8]
ret
MD5Pad endp
MD5Init proc uses esi MD5Ptr:DWORD
assume esi:ptr MD5Sum
mov esi, MD5Ptr
mov eax, 067452301h
mov [esi].dwSum1, eax
mov eax, 0efcdab89h
mov [esi].dwSum2, eax
mov eax, 098badcfeh
mov [esi].dwSum3, eax
mov eax, 010325476h
mov [esi].dwSum4, eax
ret
MD5Init endp
MD5Translate proc uses edi esi edx ecx ebx\
lpData:DWORD, iLen:DWORD, MD5Ptr:DWORD
assume esi:ptr MD5Sum
LOCAL a:DWORD, b:DWORD
LOCAL _c:DWORD, d:DWORD
LOCAL x[16 * sizeof(DWORD)]:DWORD
lea edi, table
mov esi, MD5Ptr
MD5Again:
lea eax, x
invoke _CopyMemory, eax, lpData, 64
add lpData, 64
mov eax, [esi].dwSum1
mov a, eax
mov eax, [esi].dwSum2
mov b, eax
mov eax, [esi].dwSum3
mov _c, eax
mov eax, [esi].dwSum4
mov d, eax
MD5Trans1 a, b, _c, d, x[ZERO], MD5S11, [edi]
MD5Trans1 d, a, b, _c, x[ONE], MD5S12, [edi + 4]
MD5Trans1 _c, d, a, b, x[TWO], MD5S13, [edi + 8]
MD5Trans1 b, _c, d, a, x[THREE], MD5S14, [edi + 12]
MD5Trans1 a, b, _c, d, x[FOUR], MD5S11, [edi + 16]
MD5Trans1 d, a, b, _c, x[FIVE], MD5S12, [edi + 20]
MD5Trans1 _c, d, a, b, x[SIX], MD5S13, [edi + 24]
MD5Trans1 b, _c, d, a, x[SEVEN], MD5S14, [edi + 28]
MD5Trans1 a, b, _c, d, x[EIGHT], MD5S11, [edi + 32]
MD5Trans1 d, a, b, _c, x[NINE], MD5S12, [edi + 36]
MD5Trans1 _c, d, a, b, x[TEN], MD5S13, [edi + 40]
MD5Trans1 b, _c, d, a, x[ELEVEN], MD5S14, [edi + 44]
MD5Trans1 a, b, _c, d, x[TWELVE], MD5S11, [edi + 48]
MD5Trans1 d, a, b, _c, x[THIRT], MD5S12, [edi + 52]
MD5Trans1 _c, d, a, b, x[FOURT], MD5S13, [edi + 56]
MD5Trans1 b, _c, d, a, x[FIFT], MD5S14, [edi + 60]
MD5Trans2 a, b, _c, d, x[ONE], MD5S21, [edi + 64]
MD5Trans2 d, a, b, _c, x[SIX], MD5S22, [edi + 68]
MD5Trans2 _c, d, a, b, x[ELEVEN], MD5S23, [edi + 72]
MD5Trans2 b, _c, d, a, x[ZERO], MD5S24, [edi + 76]
MD5Trans2 a, b, _c, d, x[FIVE], MD5S21, [edi + 80]
MD5Trans2 d, a, b, _c, x[TEN], MD5S22, [edi + 84]
MD5Trans2 _c, d, a, b, x[FIFT], MD5S23, [edi + 88]
MD5Trans2 b, _c, d, a, x[FOUR], MD5S24, [edi + 92]
MD5Trans2 a, b, _c, d, x[NINE], MD5S21, [edi + 96]
MD5Trans2 d, a, b, _c, x[FOURT], MD5S22, [edi + 100]
MD5Trans2 _c, d, a, b, x[THREE], MD5S23, [edi + 104]
MD5Trans2 b, _c, d, a, x[EIGHT], MD5S24, [edi + 108]
MD5Trans2 a, b, _c, d, x[THIRT], MD5S21, [edi + 112]
MD5Trans2 d, a, b, _c, x[TWO], MD5S22, [edi + 116]
MD5Trans2 _c, d, a, b, x[SEVEN], MD5S23, [edi + 120]
MD5Trans2 b, _c, d, a, x[TWELVE], MD5S24, [edi + 124]
MD5Trans3 a, b, _c, d, x[FIVE], MD5S31, [edi + 128]
MD5Trans3 d, a, b, _c, x[EIGHT], MD5S32, [edi + 132]
MD5Trans3 _c, d, a, b, x[ELEVEN], MD5S33, [edi + 136]
MD5Trans3 b, _c, d, a, x[FOURT], MD5S34, [edi + 140]
MD5Trans3 a, b, _c, d, x[ONE], MD5S31, [edi + 144]
MD5Trans3 d, a, b, _c, x[FOUR], MD5S32, [edi + 148]
MD5Trans3 _c, d, a, b, x[SEVEN], MD5S33, [edi + 152]
MD5Trans3 b, _c, d, a, x[TEN], MD5S34, [edi + 156]
MD5Trans3 a, b, _c, d, x[THIRT], MD5S31, [edi + 160]
MD5Trans3 d, a, b, _c, x[ZERO], MD5S32, [edi + 164]
MD5Trans3 _c, d, a, b, x[THREE], MD5S33, [edi + 168]
MD5Trans3 b, _c, d, a, x[SIX], MD5S34, [edi + 172]
MD5Trans3 a, b, _c, d, x[NINE], MD5S31, [edi + 176]
MD5Trans3 d, a, b, _c, x[TWELVE], MD5S32, [edi + 180]
MD5Trans3 _c, d, a, b, x[FIFT], MD5S33, [edi + 184]
MD5Trans3 b, _c, d, a, x[TWO], MD5S34, [edi + 188]
MD5Trans4 a, b, _c, d, x[ZERO], MD5S41, [edi + 192]
MD5Trans4 d, a, b, _c, x[SEVEN], MD5S42, [edi + 196]
MD5Trans4 _c, d, a, b, x[FOURT], MD5S43, [edi + 200]
MD5Trans4 b, _c, d, a, x[FIVE], MD5S44, [edi + 204]
MD5Trans4 a, b, _c, d, x[TWELVE], MD5S41, [edi + 208]
MD5Trans4 d, a, b, _c, x[THREE], MD5S42, [edi + 212]
MD5Trans4 _c, d, a, b, x[TEN], MD5S43, [edi + 216]
MD5Trans4 b, _c, d, a, x[ONE], MD5S44, [edi + 220]
MD5Trans4 a, b, _c, d, x[EIGHT], MD5S41, [edi + 224]
MD5Trans4 d, a, b, _c, x[FIFT], MD5S42, [edi + 228]
MD5Trans4 _c, d, a, b, x[SIX], MD5S43, [edi + 232]
MD5Trans4 b, _c, d, a, x[THIRT], MD5S44, [edi + 236]
MD5Trans4 a, b, _c, d, x[FOUR], MD5S41, [edi + 240]
MD5Trans4 d, a, b, _c, x[ELEVEN], MD5S42, [edi + 244]
MD5Trans4 _c, d, a, b, x[TWO], MD5S43, [edi + 248]
MD5Trans4 b, _c, d, a, x[NINE], MD5S44, [edi + 252]
mov eax, a
add [esi].dwSum1, eax
mov eax, b
add [esi].dwSum2, eax
mov eax, _c
add [esi].dwSum3, eax
mov eax, d
add [esi].dwSum4, eax
sub iLen, 64
jg MD5Again
ret
MD5Translate endp
MD5 proc uses ebx ecx \
lpEWH:DWORD, iLen:DWORD, MD5Ptr:DWORD
mov ebx, iLen
invoke MD5Init, MD5Ptr
invoke MD5Pad, lpEWH, ebx, ebx
invoke MD5Translate, lpEWH, ebx, MD5Ptr
invoke MD5Finalize, MD5Ptr
ret
MD5 endp
;Create by Binny at 2005.1
QQMD5 proc uses ebx esi ecx \
lpEWH:DWORD, iLen:DWORD, iAST:DWORD, MD5Ptr:DWORD
assume esi:ptr MD5Sum
mov ebx, iLen
QQMD5Again:
invoke MD5Init, MD5Ptr
invoke MD5Pad, lpEWH, ebx, ebx
invoke MD5Translate, lpEWH, ebx, MD5Ptr
invoke _CopyMemory, lpEWH, MD5Ptr, 16
mov ebx,10h
sub iAST,1
jg QQMD5Again
invoke MD5Finalize, MD5Ptr
mov esi, MD5Ptr
mov ecx, 0EFEFEFEFh
xor [esi].dwSum1, ecx
xor [esi].dwSum2, ecx
xor [esi].dwSum3, ecx
xor [esi].dwSum4, ecx
ret
QQMD5 endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -