首页
社区
课程
招聘
[原创]MD5汇编源码折腾日记(附全部RASM源码)
发表于: 2013-3-16 16:33 5767

[原创]MD5汇编源码折腾日记(附全部RASM源码)

2013-3-16 16:33
5767
第一天

写个程序,用的了MD5汇编码,百度了一堆,但是没有一个满意的。
并且都对500M以上的大文件支持不好,可怜单位配的256M内存的古董机!!!!!
于是自己决定重新写个,如下:(只贴MD5部分,全部源码请看附件)

;算法
_LeftMov@MD5        macro _dwA,_dwB,x,s,t
        add  eax,_dwA
        add  eax,x
        add  eax,t
        mov  cl,s
        rol  eax,cl
        add  eax,_dwB
endm

; F(x,y,z) = (x and y) or ((not x) and z)
; a =((a + F(b,c,d) + x + t) << s ) + b
_FProc@MD5    macro _dwA,_dwB,_dwC,_dwD,x,s,t
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        and  ebx,eax
        not  eax
        and  eax,ecx
        or  eax,ebx
       
        _LeftMov@MD5        _dwA,_dwB,x,s,t
endm

; G(x,y,z) = (x and z) or (y and (not z))
; a = ((a + G(b,c,d) + x + t) << s) + b
_GProc@MD5     macro _dwA,_dwB,_dwC,_dwD,x,s,t   
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        and  eax,ecx
        not  ecx
        and  ecx,ebx
        or  eax,ecx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm
; H(x,y,z) = x xor y xor z
; a = ((a + H(b,c,d) + x + t) << s) + b
_HProc@MD5      macro _dwA,_dwB,_dwC,_dwD,x,s,t  
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        xor  eax,ebx
        xor  eax,ecx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm
; I(x,y,z) = y xor (x or (not z))
; a = ((a + I(b,c,d) + x + t) << s) + b
_IProc@MD5     macro _dwA,_dwB,_dwC,_dwD,x,s,t
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        not  ecx
        or  eax,ecx
        xor  eax,ebx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm

_dwA@MD5        macro        _Function,_dwBitNumber,_dwTi
       
        _Function&@MD5        @dwA,@dwB,@dwC,@dwD,dword ptr [edi+_dwBitNumber*4],_ALeftBits,_dwTi
        mov  @dwA,eax
endm
_dwB@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwB,@dwC,@dwD,@dwA,dword ptr [edi+_dwBitNumber*4],_BLeftBits,_dwTi
        mov  @dwB,eax
endm
_dwC@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwC,@dwD,@dwA,@dwB,dword ptr [edi+_dwBitNumber*4],_CLeftBits,_dwTi
        mov  @dwC,eax
endm
_dwD@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwD,@dwA,@dwB,@dwC,dword ptr [edi+_dwBitNumber*4],_DLeftBits,_dwTi
        mov  @dwD,eax
endm

_MD5hashProc    proc  uses  edi esi,_lpFileMem,_dwFileSize,_lpdwMD5Buffer
        local          @dwA,@dwB,@dwC,@dwD
        LOCAL        @dwRotateCount
        LOCAL        @dwEndRotateCount
        LOCAL        @szBuffer1[128]:byte
       
        LOCAL        @bEndMD5
       
        LOCAL        @dbFileSizeInBuffer:byte
                       
                        xor        al,al
                        lea        edi,@szBuffer1
                        mov        ecx,sizeof @szBuffer1
                        cld
                        rep        stosb
                       
                        mov        @bEndMD5,FALSE
                       
                        ;求得512取模及需要填充的数据
                        mov        eax,_dwFileSize
                        shr        eax,6
                        mov        @dwRotateCount,eax
                       
                        ;模64后末尾字符串复制到缓冲区
                        lea        edi,@szBuffer1
                        mov        esi,_lpFileMem
                        mov          eax,_dwFileSize
                        mov        ecx,eax
                        and        eax,0ffffffc0h;
                        add        esi,eax
       
                        and        ecx,03fh;除以64求模
                        mov        @dbFileSizeInBuffer,cl
                        .if        ecx
                                cld
                                rep        movsb
                        .endif
                        mov  byte ptr [edi],080h;消息末尾附1
                       
                       
                        ;后64位填充消息长度//转为处理@szBuffer1
                        lea        edi,@szBuffer1
                       
                        mov        eax,_dwFileSize
                        mov        edx,eax
                        shl        eax,3
                        shr        edx,29
                       
                        mov          cl,@dbFileSizeInBuffer
                        inc        cl
                       
                        .if         cl <= 56
                                mov        @dwEndRotateCount,1
                                mov          dword ptr [edi+ 60],edx
                                mov          dword ptr [edi+ 56],eax
                        .else
                                mov        @dwEndRotateCount,2
                                mov  dword ptr [edi+124],edx
                                mov  dword ptr [edi+120],eax
                        .endif
                       
                        mov  edi,_lpFileMem
                       
                        push        067452301h
                        pop        @dwA
                        push        0efcdab89h
                        pop        @dwB
                        push        098badcfeh
                        pop        @dwC
                        push        010325476h
                        pop        @dwD
                       
               
                _Rotate:   
                         
                        .while        @dwRotateCount
                               
                                push        @dwD
                                push        @dwC
                                push        @dwB
                                push        @dwA
                               
                                ;F
                                _ALeftBits = 07
                                _DLeftBits = 12
                                _CLeftBits = 17
                                _BLeftBits = 22
                               
                                _dwA@MD5        _FProc,0,0d76aa478h
                                _dwD@MD5        _FProc,1,0e8c7b756h
                                _dwC@MD5        _FProc,2,0242070dbh
                                _dwB@MD5        _FProc,3,0c1bdceeeh
                               
                                _dwA@MD5        _FProc,4,0f57c0fafh
                                _dwD@MD5        _FProc,5,04787c62ah
                                _dwC@MD5        _FProc,6,0a8304613h
                                _dwB@MD5        _FProc,7,0fd469501h
                               
                                _dwA@MD5        _FProc,8,0698098d8h
                                _dwD@MD5        _FProc,9,08b44f7afh
                                _dwC@MD5        _FProc,10,0ffff5bb1h
                                _dwB@MD5        _FProc,11,0895cd7beh
                               
                                _dwA@MD5        _FProc,12,06b901122h
                                _dwD@MD5        _FProc,13,0fd987193h
                                _dwC@MD5        _FProc,14,0a679438eh
                                _dwB@MD5        _FProc,15,049b40821h
                               
                                ;G
                                _ALeftBits = 05
                                _DLeftBits = 09
                                _CLeftBits = 14
                                _BLeftBits = 20
                               
                                _dwA@MD5        _GProc,1,0f61e2562h
                                _dwD@MD5        _GProc,6,0c040b340h
                                _dwC@MD5        _GProc,11,0265e5a51h
                                _dwB@MD5        _GProc,0,0e9b6c7aah
                               
                               
                                _dwA@MD5        _GProc,05,0d62f105dh
                                _dwD@MD5        _GProc,10,002441453h
                                _dwC@MD5        _GProc,15,0d8a1e681h
                                _dwB@MD5        _GProc,04,0e7d3fbc8h
                               
                                _dwA@MD5        _GProc,09,021e1cde6h
                                _dwD@MD5        _GProc,14,0c33707d6h
                                _dwC@MD5        _GProc,03,0f4d50d87h
                                _dwB@MD5        _GProc,08,0455a14edh
                               
                                _dwA@MD5        _GProc,13,0a9e3e905h
                                _dwD@MD5        _GProc,02,0fcefa3f8h
                                _dwC@MD5        _GProc,07,0676f02d9h
                                _dwB@MD5        _GProc,12,08d2a4c8ah
                               
                                ;H
                                _ALeftBits = 04
                                _DLeftBits = 11
                                _CLeftBits = 16
                                _BLeftBits = 23
                               
                                _dwA@MD5        _HProc,05,0fffa3942h
                                _dwD@MD5        _HProc,08,08771f681h
                                _dwC@MD5        _HProc,11,06d9d6122h
                                _dwB@MD5        _HProc,14,0fde5380ch
                               
                                _dwA@MD5        _HProc,01,0a4beea44h
                                _dwD@MD5        _HProc,04,04bdecfa9h
                                _dwC@MD5        _HProc,07,0f6bb4b60h
                                _dwB@MD5        _HProc,10,0bebfbc70h
                               
                                _dwA@MD5        _HProc,13,0289b7ec6h
                                _dwD@MD5        _HProc,00,0eaa127fah
                                _dwC@MD5        _HProc,03,0d4ef3085h
                                _dwB@MD5        _HProc,06,004881d05h
                               
                                _dwA@MD5        _HProc,09,0d9d4d039h
                                _dwD@MD5        _HProc,12,0e6db99e5h
                                _dwC@MD5        _HProc,15,01fa27cf8h
                                _dwB@MD5        _HProc,02,0c4ac5665h
                               
                               
                                ;I
                                _ALeftBits = 06
                                _DLeftBits = 10
                                _CLeftBits = 15
                                _BLeftBits = 21
                               
                                _dwA@MD5        _IProc,00,0f4292244h
                                _dwD@MD5        _IProc,07,0432aff97h
                                _dwC@MD5        _IProc,14,0ab9423a7h
                                _dwB@MD5        _IProc,05,0fc93a039h
                               
                                _dwA@MD5        _IProc,12,0655b59c3h
                                _dwD@MD5        _IProc,03,08f0ccc92h
                                _dwC@MD5        _IProc,10,0ffeff47dh
                                _dwB@MD5        _IProc,01,085845dd1h
                               
                                _dwA@MD5        _IProc,08,06fa87e4fh
                                _dwD@MD5        _IProc,15,0fe2ce6e0h
                                _dwC@MD5        _IProc,06,0a3014314h
                                _dwB@MD5        _IProc,13,04e0811a1h
                               
                                _dwA@MD5        _IProc,04,0f7537e82h
                                _dwD@MD5        _IProc,11,0bd3af235h
                                _dwC@MD5        _IProc,02,02ad7d2bbh
                                _dwB@MD5        _IProc,09,0eb86d391h
                               
                                pop        eax
                                add        @dwA,eax
                                pop        eax
                                add        @dwB,eax
                                pop        eax
                                add        @dwC,eax
                                pop        eax
                                add        @dwD,eax
                               
                                add          edi,16*sizeof dword
                                dec        @dwRotateCount
                        .endw       
                       
                        .if        @bEndMD5 == TRUE
                                jmp        @f
                        .endif
                       
                        push        @dwEndRotateCount
                        pop        @dwRotateCount
                       
                        lea        edi,@szBuffer1
                        mov        @bEndMD5,TRUE
                        jmp        _Rotate
                @@:       
                ;交换结果的高低位
                       
                        mov        eax,@dwA
                        bswap        eax
                        mov        ebx,@dwB
                        bswap        ebx
                        mov        ecx,@dwC
                        bswap        ecx
                        mov        edx,@dwD
                        bswap        edx
                jmp        @f
                        szMD5Format@_MD5hashProc    db  '%.8x%.8x%.8x%.8x',0
                @@:
                invoke  wsprintf,_lpdwMD5Buffer,addr szMD5Format@_MD5hashProc,eax,ebx,ecx,edx
      ret

_MD5hashProc    endp

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 70
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
第二天

写完后,发现:中间那一堆代码怎么看怎么那么不顺眼呢!!,继续改写,折腾吧就.....
变成了如下样子:
(详细代码看附件)
.const
       
        IDC_BtFileName                equ        1001
        IDC_EditFileName        equ        1002
        IDC_EditMD5                equ        1003
        IDC_BtMD5                equ        1004
        IDC_BtTerminateMD5        equ        1005
       
       
.data
       
        szClassName                db        "Class",0
        szWindowName                db        "MD5加密算法",0
        szEdit                        db        "Edit",0
        szButton                db        "Button",0

        szBtMD5                        db        '开始MD5',0
        szBtTerminateMD5        db        '终止MD5',0
        szBtFileName                db        '文件...',0
       
        szStrFilter                db        "所有文件(*.*)",0,"*.*",0,0
       
        szCurrentFilePath        db        MAX_PATH dup        (?)
        szFileName                  db         MAX_PATH dup (?)
       
        align        dword
       
        dwFLeftMove        db        07,12,17,22
        dwGLeftMove        db        05,09,14,20
        dwHLeftMove        db        04,11,16,23
        dwILeftMove        db        06,10,15,21
       
        dwFOffset        db        00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
        dwGOffset        db        01,06,11,00,05,10,15,04,09,14,03,08,13,02,07,12
        dwHOffset        db        05,08,11,14,01,04,07,10,13,00,03,06,09,12,15,02
        dwIOffset        db        00,07,14,05,12,03,10,01,08,15,06,13,04,11,02,09

        dwFTi                DWORD        0D76AA478H,0E8C7B756H,0242070DBH,0C1BDCEEEH
                        DWORD        0F57C0FAFH,04787C62AH,0A8304613H,0FD469501H
                        DWORD        0698098D8H,08B44F7AFH,0FFFF5BB1H,0895CD7BEH
                        DWORD        06B901122H,0FD987193H,0A679438EH,049B40821H
                       
        dwGTi                DWORD        0F61E2562H,0C040B340H,0265E5A51H,0E9B6C7AAH
                        DWORD        0D62F105DH,002441453H,0D8A1E681H,0E7D3FBC8H
                        DWORD        021E1CDE6H,0C33707D6H,0F4D50D87H,0455A14EDH
                        DWORD        0A9E3E905H,0FCEFA3F8H,0676F02D9H,08D2A4C8AH
                       
        dwHTi                DWORD        0FFFA3942H,08771F681H,06D9D6122H,0FDE5380CH
                        DWORD        0A4BEEA44H,04BDECFA9H,0F6BB4B60H,0BEBFBC70H
                        DWORD        0289B7EC6H,0EAA127FAH,0D4EF3085H,004881D05H
                        DWORD        0D9D4D039H,0E6DB99E5H,01FA27CF8H,0C4AC5665H
                       
        dwITi                DWORD        0F4292244H,0432AFF97H,0AB9423A7H,0FC93A039H
                        DWORD        0655B59C3H,08F0CCC92H,0FFEFF47DH,085845DD1H
                        DWORD        06FA87E4FH,0FE2CE6E0H,0A3014314H,04E0811A1H
                        DWORD        0F7537E82H,0BD3AF235H,02AD7D2BBH,0EB86D391H       

       
.data?

        hMD5Thd                        dd        ?
        hInstance                dd        ?
        hWinMain                dd        ?
       
        hEditMD5                dd        ?
        hBtMD5                        dd        ?
        hBtTerminateMD5                dd        ?

        hBtFileName                dd        ?
        hEditFileName                dd        ?
        lpFileMemHeader                dd        ?
        dwOpenFileSize                dd        ?
       

.code
_OpenFileProc                         proc  uses ebx esi edi        ,_hWnd
        LOCAL        @dwOpenFileSizeHigh
        LOCAL        @szBuffer3[1024]:byte
       
        LOCAL        @stOFN:OPENFILENAME
        LOCAL        @stSA:SECURITY_ATTRIBUTES
       
        LOCAL        @hDC1

        LOCAL        @hFileMap
        LOCAL        @hOpenFile

        LOCAL        @dwTmp
       
        .if        lpFileMemHeader
                invoke        UnmapViewOfFile,lpFileMemHeader
                mov        lpFileMemHeader,0
        .endif
       
        invoke        SetWindowText,hEditFileName,0
        invoke        SetWindowText,hEditMD5,0
        mov        dwOpenFileSize,0
       
        invoke        RtlZeroMemory,addr @stOFN,sizeof @stOFN
        mov        @stOFN.lStructSize,sizeof @stOFN
        lea        eax,szCurrentFilePath
        mov        @stOFN.lpstrFile,eax
        mov        @stOFN.nMaxFile,MAX_PATH
        mov        @stOFN.Flags,OFN_FILEMUSTEXIST OR OFN_PATHMUSTEXIST
                       
        invoke        GetOpenFileName,addr @stOFN       
        .if        !eax
                jmp        _NOPE
        .endif
        invoke        SetWindowText,hEditFileName,addr szCurrentFilePath
       
        invoke        RtlZeroMemory,addr @stSA,sizeof @stSA       
        invoke        CreateFile,addr szCurrentFilePath, GENERIC_READ,FILE_SHARE_DELETE or FILE_SHARE_READ or FILE_SHARE_WRITE,addr @stSA,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL ,0;FILE_FLAG_DELETE_ON_CLOSE or
        .if        eax == INVALID_HANDLE_VALUE
                jmp        _NOPE
        .endif
        mov        @hOpenFile,eax
       
       
        invoke        GetFileSize,@hOpenFile,addr @dwOpenFileSizeHigh
        mov        dwOpenFileSize,eax
        .if        !eax
                invoke        CloseHandle,@hFileMap
                invoke        CloseHandle,@hOpenFile
                jmp        _NOPE
        .endif
       
       
        invoke        CreateFileMapping,@hOpenFile,0,PAGE_READONLY,0,0,0
        .if        !eax
                invoke        CloseHandle,@hOpenFile
                jmp        _NOPE
        .endif
        mov        @hFileMap,eax
       
       
        invoke        MapViewOfFile,@hFileMap, FILE_MAP_READ,0,0,0
        .if        !eax
                invoke        CloseHandle,@hFileMap
                invoke        CloseHandle,@hOpenFile
                jmp        _NOPE
               
        .endif
        mov        lpFileMemHeader,eax
       
        invoke        CloseHandle,@hFileMap
        invoke        CloseHandle,@hOpenFile
       
        _NOPE:       
       
        ret
_OpenFileProc endp

_LeftMov@MD5        macro _dwA,_dwB,x,s,t
        add  eax,_dwA
        add  eax,x
        add  eax,t
        mov  cl,s
        rol  eax,cl
        add  eax,_dwB
endm

; F(x,y,z) = (x and y) or ((not x) and z)
; a =((a + F(b,c,d) + x + t) << s ) + b
_FProc@MD5    macro _dwA,_dwB,_dwC,_dwD,x,s,t
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        and  ebx,eax
        not  eax
        and  eax,ecx
        or  eax,ebx
       
        _LeftMov@MD5        _dwA,_dwB,x,s,t
endm

; G(x,y,z) = (x and z) or (y and (not z))
; a = ((a + G(b,c,d) + x + t) << s) + b
_GProc@MD5     macro _dwA,_dwB,_dwC,_dwD,x,s,t   
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        and  eax,ecx
        not  ecx
        and  ecx,ebx
        or  eax,ecx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm
; H(x,y,z) = x xor y xor z
; a = ((a + H(b,c,d) + x + t) << s) + b
_HProc@MD5      macro _dwA,_dwB,_dwC,_dwD,x,s,t  
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        xor  eax,ebx
        xor  eax,ecx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm
; I(x,y,z) = y xor (x or (not z))
; a = ((a + I(b,c,d) + x + t) << s) + b
_IProc@MD5     macro _dwA,_dwB,_dwC,_dwD,x,s,t
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        not  ecx
        or  eax,ecx
        xor  eax,ebx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm

_dwA@MD5        macro        _Function,_dwBitNumber,_dwTi
       
        _Function&@MD5        @dwA,@dwB,@dwC,@dwD,dword ptr [edi+_dwBitNumber*4],_ALeftBits,_dwTi
        mov  @dwA,eax
endm
_dwB@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwB,@dwC,@dwD,@dwA,dword ptr [edi+_dwBitNumber*4],_BLeftBits,_dwTi
        mov  @dwB,eax
endm
_dwC@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwC,@dwD,@dwA,@dwB,dword ptr [edi+_dwBitNumber*4],_CLeftBits,_dwTi
        mov  @dwC,eax
endm
_dwD@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwD,@dwA,@dwB,@dwC,dword ptr [edi+_dwBitNumber*4],_DLeftBits,_dwTi
        mov  @dwD,eax
endm

_MD5hashProc    proc  uses  edi esi,_lpFileMem,_dwFileSize,_lpdwMD5Buffer
        local          @dwA,@dwB,@dwC,@dwD
        LOCAL        @dwRotateMD5Count
        LOCAL        @dwEndRotateMD5Count
        LOCAL        @szBuffer1[128]:byte
       
        LOCAL        @bEndMD5
        LOCAL        @dbFileSizeInBuffer:byte
                                       
                        xor        al,al
                        lea        edi,@szBuffer1
                        mov        ecx,sizeof @szBuffer1
                        cld
                        rep        stosb
                       
                        mov        @bEndMD5,FALSE
                       
                        ;求得512取模及需要填充的数据
                        mov        eax,_dwFileSize
                        shr        eax,6
                        mov        @dwRotateMD5Count,eax
                       
                        ;模64后末尾字符串复制到缓冲区
                        lea        edi,@szBuffer1
                        mov        esi,_lpFileMem
                        mov          eax,_dwFileSize
                        mov        ecx,eax
                        and        eax,0ffffffc0h;
                        add        esi,eax
       
                        and        ecx,03fh;除以64求模
                        mov        @dbFileSizeInBuffer,cl
                        .if        ecx
                                cld
                                rep        movsb
                        .endif
                        mov  byte ptr [edi],080h;消息末尾附1
                       
                        ;后64位填充消息长度//转为处理@szBuffer1
                        lea        edi,@szBuffer1
                       
                        mov        eax,_dwFileSize;ebx
                        mov        edx,eax
                        shl        eax,3
                        shr        edx,29
                       
                        mov          cl,@dbFileSizeInBuffer;_dwFileSize
                        .if         cl < 56
                                mov        @dwEndRotateMD5Count,1
                                mov          dword ptr [edi+ 60],edx
                                mov          dword ptr [edi+ 56],eax
                        .else
                                mov        @dwEndRotateMD5Count,2
                                mov        dword ptr [edi+124],edx
                                mov          dword ptr [edi+120],eax
                        .endif
                       
                        push        067452301h
                        pop        @dwA
                        push        0efcdab89h
                        pop        @dwB
                        push        098badcfeh
                        pop        @dwC
                        push        010325476h
                        pop        @dwD
                       
                        mov  edi,_lpFileMem
                       
                _Rotate:   
                        mov        ecx, @dwRotateMD5Count
                        .while        ecx
                                push        ecx
                               
                                push        @dwD
                                push        @dwC
                                push        @dwB
                                push        @dwA
                               
                                xor        esi,esi
                                .while        esi < 64
                                        mov          eax,@dwB
                                        mov          ebx,@dwC
                                        mov          ecx,@dwD
                                       
                                        .if        esi < 16;F
                                                and          ebx,eax
                                                not          eax
                                                and          eax,ecx
                                                or          eax,ebx
                                        .elseif esi < 32;G
                                                and          eax,ecx
                                                not          ecx
                                                and          ecx,ebx
                                                or          eax,ecx
                                        .elseif esi < 48;H
                                                xor          eax,ebx
                                                xor          eax,ecx
                                        .else                ;I
                                                not          ecx
                                                or          eax,ecx
                                                xor          eax,ebx
                                        .endif
                               
                                        add        eax,@dwA
                                       
                                        movzx        ecx,byte ptr [offset dwFOffset + esi ]
                                        add          eax,dword ptr [edi+ ecx * sizeof dword];x
                                       
                                        add          eax,dword ptr [offset dwFTi + esi * sizeof dword];t
                                       
                                        mov        ecx,esi       
                                        shr        ecx,2
                                        and        ecx,12
                                        mov        edx,esi       
                                        and        edx,3
                                        mov        cl,byte ptr [offset dwFLeftMove + edx + ecx]
                                        rol          eax,cl
                                        add          eax,@dwB
                                       
                                        xchg        eax,@dwB
                                        xchg        eax,@dwC
                                        xchg        eax,@dwD
                                        xchg        eax,@dwA
                                       
                                        inc        esi
                                .endw       
                               
                                pop        eax
                                add        @dwA,eax
                                pop        eax
                                add        @dwB,eax
                                pop        eax
                                add        @dwC,eax
                                pop        eax
                                add        @dwD,eax
                               
                                add          edi,16*sizeof dword
                                pop        ecx
                                dec        ecx
                        .endw       
                       
                        .if        @bEndMD5 == TRUE
                                jmp        @f
                        .endif
                       
                        push        @dwEndRotateMD5Count
                        pop        @dwRotateMD5Count
                       
                        lea        edi,@szBuffer1
                        mov        @bEndMD5,TRUE
                        jmp        _Rotate
                @@:       
                       
                        mov        eax,@dwA
                        bswap        eax
                        mov        ebx,@dwB
                        bswap        ebx
                        mov        ecx,@dwC
                        bswap        ecx
                        mov        edx,@dwD
                        bswap        edx
                jmp        @f
                        szMD5Format@_MD5hashProc    db  '%.8x%.8x%.8x%.8x',0
                @@:
                invoke  wsprintf,_lpdwMD5Buffer,addr szMD5Format@_MD5hashProc,eax,ebx,ecx,edx
      ret

_MD5hashProc    endp
上传的附件:
2013-3-16 16:36
0
雪    币: 70
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
第三天
再次看了下源码,发现那一堆Ti数据表,怎么看怎么是个累赘,得了,附加段代码,自动生成吧,又变成了下面这样:

(详细代码看附件)

.const
       
        IDC_BtFileName                equ        1001
        IDC_EditFileName        equ        1002
        IDC_EditMD5                equ        1003
        IDC_BtMD5                equ        1004
        IDC_BtTerminateMD5        equ        1005
       
       
.data
       
        szClassName                db        "Class",0
        szWindowName                db        "MD5加密算法",0
        szEdit                        db        "Edit",0
        szButton                db        "Button",0

        szBtMD5                        db        '开始MD5',0
        szBtTerminateMD5        db        '终止MD5',0
        szBtFileName                db        '文件...',0
       
        szStrFilter                db        "所有文件(*.*)",0,"*.*",0,0
       
        szCurrentFilePath        db        MAX_PATH dup        (?)
        szFileName                  db         MAX_PATH dup (?)
       
        align        dword
       
        dwFLeftMove        db        07,12,17,22
        dwGLeftMove        db        05,09,14,20
        dwHLeftMove        db        04,11,16,23
        dwILeftMove        db        06,10,15,21
       
        dwFOffset        db        00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
        dwGOffset        db        01,06,11,00,05,10,15,04,09,14,03,08,13,02,07,12
        dwHOffset        db        05,08,11,14,01,04,07,10,13,00,03,06,09,12,15,02
        dwIOffset        db        00,07,14,05,12,03,10,01,08,15,06,13,04,11,02,09
       
.data?

        hMD5Thd                        dd        ?
        hInstance                dd        ?
        hWinMain                dd        ?
       
        hEditMD5                dd        ?
        hBtMD5                        dd        ?
        hBtTerminateMD5                dd        ?

        hBtFileName                dd        ?
        hEditFileName                dd        ?
        lpFileMemHeader                dd        ?
        dwOpenFileSize                dd        ?
       

.code
_OpenFileProc                         proc  uses ebx esi edi        ,_hWnd
        LOCAL        @dwOpenFileSizeHigh
        LOCAL        @szBuffer3[1024]:byte
       
        LOCAL        @stOFN:OPENFILENAME
        LOCAL        @stSA:SECURITY_ATTRIBUTES
       
        LOCAL        @hDC1

        LOCAL        @hFileMap
        LOCAL        @hOpenFile

        LOCAL        @dwTmp
       
        .if        lpFileMemHeader
                invoke        UnmapViewOfFile,lpFileMemHeader
                mov        lpFileMemHeader,0
        .endif
       
        invoke        SetWindowText,hEditFileName,0
        invoke        SetWindowText,hEditMD5,0
        mov        dwOpenFileSize,0
       
        invoke        RtlZeroMemory,addr @stOFN,sizeof @stOFN
        mov        @stOFN.lStructSize,sizeof @stOFN
        lea        eax,szCurrentFilePath
        mov        @stOFN.lpstrFile,eax
        mov        @stOFN.nMaxFile,MAX_PATH
        mov        @stOFN.Flags,OFN_FILEMUSTEXIST OR OFN_PATHMUSTEXIST
                       
        invoke        GetOpenFileName,addr @stOFN       
        .if        !eax
                jmp        _NOPE
        .endif
        invoke        SetWindowText,hEditFileName,addr szCurrentFilePath
       
        invoke        RtlZeroMemory,addr @stSA,sizeof @stSA       
        invoke        CreateFile,addr szCurrentFilePath, GENERIC_READ,FILE_SHARE_DELETE or FILE_SHARE_READ or FILE_SHARE_WRITE,addr @stSA,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL ,0;FILE_FLAG_DELETE_ON_CLOSE or
        .if        eax == INVALID_HANDLE_VALUE
                jmp        _NOPE
        .endif
        mov        @hOpenFile,eax
       
       
        invoke        GetFileSize,@hOpenFile,addr @dwOpenFileSizeHigh
        mov        dwOpenFileSize,eax
        .if        !eax
                invoke        CloseHandle,@hFileMap
                invoke        CloseHandle,@hOpenFile
                jmp        _NOPE
        .endif
       
       
        invoke        CreateFileMapping,@hOpenFile,0,PAGE_READONLY,0,0,0
        .if        !eax
                invoke        CloseHandle,@hOpenFile
                jmp        _NOPE
        .endif
        mov        @hFileMap,eax
       
       
        invoke        MapViewOfFile,@hFileMap, FILE_MAP_READ,0,0,0
        .if        !eax
                invoke        CloseHandle,@hFileMap
                invoke        CloseHandle,@hOpenFile
                jmp        _NOPE
               
        .endif
        mov        lpFileMemHeader,eax
       
        invoke        CloseHandle,@hFileMap
        invoke        CloseHandle,@hOpenFile
       
        _NOPE:       
       
        ret
_OpenFileProc endp

_LeftMov@MD5        macro _dwA,_dwB,x,s,t
        add  eax,_dwA
        add  eax,x
        add  eax,t
        mov  cl,s
        rol  eax,cl
        add  eax,_dwB
endm

; F(x,y,z) = (x and y) or ((not x) and z)
; a =((a + F(b,c,d) + x + t) << s ) + b
_FProc@MD5    macro _dwA,_dwB,_dwC,_dwD,x,s,t
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        and  ebx,eax
        not  eax
        and  eax,ecx
        or  eax,ebx
       
        _LeftMov@MD5        _dwA,_dwB,x,s,t
endm

; G(x,y,z) = (x and z) or (y and (not z))
; a = ((a + G(b,c,d) + x + t) << s) + b
_GProc@MD5     macro _dwA,_dwB,_dwC,_dwD,x,s,t   
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        and  eax,ecx
        not  ecx
        and  ecx,ebx
        or  eax,ecx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm
; H(x,y,z) = x xor y xor z
; a = ((a + H(b,c,d) + x + t) << s) + b
_HProc@MD5      macro _dwA,_dwB,_dwC,_dwD,x,s,t  
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        xor  eax,ebx
        xor  eax,ecx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm
; I(x,y,z) = y xor (x or (not z))
; a = ((a + I(b,c,d) + x + t) << s) + b
_IProc@MD5     macro _dwA,_dwB,_dwC,_dwD,x,s,t
        mov  eax,_dwB
        mov  ebx,_dwC
        mov  ecx,_dwD
       
        not  ecx
        or  eax,ecx
        xor  eax,ebx
       
        _LeftMov@MD5 _dwA,_dwB,x,s,t
endm

_dwA@MD5        macro        _Function,_dwBitNumber,_dwTi
       
        _Function&@MD5        @dwA,@dwB,@dwC,@dwD,dword ptr [edi+_dwBitNumber*4],_ALeftBits,_dwTi
        mov  @dwA,eax
endm
_dwB@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwB,@dwC,@dwD,@dwA,dword ptr [edi+_dwBitNumber*4],_BLeftBits,_dwTi
        mov  @dwB,eax
endm
_dwC@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwC,@dwD,@dwA,@dwB,dword ptr [edi+_dwBitNumber*4],_CLeftBits,_dwTi
        mov  @dwC,eax
endm
_dwD@MD5        macro        _Function,_dwBitNumber,_dwTi
        _Function&@MD5        @dwD,@dwA,@dwB,@dwC,dword ptr [edi+_dwBitNumber*4],_DLeftBits,_dwTi
        mov  @dwD,eax
endm

_MD5hashProc    proc  uses  edi esi,_lpFileMem,_dwFileSize,_lpszMD5Buffer
        local          @dwA,@dwB,@dwC,@dwD
        LOCAL        @dwRotateMD5Count
        LOCAL        @dwEndRotateMD5Count
        LOCAL        @szBuffer1[128]:byte
       
        LOCAL        @dwFTi[64]:dword
       
        LOCAL        @bEndMD5
        LOCAL        @dbFileSizeInBuffer:byte
       
        LOCAL        @dwTiCount
        LOCAL        @dwTiN0
        LOCAL        @dwTiN1
        LOCAL        @dwTiN2
        LOCAL        @wCW:word
       
        LOCAL        @dwTmp1
        LOCAL        @dwTmp2
                       
                        ;初始化Ti
                       
                        mov        @dwTiCount,1
                        mov        @dwTiN1,10000000h
                        mov        @dwTiN2,10h
                        lea        edi,@dwFTi
                       
                        mov        @wCW,0001011111111111b;设置近似值为剪裁掉尾数状态
                        wait
                        fldcw        @wCW
                @@:       
                        fild        @dwTiCount
                        fsin       
                        fabs
                       
                        fild        @dwTiN1
                        fmul
                       
                        fist         @dwTmp1
                        fild        @dwTmp1
                        fsub
                       
                        fild        @dwTiN2
                        fmul
                        fistp         @dwTmp2
                        fwait
                       
                        mov        eax,@dwTmp1
                        shl        eax,4
                        add        eax,@dwTmp2
                        mov        dword ptr [edi],eax
                         
                        inc        @dwTiCount
                        add        edi,sizeof dword
                       
                        cmp        @dwTiCount,65
                        jz        @f
                        jmp        @b       
                @@:               
                                       
                        xor        al,al
                        lea        edi,@szBuffer1
                        mov        ecx,sizeof @szBuffer1
                        cld
                        rep        stosb
                       
                        mov        @bEndMD5,FALSE
                       
                        ;求得512取模及需要填充的数据
                        mov        eax,_dwFileSize
                        shr        eax,6
                        mov        @dwRotateMD5Count,eax
                       
                        ;模64后末尾字符串复制到缓冲区
                        lea        edi,@szBuffer1
                        mov        esi,_lpFileMem
                        mov          eax,_dwFileSize
                        mov        ecx,eax
                        and        eax,0ffffffc0h;
                        add        esi,eax
       
                        and        ecx,03fh;除以64求模
                        mov        @dbFileSizeInBuffer,cl
                        .if        ecx
                                cld
                                rep        movsb
                        .endif
                        mov  byte ptr [edi],080h;消息末尾附1
                       
                        ;后64位填充消息长度//转为处理@szBuffer1
                        lea        edi,@szBuffer1
                       
                        mov        eax,_dwFileSize;ebx
                        mov        edx,eax
                        shl        eax,3
                        shr        edx,29
                       
                        mov          cl,@dbFileSizeInBuffer;_dwFileSize
                        .if         cl < 56
                                mov        @dwEndRotateMD5Count,1
                                mov          dword ptr [edi+ 60],edx
                                mov          dword ptr [edi+ 56],eax
                        .else
                                mov        @dwEndRotateMD5Count,2
                                mov        dword ptr [edi+124],edx
                                mov          dword ptr [edi+120],eax
                        .endif
                       
                        push        067452301h
                        pop        @dwA
                        push        0efcdab89h
                        pop        @dwB
                        push        098badcfeh
                        pop        @dwC
                        push        010325476h
                        pop        @dwD
                       
                        mov  edi,_lpFileMem
                       
                _Rotate:   
                        mov        ecx, @dwRotateMD5Count
                        .while        ecx
                                push        ecx
                               
                                push        @dwD
                                push        @dwC
                                push        @dwB
                                push        @dwA
                               
                                xor        esi,esi
                                .while        esi < 64
                                        mov          eax,@dwB
                                        mov          ebx,@dwC
                                        mov          ecx,@dwD
                                       
                                        .if        esi < 16;F
                                                and          ebx,eax
                                                not          eax
                                                and          eax,ecx
                                                or          eax,ebx
                                        .elseif esi < 32;G
                                                and          eax,ecx
                                                not          ecx
                                                and          ecx,ebx
                                                or          eax,ecx
                                        .elseif esi < 48;H
                                                xor          eax,ebx
                                                xor          eax,ecx
                                        .else                ;I
                                                not          ecx
                                                or          eax,ecx
                                                xor          eax,ebx
                                        .endif
                               
                                        add        eax,@dwA
                                       
                                        movzx        ecx,byte ptr [offset dwFOffset + esi ]
                                        add          eax,dword ptr [edi+ ecx * sizeof dword];x
                                        lea        ecx,@dwFTi
                                        add          eax,dword ptr [ecx  + esi * sizeof dword];t
                                       
                                        mov        ecx,esi       
                                        shr        ecx,2
                                        and        ecx,12
                                        mov        edx,esi       
                                        and        edx,3
                                        mov        cl,byte ptr [offset dwFLeftMove + edx + ecx]
                                        rol          eax,cl
                                        add          eax,@dwB
                                       
                                        xchg        eax,@dwB
                                        xchg        eax,@dwC
                                        xchg        eax,@dwD
                                        xchg        eax,@dwA
                                       
                                        inc        esi
                                .endw       
                               
                                pop        eax
                                add        @dwA,eax
                                pop        eax
                                add        @dwB,eax
                                pop        eax
                                add        @dwC,eax
                                pop        eax
                                add        @dwD,eax
                               
                                add          edi,16*sizeof dword
                                pop        ecx
                                dec        ecx
                        .endw       
                       
                        .if        @bEndMD5 == TRUE
                                jmp        @f
                        .endif
                       
                        push        @dwEndRotateMD5Count
                        pop        @dwRotateMD5Count
                       
                        lea        edi,@szBuffer1
                        mov        @bEndMD5,TRUE
                        jmp        _Rotate
                @@:       
                       
                        mov        eax,@dwA
                        bswap        eax
                        mov        ebx,@dwB
                        bswap        ebx
                        mov        ecx,@dwC
                        bswap        ecx
                        mov        edx,@dwD
                        bswap        edx
                       
                jmp        @f
                        szMD5Format@_MD5hashProc    db  '%.8x%.8x%.8x%.8x',0
                @@:
                invoke  wsprintf,_lpszMD5Buffer,addr szMD5Format@_MD5hashProc,eax,ebx,ecx,edx
        ret
_MD5hashProc    endp
上传的附件:
2013-3-16 16:38
0
雪    币: 70
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
第四天
再次回头观察源码,痛苦的发现,怎么越折腾效率越低了呢,矛和盾怎么就不能协调呢,鱼和熊掌怎么就不能兼得呢,还有一点就...看雪论坛网页打开就这么费劲呢?

于是,我做出了最大的决定........不折腾了!!!!!

第五天
见下面链接
http://bbs.pediy.com/showthread.php?t=165869
2013-3-16 16:42
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个先占个沙发,广告位出租
2013-3-16 17:59
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
发完了才看到,沙发板凳啥的早就没了
2013-3-16 18:00
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
顶一个。留个位置。以后有机会看得懂
2013-3-16 18:28
0
雪    币: 326
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
final decision
“不折腾了!!!!! ”

干嘛不折腾了,生命在于折腾嘛。
2013-3-16 19:50
0
游客
登录 | 注册 方可回帖
返回
//