Я пытаюсь создать программу, которая получает входной пароль и проверяет, совпадает он или нет. Но я не могу найти способ сопоставить переменную key
с pTxt
, которую я получаю из ввода. Прямо сейчас я пытаюсь сделать это только со строками, без двоичных файлов, но я совершенно не понимаю, как сопоставить эти две переменные, независимо от того, что я делаю, пароль всегда «неправильный». Я попытался отладить его, напечатав переменные в .txt файл: pTxt
просто выводит именно то, что я дал на входе, но я не смог найти способ для переменной key
просто написать pass
буквы в этом файле, это всегда странные цифры. Также, если кто-то может показать простой способ преобразования обеих переменных в двоичный код перед сравнением, это также было бы неплохо.
Вот код, но в программе также есть несколько файлов ресурсов для диалога windows, поэтому Я просто прикрепляю файл .asm .
include \masm32\include\masm32rt.inc ; main system include file
.686p
.MMX
.XMM
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD ; main dialog prototype
TxtProc PROTO :DWORD,:DWORD,:DWORD,:DWORD ; text dialog prototype
; --------------------
; GLOBAL scope handles
; --------------------
.data
key dd 'pass',0
.data?
hInstance dd ?
hWnd dd ?
hGroup dd ?
hButn1 dd ?
hButn2 dd ?
; ----------------
; text dlg handles
; ----------------
dlgEd dd ?
butn1 dd ?
butn2 dd ?
.code
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
start:
mov hInstance, rv(GetModuleHandle, NULL)
invoke DialogBoxParam,hInstance,100,0,ADDR DlgProc,0
invoke ExitProcess,eax
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DlgProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL pTxt :DWORD
LOCAL buffer[260]:BYTE
switch uMsg
case WM_INITDIALOG
m2m hWnd, hWin ; Copy hWin to GLOBAL variable
invoke SendMessage,hWin,WM_SETICON,1, \
rv(LoadIcon,hInstance,500)
; -------------------------------------------
; Get the handle for each main dialog control
; -------------------------------------------
mov hGroup, rv(GetDlgItem,hWin,101)
mov hButn1, rv(GetDlgItem,hWin,102)
mov hButn2, rv(GetDlgItem,hWin,103)
xor eax, eax
ret
case WM_COMMAND
switch wParam
case 102
; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lea eax, buffer ; load buffer address
mov pTxt, eax ; cast it to a pointer
invoke DialogBoxParam,hInstance,200,0,ADDR TxtProc,pTxt ; pass pointer to text dialog
; ----------------------------------------------------
; result if not cancelled is in buffer at pTxt address
; ----------------------------------------------------
invoke lstrcmp, addr pTxt, key
.if eax == 0
fn MessageBox,hWin,pTxt,"Result",MB_OK
.else
fn MessageBox,hWin,"Wrong password!","Result",MB_OK
.endif
; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case 103
jmp exit_dialog ; the Close button
endsw
case WM_CLOSE
exit_dialog: ; exit from this label
invoke EndDialog,hWin,0
endsw
xor eax, eax ; zero eax on exit
ret
DlgProc endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
TxtProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
switch uMsg
case WM_INITDIALOG
; -------------------------------------------
; Get the handle for each text dialog control
; -------------------------------------------
mov dlgEd, rv(GetDlgItem,hWin,201)
mov butn1, rv(GetDlgItem,hWin,202)
mov butn2, rv(GetDlgItem,hWin,203)
.data?
pbuf@@@@ dd ? ; decorate to prevent accidental duplicates
.code
mov eax, lParam ; lParam is the passed memory pointer
mov pbuf@@@@, eax ; store address passed in lParam
case WM_COMMAND
switch wParam
case 202
mov eax, pbuf@@@@
mov BYTE PTR [eax], 0 ; zero the buffer first
invoke GetWindowText,dlgEd,pbuf@@@@,260 ; get any text in edit control
mov eax, pbuf@@@@ ; load buffer address again
.if BYTE PTR [eax] == 0 ; test if its an empty string
fn MessageBox,hWin,"No password has been entered", \
"Result",MB_OK ; show error and don't exit
.else
jmp bye ; normal exit with buffer address
.endif
case 203
invoke EndDialog,hWin,0 ; return 0 on cancel
endsw
case WM_CLOSE
bye: ; exit from this label
invoke EndDialog,hWin,pbuf@@@@ ; return the buffer address
endsw
xor eax, eax ; zero eax on exit
ret
TxtProc endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end start