Xác lập mật khẩu cho chương trình dạng tệp có đuôi .COM
Trang 1Lời nói đầu
Ngày nay công nghiệp máy tính đã trở thành mũi nhọn khi bớc vào kỷnguyên kỹ thuật hiện đại.Với tốc độ tăng trởng đáng kể những sản phẩm liênquan đến máy tính từ phần mềm tới các thiết bị ghép nối.Việt Nam cũng đanggóp phần vào sự phát triển của công nghệ máy tính, chuyển mình dần từ thị tr-ờng tiêu thụ các sản phẩm máy tính thành nơi phát triển công nghệ Bên cạnhđó công nghệ phần mềm của Việt Nam có nhiều bớc tiến triển góp phần thúcđẩy sự phát triển của nền công ngiệp máy tính nói riêng và nền kinh tế nóiriêng
Đã có rất nhiều ngôn ngữ lập trình đợc sử dụng để tạo nên sự phát triểncủa nền công nghệ phần mềm Một trong những ngôn ngữ lập trình xuất hiệnsớm nhất đó là ngôn ngữ lập trình Assembler Đây là một trong những ngônngữ lập trình bậc thấp thờng đợc sử dụng để lập trình hệ thống, nó có một uđiểm mà không một ngôn ngữ lập trình nào bì kịp, bởi lẽ nó tạo ra những ch-ơng trình có dung lợng rất nhỏ, nó thờng đợc sử dụng để làm các chch-ơng trìnhquản lý trong công nghiệp ,diệt vius, tạo vius, tạo hệ điều hành, tạo mậtkhẩu…
Hiện nay hầu hết các chơng trình khi viết xong đều đợc xác lập mật khẩuđể bảo mật dữ liệu
Trong thời gian học tập tại khoá học 1996 – 2001 của tr 2001 của trờng Đại họcMở Hà Nội tôi đã đợc đào tạo một cách có hệ thống và tiếp thu những kiếnthức về ngôn ngữ Assembler Để kết thúc khoá học tôi đợc nhận và hoàn thànhđề tài Xác lập mật khẩu cho ch“Xác lập mật khẩu cho ch ơng trình dạng tệp có đuôi COM ”.
Mục tiêu của chơng trình:
-Trớc tiên chạy chơng trình xác lập mật khẩu với những yêu cầu nhậptên tệp thực hiện dạng COM
-Sau đó nhập mật khẩu; Sau khi tệp COM đã xác lập mật khẩu thì từđó trở đi chơng trình chỉ đợc chạy khi vào đúng mật khẩu đã xác lập
Chơng I
Cơ sở lý thuyết
Trang 2Các file COM đợc lu trên đĩa là hình ảnh chính xác của nội dung bộ nhớ sau khi các file này đợc nạp Sau khi đợc nạp, các file COM khong cần thêm một thông tin nào nữa và có thể chạy ngay, do vậy, các chơng trình COM có thể đợc nạp và khởi động nhanh hơn so với cá chơng trình EXE Ngay sau khi chơng trình COM đợc nạp vào bộ nhớ, ngay dới PSP, nó đợc thực hiện bắt đầu từ ô nhớ sát ô nhớ cuối cùng của PSP, nghĩa là từ địa chỉ offset 100h Ô nhớ này thờng chứa một lệnh nhảy, lệnh này nhảy đến phần đầu thực của chơng trình.
Một chơng trình COM không thể vợt quá 64KB(65536 byte), tính cả độ dài của PSP (256 byte) và ít nhất 1từ (2 byte) cho ngăn xếp Độ dài một chơng trình COMkhông vợt quá 64 KB, nhng DOS vẫn dành cả bộ nhớ cho trơng trình loại này Nó không để lại một phần nhớ tự do nào (dới quan điểm của DOS), và chơng trình COM không thể gọi một chơng trình khác thông qua hàm EXEC Vấn đề này có thể giải quyết đợc, nếu chơng trình COM thông qua một hàm của DOS giải phóng bộ nhớ mà nó không dùng đến.
Khi điều khiển đợc truyền cho chơng trình COM, các thanh ghi đoạn đều hớng tới đầu của PSP Đầu của chơng trình COM (so với đầu của PSP) luôn đợc đặt ở địa chỉ 100h Con trỏ ngăn xếp nhận giá trị FFFEh và nó hớng tới đoạn cuối của đoạn 64KB mà chơng trình COM chiếm, ngăn xếp tiến lại gần cuối chơng trình cứ 2 byte một, ngời lập trình cần đảm bảo làm sao cho ngăn xếp không lớn đến mức đụng vào phần cuôí chơng trình
Tồn tại nhiều khả năng để kết thúc một chơng trình COM và để trả điều khiển về cho DOS hay chơng trình gọi.
Nếu chơng trình chạy dới DOS 1.0, nó có thể kết thúc bằng cách gọi hàm 00h của ngắt 21h hoặc gọi ngắt 20h Một khả năng khác , thoạt đầu có vẻ lạ, là kết thúc chơng trình bằng một “Xác lập mật khẩu cho chNear Return” (lệnh assembler RET) Khi lệnh này đợc thực hiện, chơng trình đợc tiếp tục từ địa chỉ offset đặt trong 2byte ở đỉnh ngăn xếp Mà hàm EXEC lại đặt giá trị 0 vào 2byte này trớc khi trao điều khiển cho chơng trình COM Nh vậy, chơng trình đợc tiếp tục thực hiện tại địa chỉ CS:0000 Vì địa chỉ này chính là đỉnh PSP, nó chứa lời gọi ngắt 20h, nên chơng trình sẽ đợc kết thúc bằng ngắt 20h.
Đối với các thế hệ sau của DOS, hàm 4Ch của ngắt 21h tờng dùng để kết thúc chơng trình Nó kết thúc chơng trình và gọi một chơng trình thông báo, chơng trình thông báo này cho kết quả dới dạng một giá trị số DOS không đặt ở đây một giá trị cố định nào, nhng việc truyền giá trị chỉ có ý nghĩa nếu chơng trình đợc goi và chơng trình gọi đều gán cho giá trị đó một ý
Trang 3nghĩa nh nhau Thí dụ, một khả năng hay đợc dùng là thông báo cho chơng trình gọi, thông qua giá trị 0, rằng chơng trình đợc gọi kết thúc bình thờng, trong khi mọi giá trị khác thông báo sự xuất hiện lỗi trong khi thực hiện chơng trình đợc gọi Một ngời lập trình ngôn ngữ bậc cao không cần phải quan tâm đến việc xây dựng một chơng trình COM, vì trình biên dịch (compiler) sẽ làm thay mọi công việc cần thiết Ngợc lại, một ngời lập trình Assembler phải quan tâm đến nhiều vấn đè khi xây dựng một chơng trình COM.
Chơng trình COM đợc lu dới dạng phản ánh chính xác nội dung bộ nhớ RAM sau khi dã đợc nạp DOS không nạp chơng trình này vào một địa chỉ xác định trớc Chúng có thể đợc nạp vào một địa chỉ bất kỳ(là bội nguyên của 16) Do vậy, các chơng trình COM không nhất thiết phải chứa địa chỉ đoạn rõ ràng Nếu địa chỉ offset luôn dựa vào đoạn hiện thời và nó chỉ một địa chỉ bất kỳ trong đoạn đó, thì vấn đề lại không phải nh vậy đối với các địa chỉ đoạn, vì các địa chỉ này xác định các đoạn cố định cách nhau 16 byte.
Kích thớc một chơng trình COM bị hạn chế là 64KB nên ngời lập trình bị giới hạn chỉ đợc dùng các lệnh NEAR, các lệnh này chỉ thay đổi địa chỉ offset của con trỏ lệnh Các lệnh FAR không đợc phép dùng trong chơng trình bởi vì tất cả các lệnh FAR cho phép tiếp tục chơng trình ở một chỗ khác của chơng trình bằng cách xác định lại không chỉ địa chỉ offset mà cả địa chỉ đoạn của con trỏ lệnh (CS:IP) Do đó các giá trị không đổi có thể đợc nạp vào một thanh ghi , thí dụ nh địa chỉ đoạn của RAM màn hình.Nhng không thể nạp một địa chỉ đoạn của các lệnh hay dữ liệu của chơng trình COM vào một thanh ghi đoạn Bởi lẽ các địa chỉ này thay đổi mỗi khi chơng trình đợc gọi chạy Một chơng trình COM không đợc chứa nhiều đoạn và các biến phải nằm trong một đoạn duy nhất-đoạn mã lệnh Vì chỉ có một đoạn, nên DOS có thể nạp chơng trình vào các vị trí khác nhau, tuỳ theo tình trạng của RAM còn tự do Các tr-ơng trình COM không gặp khó khăn gì khi định nghĩa ngăn xếp Nó đợc đặt tự động vào cuối đoạn COM 64KB.
Khi gọi một chơng trình COM, DOS dành cho chơng trình này toàn bộ RAM còn tự do, đa số chơng trình sẽ mất đi khỏi bộ nhớ sau khi kết thúc và bộ nhớ mà nó chiếm sẽ đợc giải phóng Nhng nếu một chơng trình COM đợc chuyển thành nội trú, có nghĩa là nó sẽ tồn tại trong bộ nhớ sau khi thực hiện, thì một số vấn đề sẽ xuất hiện, vì dới quan điểm của DOS, không còn bộ nhớ tự do không thể nạp và thực hiện một chơng trình khác.
Vấn đề cũng sẽ xuất hiện, khi chơng trình COM trong qua trình thực hiện yêu cầu nạp và thực hiện một chơng trình khác thông qua hàm EXEC Điều
Trang 4này cũng không thực hiện đợc, bởi vì DOS cho rằng không còn bộ nhớ tự do để nhận chơng trình đợc gọi Tuy nhiên , hai trờng hợp trên có thể đợc giải quyết bằng cách giải phóng vùng nhớ mà chơng trình không dùng đến.
Có hai khả năng để thực hiện điều này: hoặc là chỉ giải phóng phần bộ nhớ nằm ngoài đoạn COM 64 KB, hoặc giải phóng tất cả các phần nhớ mà ch-ơng trình không dùng đến, tính cả vùng nhớ không sử dụng nằm trong đoạn COM Cách thứ hai cho phép giải phóng đợc nhiều RAM hơn, nhng ngăn xếp lại nằm ngoài phần chơng trình COM (nó ở cuối đoạn 64 KB) Cho nên trong trờng hợp này cần thiết phải chuyển ngăn xếp đến cuối trơng trình và chỉ giải phóng vùng nhớ nằm sau đuôi ngăn xếp Để làm điều này, ta phải cho ngăn xếp một kích thớc xác định Đối với đa số các chơng trình thì 512 byte là quá đủ.
Trong khi kích thớc của chơng trình COM không vợt quá 64 KB, thì mọtt chơng trình EXE có thể lớn ngang phần RAM tự do mà DOS quản lý Đói với cr COM, trong đoạn 64 KB phải đặt cả mã lệnh, dữ liệu và ngăn xếp Kết quả là tất cả các thanh ghi đoạn đều nhận cùng một giá trị khi khởi đầu và trong quá trình thực hiện chơng trình, giá trị này chỉ ra địa chỉ bắt đầu của một đoạn 64 KB( chỉ có nội dung của thanh ghi ES là có thể bị thay đổi, vì nó không có ý nghĩa trực tiếp với việc thực hiện chơng trình) Đối với các file EXE, sự tổ chức các đoạn không ngặt nghèo nh vậy Mã lệnh, dữ liệu ngăn xếp đợc đặt trong các đoạn khác nhau, mỗi loại có thể đợc phân bố trong nhiều đoạn Vì lẽ đó mà các thanh ghi đoạn có giá trị khác nhau trong quá trình thực hiện chơng trình EXE Các file COM lu trên dĩa mềm hay đĩa cứng là hình ảnh chính xác của RAM khi thực hiện chơng trình, trong khi các file EXE lại đợc lu trên đĩa theo một cách đợc mã hoá.
Trang 5
Chơng II
Giới thiệu chơng trình
Chơng trình đợc chia làm 2 phần:
Phần Cài dặt (INSTALL):
Phần này thực hiện các chức năng sau:
-Vào tên tệp có dạng COM cần cài mật khẩu
-Kiểm tra liệu tệp COM đó trớc đã đợc xác lập mật khẩu hay cha?
Nếu tệp COM đó đã xác lập mật khẩu rồi thì 9 byte cuối của tệp COM mới (đợc hình thành bằng nội dung tệp COM + nội dung đoạn ch-ơng trình gộp vào thêm sau) sẽ chứa chữ "PROTECTED" Không tiến hành cài đặt và kết thúc phần chơng trình cài đặt.
Nếu tệp COM cha đợc xác lập mật khẩu thì 9 byte cuối của tệp COM đó không chữ Protected Sẽ tiến hành nhập mật khẩu( 2lần : lần đầu nhập mật khẩu vào, kiểm tra (verify) liệu nhớ đúng mật khẩu hay cha bằng cách nhập mật khẩu lần nữa và kiểm tra mật khẩu giữa 2 lần nhập?) Đọc 3 byte đầu của tệp COM và cất nội dung 3byte đó vào một biến nhớ (để sau này có thể phục hồi đợc) Tính độ dài của các byte tệp COM cũ và cất bớc nhảy đó vào biến 3 byte có tên JMPCODE: byte 1 là 0e9h - mã của lệnh JMP và 2 byte sau là bớc nhảy) Sau đó tiến hành ghi thêm đoạn chơng trình cần gộp vào tệp COM.
Trang 6Phần ch ơng trình sẽ gộp vào tệp COM sau khi đã cài mật khẩu(đoạn từ START CODE đến END CODE).
Phần này sẽ đợc chạy khi tiến hành chạy tệp >COM đã đợc xác lập mật khẩu Khi một tệp .COM đã đợc xác lập mật khẩu thì 3 byte đầu của tệp COM đó chứa chứa lệnh nhảy đến phần chơng trình gộp thêm vào và phần chơng trình gộp thêm vào sẽ tiến hành các chức năng sau:
- Yêu cầu nhập mật khẩu.
- Kiểm tra mật khẩu vừa nhập có đúng với mật khẩu đã xác lập hay cha? Nếu không đúng thì không cho chơng trình chạy và thoát Cất 3 byte đầu củatệp COM vào biến nhớ
Trang 7Còn nếu đúng mật khẩu thì hồi phục lại phần mã ở 3 byte đầu của tệp COM (trớc khi cài đặt mật khẩu), đa phần địa chỉ OFFSET về 100h và tiếp tục chạy
Trang 8Toµn bé ch ¬ng tr×nh sÏ cã d¹ng sau:
; T¹o Macro cho hiÖn ra mµn h×nh mét x©u ký tù HienString macro xau
mov dx, offset xau
mov ah,9 ;Nap so ham vao AH
KEYWORDERR db 10,13,10,13,10,13,'Access is denied !!! $' ;Ket thucs vïng du lieu se gop vao tep COM
CHECK:
mov DX,SI ; hien xau ky tu MESS
Trang 9mov AH,9 add DX,4 int 21h mov BX,SI
add BX,21 ; BX tro den KEYWORDLEN
mov CX,WORD PTR[BX] ; CX chua do dai cua KEYWORD
cmp AL,BYTE PTR[BX] ;SS voi cac ky tu mat khau da xac lap jnz WRONG ; Neu sai thi nhay
mov DL,'*' ; Hien dau'*' ra man hinh mov AH,2
int 21h
inc BX ; Tro den byte tiep theo cua KEYWORD dec CX ; Giam so luong byte cua bien KEYWORD
Trang 10;Tra 3 byte cu dau cua tep.COM (khi chua gop) cat o bien FIRSTTHREE ;vao o ca o nho co dia chi OFFSET la 100h,101h va 102h
Trang 11MESS0 db 10,13,'Xac lap mat khau cho tep dang COM$' MESSN db 10,13,'Ch¬ng tr×nh viÕt bëi NguyÔn Quèc ViÖt$' MESS1 db 10,13,'Nhap ten FILE.COM: $'
MESS2 db 10,13,'Nhap mat khau:$' MESS3 db 10,13,'Nhap lai:$'
MESS4 db 10,13,'DA NHAN ! $' ERR1 db 10,13,'Khong the mo tep !$' ERR2 db 10,13,'Khong the doc tep !$' ERR3 db 10,13,'Khong the ghi tep !$'
ERR4 db 10,13,'Tep da duoc xac lap mat khau roi !$' ERR5 db 10,13,'mat khau khong hop le !$'
EXEC :
HienString MESS0 HienString MESSN HienString MESS1
;Vao ten tep COM can xac lap mat khau
lea BX,FILENAME ; BX tro den dia chi dau chua ten tep call GET_FILE_NAME ; Goi chuong trinh con vao tep ;Mo tep COM de doc /ghi
mov AL,2 ;Mode doc/ghi mov DX,OFFSET FILENAME
mov AH,3dh ;chuc nang mo tep
Trang 12mov FILELEN,AX
;Tro den 9 byte cuoi cua tep( Cac bute nhan dang lieu tep COM da duoc xac ;lap mat khau hay chua? Neu da duoc xac lap thi 9 byte nay chua 9 ky
;SO sanh voi noi dung cua bien PSIGN de kiem tr lieu tep COM ;do da duoc xac lap mat khau hay chua?
NEXT2:
mov SI,OFFSET PSIGN ;Tro den byte dau cua PSIGN mov DI,OFFSET FSIGN ;Tro den byte dau cua FSIGN mov CX,9 ; So luong byte can so sanh la 9
cld ;So sanh tung byte theo chieu tang dia chi
repz cmpsb ;Lap viec so sanh voi dieu kien dung la: noi dung
Trang 13mov DI,OFFSET KEYWORD
inc CX ;Tang so dem so luong ky tu mat khau mov DL,'*' ; Hien dau '*' ra man hinh
mov AH,2 int 21h
Trang 14jmp START_REPEAT2 END_REPEAT2:
;So sanh giua hai lan nhap mat khau( so sanh theo tung byte)
cmp CX,KEYWORDLEN ; So sanh do dai mat khau giua hai lan nhap
jnz PASSNMERR ; Neu khac nhau thi nhay
mov SI,OFFSET KEYWORD ; SI tro den xau ky tu vao lan 1 mov DI,OFFSET KEYWORD2 ; DI tro den xau ky tu vao lan 2 cld ; DF= 0 -So sanh theo chieu tang dia chi repz cmpsb ; Vong lap so sanh mat khau 2 lan vao
;Tinh dia chi (phan OFFSET)cho lenh CALL de nhay ve dia chi chua lenh ;dau tien cua phan chuong trinh cua chung ta duoc gop them vao tep.COM khi ;tep nay duoc xac lap mat khau
mov BX,OFFSET JMPCODE ;Tro den bien JMPCODE mov AX,FILELEN
Trang 15sub AX,3
mov WORD PTR[BX+1],AX ; Cat do dai vao bytethu 2 va 3 ; Chuyen ve dau tep
; Thay noi dung 3 byte dau cua tep.COM bang ma lenh CALL va 2 byte ;chua buoc nhay(bo qua phan ma chuong trnh.COM cu)
; Chuyen con tro ve cuoi tep
mov AL,2 ; Mode buoc dich chuyen so voi cuoi tep mov BX,FILEHAND ; BX chua the tep
xor CX,CX ; Buoc dich CX:DX=0 so voi cuoi tep xor DX,DX
mov AH,42h ; chuc nang chuyen con tro tep int 21h
; Ghi them vao cuoi tep.COM phan chuong trinh cua chung ta doan tu ;START_CODE den END_CODE
mov BX,FILEHAND
mov DX,OFFSET START_CODE mov CX,OFFSET END_CODE
Trang 16; -; chuong trinh con vao ten tep can doc
;Vao: DX:BX tro den dia chi dau bien xau chua ten tep ;Ra: Ten tep nam o bien xau ten_tep
Trang 17push AX BX DX DI ; Bao ve noi dung cac thanh ghi
lea DX,Buff ; DX tro den vung dem Buff de chua cac ky tu mov AH,0ah ; doc duoc bang chuc nang 0ah cua int 21h.
Trang 18reg regmem datareg datasegreg reg16reg memsegreg mem16mem regreg16 segreg
Chú ý : Nếu địa chỉ cổng < 256 thì địa chỉ đợc trực tiếp đứng trong lệnh IN
còn nếu địa chỉ cổng >255 thì DX sẽ thay địa chỉ đứng trong lệnh IN4 Lệnh OUT
Chức năng : Chuyển giá trị 1 byte hoặc 1 từ từ thanh ghi AL hoặc AX ra cổng
Cú pháp : OUT Địa chỉ cổng, AL/AX
Chú ý : Nếu địa chỉ cổng < 256 thì địa chỉ đợc trực tiếp đứng trong lệnh IN
còn nếu địa chỉ cổng >255 thì DX sẽ thay địa chỉ đứng trong lệnh IN
Chức năng : Thực hiện chức năng EXCLUSIF OR giữa hai toán hạng Kết quả đặt ở
toán hạng đích (các bit của kết quả có giá trị 1 nếu giá trị các bit tơng ứng của 2 toán hạng là khác nhau).
Cú pháp : XOR DST,SRC
reg, regreg, data