Проверка соответствия двоичного пароля MASM - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь создать программу, которая получает входной пароль и проверяет, совпадает он или нет. Но я не могу найти способ сопоставить переменную 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
...