;继 MD5算发汇编代码[着重优化] 之后的MD5 神奇优化(欢迎高手前来指点)
;附件:RadASM 工程的所有文件
;需要注意的是 代码优化了只优化了体积 速度却不一定快
WordToHex MACRO _lValue
mov eax,_lValue
xchg al,ah
rol eax,16
xchg al,ah
EXITM <eax>
ENDM
ABCD STRUCT
dwA DWORD ?
dwB DWORD ?
dwC DWORD ?
dwD DWORD ?
ABCD ends
.const
MD5_A EQU 067452301H
MD5_B EQU 0EFCDAB89H
MD5_C EQU 098BADCFEH
MD5_D EQU 010325476H
.data?
szMd5Hex BYTE 33 DUP (?)
.data
stData_FS DWORD 07,12,17,22
stData_GS DWORD 05,09,14,20
stData_HS DWORD 04,11,16,23
stData_IS DWORD 06,10,15,21
stData_FC DWORD 00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
stData_GC DWORD 01,06,11,00,05,10,15,04,09,14,03,08,13,02,07,12
stData_HC DWORD 05,08,11,14,01,04,07,10,13,00,03,06,09,12,15,02
stData_IC DWORD 00,07,14,05,12,03,10,01,08,15,06,13,04,11,02,09
stData_FF DWORD 0D76AA478H,0E8C7B756H,0242070DBH,0C1BDCEEEH
DWORD 0F57C0FAFH,04787C62AH,0A8304613H,0FD469501H
DWORD 0698098D8H,08B44F7AFH,0FFFF5BB1H,0895CD7BEH
DWORD 06B901122H,0FD987193H,0A679438EH,049B40821H
stData_GG DWORD 0F61E2562H,0C040B340H,0265E5A51H,0E9B6C7AAH
DWORD 0D62F105DH,002441453H,0D8A1E681H,0E7D3FBC8H
DWORD 021E1CDE6H,0C33707D6H,0F4D50D87H,0455A14EDH
DWORD 0A9E3E905H,0FCEFA3F8H,0676F02D9H,08D2A4C8AH
stData_HH DWORD 0FFFA3942H,08771F681H,06D9D6122H,0FDE5380CH
DWORD 0A4BEEA44H,04BDECFA9H,0F6BB4B60H,0BEBFBC70H
DWORD 0289B7EC6H,0EAA127FAH,0D4EF3085H,004881D05H
DWORD 0D9D4D039H,0E6DB99E5H,01FA27CF8H,0C4AC5665H
stData_II DWORD 0F4292244H,0432AFF97H,0AB9423A7H,0FC93A039H
DWORD 0655B59C3H,08F0CCC92H,0FFEFF47DH,085845DD1H
DWORD 06FA87E4FH,0FE2CE6E0H,0A3014314H,04E0811A1H
DWORD 0F7537E82H,0BD3AF235H,02AD7D2BBH,0EB86D391H
szFmt BYTE "%08x%08x%08x%08x",0
.code
_hmemcpy Proc uses edi esi _Dst,_Src,_Count
mov eax,_Count
mov edi,_Dst
mov esi,_Src
mov ecx,eax
shr ecx,02
cld
rep movsd
mov ecx,eax
and ecx,03
rep movsb
ret
_hmemcpy EndP
_ConvertToWordArray Proc uses ebx edi esi _lpData,_dwLen
LOCAL @dwBytes
mov esi,_lpData
mov ebx,_dwLen
mov eax,ebx
add eax,8
shr eax,6
inc eax
shl eax,4
dec eax
shl eax,2
mov @dwBytes,eax
invoke GetProcessHeap
invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,@dwBytes
mov edi,eax
invoke _hmemcpy,edi,esi,ebx
mov DWORD PTR [edi+ebx],128
mov ecx,@dwBytes
shr ecx,2
mov eax,ebx
shr eax,29
mov DWORD PTR [edi+ecx*4],eax
dec ecx
mov eax,_dwLen
shl eax,3
mov DWORD PTR [edi+ecx*4],eax
mov eax,edi
ret
_ConvertToWordArray endp
_MD5 Proc uses ebx edi esi _lpData,_dwLen
LOCAL @Count
LOCAL @abcd:ABCD
LOCAL @ABCD:ABCD
LOCAL @S
invoke _ConvertToWordArray,_lpData,_dwLen
mov esi,eax
lea edi,@abcd
assume edi:PTR ABCD
mov [edi].dwA,MD5_A
mov [edi].dwB,MD5_B
mov [edi].dwC,MD5_C
mov [edi].dwD,MD5_D
mov eax,_dwLen
add eax,8
shr eax,6
inc eax
shl eax,4
mov @Count,eax
xor edx,edx
.While edx<@Count
mov eax,[edi].dwA
mov @ABCD.dwA,eax
mov eax,[edi].dwB
mov @ABCD.dwB,eax
mov eax,[edi].dwC
mov @ABCD.dwC,eax
mov eax,[edi].dwD
mov @ABCD.dwD,eax
xor ebx,ebx
.While ebx<64
mov ecx,ebx
and ecx,48
mov eax,ebx
and eax,3
mov eax,[offset stData_FS+eax*4+ecx]
mov @S,eax
mov eax,ebx
shr eax,4
.if eax==0 ;_md5_F
mov eax,[edi].dwB
not eax
and eax,[edi].dwD
mov ecx,[edi].dwB
and ecx,[edi].dwC
or eax,ecx
.elseif eax==1 ;_md5_G
mov eax,[edi].dwD
not eax
and eax,[edi].dwC
mov ecx,[edi].dwB
and ecx,[edi].dwD
or eax,ecx
.elseif eax==2 ;_md5_H
mov eax,[edi].dwB
xor eax,[edi].dwC
xor eax,[edi].dwD
.elseif eax==3 ;_md5_I
mov eax,[edi].dwD
not eax
or eax,[edi].dwB
xor eax,[edi].dwC
.endif
mov ecx,[offset stData_FC+ebx*4]
add ecx,edx
add eax,[esi+ecx*4] ;x
add eax,[offset stData_FF+ebx*4] ;ac
add eax,[edi].dwA ;a
mov ecx,@S ;s
rol eax,cl
add eax,[edi].dwB ;b
xchg eax,[edi].dwB
xchg eax,[edi].dwC
xchg eax,[edi].dwD
xchg eax,[edi].dwA
inc ebx
.endw
mov eax,@ABCD.dwA
add [edi].dwA,eax
mov eax,@ABCD.dwB
add [edi].dwB,eax
mov eax,@ABCD.dwC
add [edi].dwC,eax
mov eax,@ABCD.dwD
add [edi].dwD,eax
add edx,16
.endw
mov [edi].dwA,WordToHex([edi].dwA)
mov [edi].dwB,WordToHex([edi].dwB)
mov [edi].dwC,WordToHex([edi].dwC)
mov [edi].dwD,WordToHex([edi].dwD)
invoke wsprintf,offset szMd5Hex,offset szFmt,[edi].dwA,[edi].dwB,[edi].dwC,[edi].dwD
assume edi:Nothing
invoke GetProcessHeap
invoke HeapFree,eax,NULL,esi
lea eax,szMd5Hex
ret
_MD5 endp
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)