
网上有些MD5_CTX结构的定义应该是有问题的.
/* Data structure for MD5 (Message-Digest) computation */
typedef struct {
ULONG i[2]; /* number of _bits_ handled mod 2^64 */
ULONG buf[4]; /* scratch buffer */
unsigned char in[64]; /* input buffer */
unsigned char digest[16]; /* actual digest after MD5Final call */
} MD5_CTX;
有些又是:
typedef struct {
UINT4 state[4];
UINT4 count[2];
unsigned char buffer[64];
} MD5_CTX;
;md5 hash calc
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\shell32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\advapi32.lib
WndProc proto :DWORD, :DWORD, :DWORD, :DWORD
.const
IDI_SM equ 1 ;图标
IDC_EDIT_TEXT equ 1001
IDC_EDIT_128 equ 1002
IDC_EDIT_CHG equ 1003
IDC_BUTTON_OK equ 1004
IDC_OUTTYPE equ 1005
IDC_OUTTYPE2 equ 1006
RGB MACRO red, green, blue
xor eax, eax
mov al, blue ; blue
rol eax, 8
mov al, green ; green
rol eax, 8
mov al, red ; red
ENDM
MD5_CTX struct
state dd 2 dup (?)
count dd 4 dup (?)
digest dw 16 dup (?)
buffer dw 64 dup (?)
MD5_CTX ends
.data
szDlgName db "md5hash_dialog", 0
hInstance dd ?
advdll db "advapi32.dll",0
md5init db 'MD5Init',0
md5update db 'MD5Update',0
md5final db 'MD5Final',0
format db '%02X',0
format2 db '%02x',0
outtype dd 1
.data?
string db 256 dup(?)
contex MD5_CTX <>
buffer db 64 dup (?)
tempbuffer db 64 dup (?)
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke DialogBoxParam, hInstance, offset szDlgName, 0, WndProc, 0
invoke ExitProcess, eax
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local hBrush :dword
local rect:RECT
local LogBrush:LOGBRUSH
.if uMsg == WM_CLOSE
invoke EndDialog, hWnd, 0
.elseif uMsg == WM_INITDIALOG
invoke LoadIcon, hInstance, IDI_SM
invoke SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax
invoke CheckDlgButton,hWnd,IDC_OUTTYPE,BST_CHECKED ;默认大写方式输出HASH
.elseif uMsg == WM_CTLCOLORSTATIC
RGB 180,100,100
invoke SetBkColor,wParam,eax
invoke GetStockObject,HOLLOW_BRUSH
ret
.elseif uMsg == WM_ERASEBKGND
mov LogBrush.lbStyle,BS_SOLID
RGB 180,100,100
mov LogBrush.lbColor,eax
invoke CreateBrushIndirect,addr LogBrush
mov hBrush,eax
invoke GetClientRect,hWnd,addr rect
invoke FillRect,wParam,addr rect,hBrush
mov eax,TRUE
ret
.elseif uMsg == WM_COMMAND
mov eax, wParam
mov edx, eax
shr edx, 16
movzx eax, ax
.if edx == BN_CLICKED ;处理按键消息
.if eax == IDC_BUTTON_OK ;生成
invoke GetDlgItemText, hWnd, IDC_EDIT_TEXT, offset string,255
invoke LoadLibrary,offset advdll
mov edi,eax
invoke GetProcAddress,edi,offset md5init
mov esi,eax
push offset contex
call esi
invoke GetProcAddress,edi,offset md5update
mov esi,eax
invoke lstrlen,offset string
push eax
push offset string
push offset contex
call esi
invoke GetProcAddress,edi,offset md5final
mov esi,eax
push offset contex
call esi
mov esi,offset contex
add esi,88d
xor ebx,ebx
.while ebx<16
xor eax,eax
movzx ax,byte ptr [esi]
.if uttype == 1
invoke wsprintf,offset buffer,offset format,ax ;大写
.else
invoke wsprintf,offset buffer,offset format2,ax ;小写
.endif
invoke lstrcat,offset tempbuffer,offset buffer
inc esi
inc ebx
.endw
invoke SetDlgItemText, hWnd, IDC_EDIT_128, offset tempbuffer
mov esi,offset tempbuffer
add esi,8
mov edi,esi
add edi,16
xor eax,eax
mov [edi],eax
invoke SetDlgItemText, hWnd, IDC_EDIT_CHG,esi
invoke RtlZeroMemory,offset tempbuffer,64
.elseif eax == IDC_OUTTYPE
mov outtype,1
.elseif eax == IDC_OUTTYPE2
mov outtype,0
.endif
.endif ;end of bn_clicked
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret
WndProc endp
end start