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ên quan đế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 đang gó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ói riê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ển củ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ện sớm nhất đó là ngôn ngữ lập trình Assembler Đây là một trong những ngôn ngữ 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ình quản lý trong công nghiệp ,diệt vius, tạo vius, tạo hệ điều hành, tạo mật khẩ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ọc
Mở Hà Nội tôi đã đợc đào tạo một cách có hệ thống và tiếp thu những kiến thứ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ập tê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êmmộ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 khichơ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ơngtrì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ơngtrình COMkhông vợt quá 64 KB, nhng DOS vẫn dành cả bộ nhớ cho trơngtrì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ủaDOS), và chơng trình COM không thể gọi một chơng trình khác thông quahàm EXEC Vấn đề này có thể giải quyết đợc, nếu chơng trình COM thôngqua 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ớngtớ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ạigầ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 chongă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ềukhiể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ọihà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 trong2byte ở đỉnh ngăn xếp Mà hàm EXEC lại đặt giá trị 0 vào 2byte này trớc khitrao điều khiển cho chơng trình COM Nh vậy, chơng trình đợc tiếp tục thựchiện tại địa chỉ CS:0000 Vì địa chỉ này chính là đỉnh PSP, nó chứa lời gọingắ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ôngbáo, chơng trình thông báo này cho kết quả dới dạng một giá trị số DOSkhô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ơngtrì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ơngtrì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àmthay mọi công việc cần thiết Ngợc lại, một ngời lập trình Assembler phảiquan 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ủa16) 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ỉ offsetcủ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ơngtrình bằng cách xác định lại không chỉ địa chỉ offset mà cả địa chỉ đoạn củacon trỏ lệnh (CS:IP) Do đó các giá trị không đổi có thể đợc nạp vào một thanhghi , thí dụ nh địa chỉ đoạn của RAM màn hình.Nhng không thể nạp một địachỉ đ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ộtchơ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ơngtrì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 đợcchuyể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ệnyê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ảiquyế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ạnCOM Cách thứ hai cho phép giải phóng đợc nhiều RAM hơn, nhng ngăn xếplại nằm ngoài phần chơng trình COM (nó ở cuối đoạn 64 KB) Cho nên trongtrờ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ảiphóng vùng nhớ nằm sau đuôi ngăn xếp Để làm điều này, ta phải cho ngănxế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ọttchơ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à trongquá 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 đặttrong 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ơngtrình EXE Các file COM lu trên dĩa mềm hay đĩa cứng là hình ảnh chính xáccủa RAM khi thực hiện chơng trình, trong khi các file EXE lại đợc lu trên đĩatheo 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ủatệ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ànhcà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ậtkhẩu vào, kiểm tra (verify) liệu nhớ đúng mật khẩu hay cha bằng cách nhậpmậ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ủatệp COM và cất nội dung 3byte đó vào một biến nhớ (để sau này có thể phụchồ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 3byte có tên JMPCODE: byte 1 là 0e9h - mã của lệnh JMP và 2 byte sau là bớcnhảy) Sau đó tiến hành ghi thêm đoạn chơng trình cần gộp vào tệp COM
Bắt đầu
Vào tệp dạng .CO M
Lu đồ thuật toán Xác
lập mật khẩu cho
File 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ậtkhẩu Khi một tệp .COM đã đợc xác lập mật khẩu thì 3 byte đầu củatệ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ầnchơ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
Thoát
KT tệp đó có tồn tại không
SAI
KT COMđó dã xl mk ch a
sai
đúng
Xl MK cho tệp COM
Xác lập lại mật khẩu
KT 2 lần vào MK có giống nhau hay ko?
Cất 3 byte đầu của tệp COM vào biến nhớ Xác lập bớc nhảy
Ghi đoan chơng trình can gộp vào tệp COM
sai
đúng
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ạyphần chơng trình COM
Sai
Start
Nhập mật khẩu
Kiểm tra mật khẩu
End
Khôi phục lại chơng trìnhChạy chơng trình *.COM
Đúng
Lu đồ thuật toán
FIle.com đã đợc xác
lập mật khẩu
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(mat ;khau)
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 12;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 hailan 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 jcxz NEXT4
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 int 21h
Trang 18Phụ lụcMột số lệnh assembler dùng
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
4 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
(PORT)
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
5 Lệnh INC
Chức năng : Tăng giá trị của toán hạng đích lên 1
Cú pháp : INC DST
reg8/16 mem
Cờ : Các cờ bị thay đổi: OF, SF, ZF, PF,CF
6 Lệnh DEC
Chức năng : Giảm giá trị của toán hạng đích đi 1
Cú pháp : DEC DST
reg8/16 mem
Cờ : Các cờ bị thay đổi: OF, SF, ZF, AF, PF
7 Lệnh XOR
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, reg reg, data