بررسی شماره سریال هارددیسک در زبان اسمبلی

the_king

مدیرکل انجمن
برنامه زیر با فشار دادن کلید D در صفحه کلید یک درایو همانند :C یا :F و غیره را دریافت می کند.
سپس با فشار دادن کلید S، شماره سریال آن درایو را در یک فایل ASMLOCK.DAT ذخیره می کند.
در انتها با فشار دادن کلید C، شماره سریال موجود در فایل را با شماره سریال درایو مقایسه کرده
و پس از اعلام آن دو سریال، مطابقت و یا عدم مطابقت شماره ها را اعلام می کند.
این برنامه می تواند زیربنای یک قفل نرم افزاری باشد.

کد:
CommandLineLength       EQU 80h
CommandLine             EQU 81h
        Key_ESC     EQU 27
        Key_C       EQU 'C'
        Key_D       EQU 'D'
        Key_S       EQU 'S'
        Key_A       EQU 'A'
        Key_Z       EQU 'Z'
.MODEL  TINY
.386
.CODE
.STARTUP
        mov     ah,19h
        int     21h
        add     al,'A'
        mov     Drive,al
        mov     cl,byte ptr cs:[CommandLineLength]
        xor     ch,ch
        cmp     cx,3
        jb      NoCommand
        mov     dx,cx
        mov     di,CommandLine
        mov     al,":"
        cld
        repne   scasb
        jne     NoDrive
        mov     al,[di-2]
        Call    ToUpcase
        cmp     al,'A'
        jb      Err5
        cmp     al,'Z'
        ja      Err5
        mov     Drive,al
        mov     TargetDrive,al
        mov     ah,9
        mov     dx,offset DriveMsg
        int     21h
NoDrive:
        mov     di,81h
        mov     al,"/"
        mov     cx,dx
        repne   scasb
        jne     NoSwitch
        mov     al,[di]
        call    ToUpcase
        cmp     al,'C'
        je      AutoCheck
        cmp     al,'S'
        je      AutoSave
        cmp     al,'?'
        je      Err5
NoSwitch:
        jmp     Start
AutoSave:
        mov     ax,6900h
        mov     bl,Drive
        sub     bl,'A'
        inc     bl
        mov     dx,offset Buffer
        int     21h
        jc      Err1
        mov     ax,3D01h
        mov     dx,offset Filename
        int     21h
        jnc     FileOpened2
        mov     ah,3Ch
        xor     cx,cx
        mov     dx,offset Filename
        int     21h
        jc      Err2
FileOpened2:
        mov     bx,ax
        mov     ah,40h
        mov     cx,4
        mov     dx,offset SerialNumber
        int     21h
        jc      Err3
        mov     ah,3Eh
        int     21h
        mov     ah,9
        mov     dx,offset SaveMsg
        int     21h
        .EXIT   0

AutoCheck:
        mov     ax,6900h
        mov     bl,Drive
        sub     bl,'A'
        inc     bl
        mov     dx,offset Buffer
        int     21h
        jc      Err1       
        mov     ax,3D00h
        mov     dx,offset Filename
        int     21h
        jc      Err2
        mov     bx,ax
        mov     ah,3Fh
        mov     cx,4
        mov     dx,offset SavedSerialNumber
        int     21h
        jc      Err4
        mov     ah,3Eh
        int     21h
        mov     eax,SerialNumber
        cmp     eax,SavedSerialNumber
        jne     StateBad2
        mov     ah,9
        mov     dx,offset OKMsg
        int     21h
        .EXIT   0

StateBad2:
        mov     ah,9
        mov     dx,offset BadMsg
        int     21h
        .EXIT   1

Err5:
        mov     ah,9
        mov     dx,offset ErrMsg4
        int     21h
        .EXIT   1

NoCommand:
        jmp     Start
DriveMsg                db "Target Drive : "
TargetDrive             db 0
                        db 13,10,"$"
ErrMsg4                 db "AsmLock Syntax :",13,10
                        db "Asmlock [disk:] [/C|/S]",13,10
                        db "disk       Select target Disk (C:,D: .etc)",13,10
                        db "/C         Check Disk Serial Number",13,10
                        db "/S         Save Disk Serial Number",13,10,"$"
Start:
        call    CLS
NoCLS:
        mov     ah,9
        mov     dx,offset MainMsg
        int     21h      
ReadKey:
        mov     ah,8
        int     21h
        call    ToUpCase
        cmp     al,Key_ESC
        je      Press_ESC
        cmp     al,Key_D
        je      Press_D
        cmp     al,Key_C
        je      Press_C
        cmp     al,Key_S
        je      Press_S
        jmp     ReadKey

Press_ESC:
        .EXIT   0

        lnext:
Press_D:
        call    CLS
        mov     ah,9
        mov     dx,offset SelectMsg
        int     21h
ReadLetter:
        mov     ah,8
        int     21h
        call    ToUpCase
        cmp     al,Key_ESC
        je      Start
        cmp     al,Key_A
        jb      ReadLetter
        cmp     al,Key_Z
        ja      ReadLetter
        mov     Drive,al
        jmp     Start

Press_S:
        mov     ax,6900h
        mov     bl,Drive
        sub     bl,'A'
        inc     bl
        mov     dx,offset Buffer
        int     21h
        jc      Err1
        mov     ax,3D01h
        mov     dx,offset Filename
        int     21h
        jnc     FileOpened
        mov     ah,3Ch
        xor     cx,cx
        mov     dx,offset Filename
        int     21h
        jc      Err2
FileOpened:
        mov     bx,ax
        mov     ah,40h
        mov     cx,4
        mov     dx,offset SerialNumber
        int     21h
        jc      Err3
        mov     ah,3Eh
        int     21h
        call    CLS
        mov     ah,9
        mov     dx,offset SaveMsg
        int     21h
        jmp     NoCls
Press_C:
        call    CLS
        mov     ax,6900h
        mov     bl,Drive
        sub     bl,'A'
        inc     bl
        mov     dx,offset Buffer
        int     21h
        jc      Err1       
        mov     ax,3D00h
        mov     dx,offset Filename
        int     21h
        jc      Err2
        mov     bx,ax
        mov     ah,3Fh
        mov     cx,4
        mov     dx,offset SavedSerialNumber
        int     21h
        jc      Err4
        mov     ah,3Eh
        int     21h
        mov     ah,9
        mov     dx,offset CheckMsg1
        int     21h
        mov     esi,offset SerialNumber
        call    ShowSerialNumber
        mov     ah,9
        mov     dx,offset CheckMsg2
        int     21h
        mov     si,offset SavedSerialNumber
        call    ShowSerialNumber
        mov     eax,SerialNumber
        cmp     eax,SavedSerialNumber
        jne     StateBad
        mov     ah,9
        mov     dx,offset OKMsg
        int     21h
        jmp     NoCLS
StateBad:
        mov     ah,9
        mov     dx,offset BadMsg
        int     21h
        jmp     NoCLS
Err1:
        mov     ah,9
        mov     dx,offset ErrMsg1
        int     21h
        .EXIT   1

Err2:
        mov     ah,9
        mov     dx,offset ErrMsg2
        int     21h
        .EXIT   1

Err3:
        mov     ah,3Eh
        int     21h
        mov     ah,9
        mov     dx,offset ErrMsg3
        int     21h
        .EXIT   1

Err4:
        mov     ah,3Eh
        int     21h
        mov     ah,9
        mov     dx,offset ErrMsg2
        int     21h
        .EXIT   1

CLS:
        mov     ah,8
        int     10h
        mov     bh,ah
        xor     cx,cx
        mov     dx,324Fh
        mov     ax,0600h
        int     10h
        xor     bh,bh
        xor     dx,dx
        mov     ah,2
        int     10h
        ret

ToUpCase:
        cmp     al,'a'
        jb      UpCase
        cmp     al,'z'
        ja      UpCase
        sub     al,32
UpCase:
        ret

ShowSerialNumber:
        cld
        mov     cx,4
ReadByte:
        lodsb
        mov     dl,al
        shr     dl,4
        call    Check4Bit
        mov     dl,al
        and     dl,0Fh
        call    Check4Bit
        loop    ReadByte
        mov     ah,9
        mov     dx,offset NewLine
        int     21h
        ret
Check4Bit:
        add     dl,'0'
        cmp     dl,'9'
        jna     ShowChar
        add     dl,7
ShowChar:
        push    ax
        mov     ah,2
        int     21h
        pop     ax
        ret


SelectMsg               db "Press Disk letter [ESC = Abort] : $"
CheckMsg1               db "Current Disk Serial Number : $"
CheckMsg2               db "Saved Disk Serial Number   : $"
OKMsg                   db "Lock State : OK",13,10,"$"
BadMsg                  db "Lock State : Bad",13,10,"$"
SaveMsg                 db "Disk Serial Number saved.",13,10,"$"
NewLine                 db 13,10,"$"
MainMsg                 db "Press one of this keys :",13,10,10
                        db "   [D]   Select Disk ("
Drive                   db 0
                        db ":)",13,10
                        db "   [S]   Save Disk Serial Number",13,10
                        db "   [C]   Check Disk Serial Number",13,10,10
                        db "  [ESC]  Exit",13,10,"$"
Filename                db "asmlock.dat",0
ErrMsg1                 db "ERROR : Getting Disk Serial Number failed.",13,10,"$"
ErrMsg2                 db "ERROR : File access denied.",13,10,"$"
ErrMsg3                 db "ERROR : ReadOnly File.",13,10,"$"
SavedSerialNumber       dd 0
Buffer:
InfoLevel       dw 0
SerialNumber    dd 0
Volume          db 11 dup(0)
FATMode         db 8 dup(0)
END

کد کامل برنامه به همراه فایل اجرایی com ضمیمه این پست می باشد.
 

پیوست ها

  • ASMLOCK.zip
    3 کیلوبایت · بازدیدها: 21

جدیدترین ارسال ها

بالا