;高速MD5
;
;
MD5    proc lpBuff:DWORD, mLength:DWORD,lpMD5:DWORD
     add    esp, -58H
     pushad
     mov    eax, dword ptr ss:[ebp+0CH]
     or    eax, eax
     jnz    @md5_start
     mov    edi, dword ptr ss:[ebp+08H]
     push    20h
     pop    ecx
     mov    edx,ecx
     repne    scasb
     sub    edx,ecx
     dec    edx
     mov    dword ptr ss:[ebp+0CH],edx 
@md5_start:
     lea    edi, dword ptr ss:[ebp-40H]
     push    10H
     pop    ecx
     xor    eax, eax
     mov    dword ptr ss:[ebp-58H], eax
     rep    stos dword ptr es:[edi]
     lea    edi, dword ptr ss:[ebp-40H]
     xor    ebx, ebx
     mov    eax, dword ptr ss:[ebp+0CH]
     or    eax, eax
     je    @01
     mov    ecx, eax
     and    ecx, 3FH
     mov    ebx, ecx
     or    ecx, ecx
     je    @02
     mov    esi, dword ptr ss:[ebp+8H]
     lea    esi, dword ptr ds:[eax+esi]
     sub    esi, ecx
     cld
     rep    movs byte ptr es:[edi], byte ptr ds:[esi]
 @02:     lea    edi, dword ptr ss:[ebp-40H]
     or    ebx, ebx
     je    @03
 @01:     mov    byte ptr ds:[ebx+edi], 80H
 @03:    mov    eax, dword ptr ss:[ebp+0CH]
     xor    edx, edx
     push    08H
     pop    ecx
     mul    ecx
     mov    dword ptr ds:[edi+3CH], edx
     mov    dword ptr ds:[edi+38H], eax
     mov    eax, dword ptr ss:[ebp+0CH]
     mov    edx, eax
     shr    eax, 06H
     and    ecx, 3FH
     cmp    ecx, 38H
     jnz    @04
     dec    eax
 @04:     mov    dword ptr ss:[ebp-44H], eax
     mov    eax, 067452301H
     mov    ebx, 0EFCDAB89H
     mov    ecx, 098BADCFEH
     mov    edx, 010325476H
     mov    edi, dword ptr ss:[ebp+08H]
 @07:     jmp    @05
 @06:     dec    dword ptr ss:[ebp-44H]
     mov    dword ptr ss:[ebp-48H], eax
     mov    dword ptr ss:[ebp-4CH], ebx
     mov    dword ptr ss:[ebp-50H], ecx
     mov    dword ptr ss:[ebp-54H], edx
     push    ebp
     mov    esi, ebx
     and    esi, ecx
     mov    ebp, ebx
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+0D76AA478H]
     add    esi, dword ptr ds:[edi]
     rol    esi, 7
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ebx
     mov    ebp, eax
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+0E8C7B756H]
     add    esi, dword ptr ds:[edi+4H]
     rol    esi, 0CH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, eax
     mov    ebp, edx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+0242070DBH]
     add    esi, dword ptr ds:[edi+8H]
     rol    esi, 11H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, edx
     mov    ebp, ecx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+0C1BDCEEEH]
     add    esi, dword ptr ds:[edi+0CH]
     rol    esi, 16H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     and    esi, ecx
     mov    ebp, ebx
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+0F57C0FAFH]
     add    esi, dword ptr ds:[edi+10H]
     rol    esi, 7H
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ebx
     mov    ebp, eax
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+04787C62AH]
     add    esi, dword ptr ds:[edi+14H]
     rol    esi, 0CH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, eax
     mov    ebp, edx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+0A8304613H]
     add    esi, dword ptr ds:[edi+18H]
     rol    esi, 11H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, edx
     mov    ebp, ecx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+0FD469501H]
     add    esi, dword ptr ds:[edi+1CH]
     rol    esi, 16H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     and    esi, ecx
     mov    ebp, ebx
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+0698098D8H]
     add    esi, dword ptr ds:[edi+20H]
     rol    esi, 7
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ebx
     mov    ebp, eax
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+8B44F7AFH]
     add    esi, dword ptr ds:[edi+24H]
     rol    esi, 0CH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, eax
     mov    ebp, edx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+0FFFF5BB1H]
     add    esi, dword ptr ds:[edi+28H]
     rol    esi, 11H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, edx
     mov    ebp, ecx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+895CD7BEH]
     add    esi, dword ptr ds:[edi+2CH]
     rol    esi, 16H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     and    esi, ecx
     mov    ebp, ebx
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+06B901122H]
     add    esi, dword ptr ds:[edi+30H]
     rol    esi, 7H
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ebx
     mov    ebp, eax
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+0FD987193H]
     add    esi, dword ptr ds:[edi+34H]
     rol    esi, 0CH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, eax
     mov    ebp, edx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+0A679438EH]
     add    esi, dword ptr ds:[edi+38H]
     rol    esi, 11H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, edx
     mov    ebp, ecx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+049B40821H]
     add    esi, dword ptr ds:[edi+3CH]
     rol    esi, 16H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     and    esi, edx
     mov    ebp, edx
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+0F61E2562H]
     add    esi, dword ptr ds:[edi+4H]
     rol    esi, 5H
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ecx
     mov    ebp, ecx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+0C040B340H]
     add    esi, dword ptr ds:[edi+18H]
     rol    esi, 9H
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, ebx
     mov    ebp, ebx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+0265E5A51H]
     add    esi, dword ptr ds:[edi+2CH]
     rol    esi, 0EH
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, eax
     mov    ebp, eax
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+0E9B6C7AAH]
     add    esi, dword ptr ds:[edi]
     rol    esi, 14H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     and    esi, edx
     mov    ebp, edx
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+0D62F105DH]
     add    esi, dword ptr ds:[edi+14H]
     rol    esi, 5
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ecx
     mov    ebp, ecx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+02441453H]
     add    esi, dword ptr ds:[edi+28H]
     rol    esi, 9H
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, ebx
     mov    ebp, ebx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+0D8A1E681H]
     add    esi, dword ptr ds:[edi+3CH]
     rol    esi, 0EH
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, eax
     mov    ebp, eax
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+0E7D3FBC8H]
     add    esi, dword ptr ds:[edi+10H]
     rol    esi, 14H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     and    esi, edx
     mov    ebp, edx
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+21E1CDE6H]
     add    esi, dword ptr ds:[edi+24H]
     rol    esi, 5H
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ecx
     mov    ebp, ecx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+0C33707D6H]
     add    esi, dword ptr ds:[edi+38H]
     rol    esi, 9H
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, ebx
     mov    ebp, ebx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+0F4D50D87H]
     add    esi, dword ptr ds:[edi+0CH]
     rol    esi, 0EH
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, eax
     mov    ebp, eax
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+455A14EDH]
     add    esi, dword ptr ds:[edi+20H]
     rol    esi, 14H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     and    esi, edx
     mov    ebp, edx
     not    ebp
     and    ebp, ecx
     or    esi, ebp
     lea    esi, dword ptr ds:[eax+esi+0A9E3E905H]
     add    esi, dword ptr ds:[edi+34H]
     rol    esi, 5H
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     and    esi, ecx
     mov    ebp, ecx
     not    ebp
     and    ebp, ebx
     or    esi, ebp
     lea    esi, dword ptr ds:[edx+esi+0FCEFA3F8H]
     add    esi, dword ptr ds:[edi+8H]
     rol    esi, 9H
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     and    esi, ebx
     mov    ebp, ebx
     not    ebp
     and    ebp, eax
     or    esi, ebp
     lea    esi, dword ptr ds:[ecx+esi+676F02D9H]
     add    esi, dword ptr ds:[edi+1CH]
     rol    esi, 0EH
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     and    esi, eax
     mov    ebp, eax
     not    ebp
     and    ebp, edx
     or    esi, ebp
     lea    esi, dword ptr ds:[ebx+esi+8D2A4C8AH]
     add    esi, dword ptr ds:[edi+30H]
     rol    esi, 14H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     xor    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[eax+esi+0FFFA3942H]
     add    esi, dword ptr ds:[edi+14H]
     rol    esi, 4
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     xor    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[edx+esi+8771F681H]
     add    esi, dword ptr ds:[edi+20H]
     rol    esi, 0BH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     xor    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[ecx+esi+6D9D6122H]
     add    esi, dword ptr ds:[edi+2CH]
     rol    esi, 10H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     xor    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ebx+esi+0FDE5380CH]
     add    esi, dword ptr ds:[edi+38H]
     rol    esi, 17H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     xor    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[eax+esi+0A4BEEA44H]
     add    esi, dword ptr ds:[edi+4H]
     rol    esi, 4
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     xor    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[edx+esi+04BDECFA9H]
     add    esi, dword ptr ds:[edi+10H]
     rol    esi, 0BH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     xor    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[ecx+esi+0F6BB4B60H]
     add    esi, dword ptr ds:[edi+1CH]
     rol    esi, 10H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     xor    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ebx+esi+0BEBFBC70H]
     add    esi, dword ptr ds:[edi+28H]
     rol    esi, 17H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     xor    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[eax+esi+289B7EC6H]
     add    esi, dword ptr ds:[edi+34H]
     rol    esi, 4H
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     xor    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[edx+esi+0EAA127FAH]
     add    esi, dword ptr ds:[edi]
     rol    esi, 0BH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     xor    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[ecx+esi+0D4EF3085H]
     add    esi, dword ptr ds:[edi+0CH]
     rol    esi, 10H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     xor    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ebx+esi+4881D05H]
     add    esi, dword ptr ds:[edi+18H]
     rol    esi, 17H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, ebx
     xor    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[eax+esi+0D9D4D039H]
     add    esi, dword ptr ds:[edi+24H]
     rol    esi, 4H
     add    esi, ebx
     mov    eax, esi
     mov    esi, eax
     xor    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[edx+esi+0E6DB99E5H]
     add    esi, dword ptr ds:[edi+30H]
     rol    esi, 0BH
     add    esi, eax
     mov    edx, esi
     mov    esi, edx
     xor    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[ecx+esi+1FA27CF8H]
     add    esi, dword ptr ds:[edi+3CH]
     rol    esi, 10H
     add    esi, edx
     mov    ecx, esi
     mov    esi, ecx
     xor    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ebx+esi+0C4AC5665H]
     add    esi, dword ptr ds:[edi+8]
     rol    esi, 17H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, edx
     not    esi
     or    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[eax+esi+0F4292244H]
     add    esi, dword ptr ds:[edi]
     rol    esi, 6H
     add    esi, ebx
     mov    eax, esi
     mov    esi, ecx
     not    esi
     or    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[edx+esi+432AFF97H]
     add    esi, dword ptr ds:[edi+1CH]
     rol    esi, 0AH
     add    esi, eax
     mov    edx, esi
     mov    esi, ebx
     not    esi
     or    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ecx+esi+0AB9423A7H]
     add    esi, dword ptr ds:[edi+38H]
     rol    esi, 0FH
     add    esi, edx
     mov    ecx, esi
     mov    esi, eax
     not    esi
     or    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[ebx+esi+0FC93A039H]
     add    esi, dword ptr ds:[edi+14H]
     rol    esi, 15H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, edx
     not    esi
     or    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[eax+esi+655B59C3H]
     add    esi, dword ptr ds:[edi+30H]
     rol    esi, 6H
     add    esi, ebx
     mov    eax, esi
     mov    esi, ecx
     not    esi
     or    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[edx+esi+8F0CCC92H]
     add    esi, dword ptr ds:[edi+0CH]
     rol    esi, 0AH
     add    esi, eax
     mov    edx, esi
     mov    esi, ebx
     not    esi
     or    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ecx+esi+0FFEFF47DH]
     add    esi, dword ptr ds:[edi+28H]
     rol    esi, 0FH
     add    esi, edx
     mov    ecx, esi
     mov    esi, eax
     not    esi
     or    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[ebx+esi+85845DD1H]
     add    esi, dword ptr ds:[edi+4H]
     rol    esi, 15H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, edx
     not    esi
     or    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[eax+esi+6FA87E4FH]
     add    esi, dword ptr ds:[edi+20H]
     rol    esi, 6H
     add    esi, ebx
     mov    eax, esi
     mov    esi, ecx
     not    esi
     or    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[edx+esi+0FE2CE6E0H]
     add    esi, dword ptr ds:[edi+3CH]
     rol    esi, 0AH
     add    esi, eax
     mov    edx, esi
     mov    esi, ebx
     not    esi
     or    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ecx+esi+0A3014314H]
     add    esi, dword ptr ds:[edi+18H]
     rol    esi, 0FH
     add    esi, edx
     mov    ecx, esi
     mov    esi, eax
     not    esi
     or    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[ebx+esi+4E0811A1H]
     add    esi, dword ptr ds:[edi+34H]
     rol    esi, 15H
     add    esi, ecx
     mov    ebx, esi
     mov    esi, edx
     not    esi
     or    esi, ebx
     xor    esi, ecx
     lea    esi, dword ptr ds:[eax+esi+0F7537E82H]
     add    esi, dword ptr ds:[edi+10H]
     rol    esi, 6H
     add    esi, ebx
     mov    eax, esi
     mov    esi, ecx
     not    esi
     or    esi, eax
     xor    esi, ebx
     lea    esi, dword ptr ds:[edx+esi+0BD3AF235H]
     add    esi, dword ptr ds:[edi+2CH]
     rol    esi, 0AH
     add    esi, eax
     mov    edx, esi
     mov    esi, ebx
     not    esi
     or    esi, edx
     xor    esi, eax
     lea    esi, dword ptr ds:[ecx+esi+02AD7D2BBH]
     add    esi, dword ptr ds:[edi+8H]
     rol    esi, 0FH
     add    esi, edx
     mov    ecx, esi
     mov    esi, eax
     not    esi
     or    esi, ecx
     xor    esi, edx
     lea    esi, dword ptr ds:[ebx+esi+0EB86D391H]
     add    esi, dword ptr ds:[edi+24H]
     rol    esi, 15H
     add    esi, ecx
     mov    ebx, esi
     pop    ebp
     add    eax, dword ptr ss:[ebp-48H]
     add    ebx, dword ptr ss:[ebp-4CH]
     add    ecx, dword ptr ss:[ebp-50H]
     add    edx, dword ptr ss:[ebp-54H]
     lea    edi, dword ptr ds:[edi+40H]
 @05:     cmp    dword ptr ss:[ebp-44H], 0
     jnz    @06
     cmp    dword ptr ss:[ebp-58H], 1
     je    @09
     inc    dword ptr ss:[ebp-44H]
     inc    dword ptr ss:[ebp-58H]
     lea    edi, dword ptr ss:[ebp-40H]
     jmp    @07

   @toHex:
    XCHG    DH,DL
    ROL    EDX,10H
    XCHG    DH,DL
    PUSH    8
    POP    ECX
   @loop:
    ROL    EDX,4
    MOV    EAX,EDX
    AND    AL,0FH
    CMP    AL,0AH
    SBB    AL,69H
    DAS
    STOSB
    DEC    ECX
    JNZ    @loop
    DB    0C3H
  @09:
     push    edx
     push    ecx
     push    ebx
     push    eax

     push    4
     pop    ebx
     mov    edi, dword ptr ss:[ebp+10H]
  @08: 
     pop    edx
     call    @toHex
     dec    ebx
     jnz    @08
     mov    byte ptr es:[edi],0
      popad
     ret
MD5 endp