Virus huyền thoại hay thực tế
Bạn đang xem 20 trang mẫu của tài liệu "Virus huyền thoại hay thực tế", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- virus_huyen_thoai_hay_thuc_te.pdf
Nội dung text: Virus huyền thoại hay thực tế
- www.updatesofts.com 1
- lời nói đầu Mặc dù virus tin học đ xuất hiện lâu trên thế giới và ở cả trong n−ớc. Và không ai còn ngạc nhiên nữa nếu biết máy tính của mình đ bị nhiễm virus. Thế nh−ng, thực đáng ngạc nhiên vì hầu nh− ch−a có một cuốn sách nào đề cập đến virus một cách đầy đủ và chi tiết. Sự thiếu vắng thông tin này không phải là vô tình mà do những quan niệm cho rằng phổ biến những thông tin nh− vậy không những không đ−ợc lợi ích gì mà còn làm gia tăng số l−ợng virus lên, và nh− thế làm tăng nguy cơ mất mát dữ liệu. Xét về khía cạnh này, các nhà sản xuất phần mềm chống virus cũng rất đồng tình. Chính sự thiếu hiểu biết thực sự giả tạo về virus cùng với sự thổi phồng quá đáng của báo chí đ biến virus tin học bé nhỏ thành một con ‘ngoáo ộp’ khổng lồ làm kinh hoàng cho những ng−ời sử dụng tội nghiệp khi máy của họ bị một hiện t−ợng nào đó mà nghi ngờ là virus. Cái giá phải trả cho sự thiếu hiểu biết này đôi khi lại quá to lớn, một sự sai lệch dữ liệu do lỗi logic của ch−ơng trình có thể gián đoạn vài ngày để backup dữ liệu và format lại đĩa, một file tự nhiên tăng kích th−ớc cũng gây hoang mang. Đó là ch−a kể đến sự đổ lỗi cho virus tin học sự thiếu hiểu biết của mình. Mặt khác, một virus tin học đúng nghĩa là một virus có kích th−ớc ch−ơng trình cực nhỏ và trong đó bao gồm chức năng khó khăn nên đòi hỏi virus đ−ợc thiết kế trực tiếp bằng ngôn ngữ Assembler và bao hàm những giải thuật tối −u và kĩ thuật cao, nếu xét trên một khía cạnh nào đó rất đáng cho chúng ta học tập. Chính vì những lí do đó, cuốn sách này ra đời nhằm cung cấp cho độc giả những thông tin cần thiết và đúng đắn về virus, từ đó có thể rút ra những bài học bổ ích và cần thiết trong việc phát hiện và cứu chữa các hậu quả mà virus gây ra. Dù đ−ợc soạn với những thông tin rất cơ bản, cuốn sách này vẫn đòi hỏi độc giả phải có một kiến thức căn bản về Assembler (vì chính virus cũng đ−ợc thiết kế bằng ngôn ngữ này) để có thể hiểu và phân tích virus một cách tỉ mỉ nhất. Tác giả không bao giờ có mục đích h−ớng dẫn độc giả một ph−ơng pháp để thiết kế một virus, và tốt nhất bạn đọc cũng đừng bao giờ có ý định này vì chính các bạn sẽ là những nạn nhân đầu tiên của nó và sẽ gánh chịu mọi hậu quả do nó gây ra. Các virus đ−ợc khảo sát trong cuốn sách này tất cả là những virus đ biết trong thành phố cũng nh− trên thế giới, trong đó, số virus đ−ợc biết trong n−ớc cũng đ chiếm gần phân nửa. Xin cảm ơn sự giúp đỡ quí báu của các đồng nghiệp trong việc hiệu chính và đóng góp nhiều ý kiến hay cho cuốn sách. Vì đây là lần xuất bản đầu tiên, chắc chắn cuốn sách sẽ còn nhiều điều thiếu sót, tác giả mong nhận đ−ợc nhiều ý kiến đóng góp của độc giả. Địa chỉ liên lạc tác giả: Ngô Anh Vũ Trung tâm CESAIS Ban tin học 17 Phạm Ngọc Thạch Q.3 TP Hồ Chí Minh 2
- www.updatesofts.com 3
- Giới thiệu tổng quát về virus tin học I - Virus Tin Học và Trojan Horse. Luật pháp từng n−ớc vẫn còn có chỗ không đồng nhất, có n−ớc đ chấp nhận bảo vệ bản quyền các phần mềm, nh−ng có những n−ớc lại không đề cập một cách rõ ràng đến vấn đề này. Cùng với sự phát triển nh− vũ bo của phần cứng, kĩ thuật sao chép cũng đạt đến trình độ cao. Những phần mềm sao chép nh− COPYIIPC, COPYWRIT cho phép tạo một đĩa mới có mọi thành phần giống nh− đĩa gốc đ làm thiệt hại đáng kể cho các hng sản xuất phần mềm. Lợi dụng kẽ ở luật pháp của các n−ớc, một số nơi đ xuất hiện những tay ‘c−ớp’ phần mềm chuyên nghiệp. Những phần mềm vừa đ−ợc đ−a ra thị tr−ờng ngày hôm tr−ớc thì lập tức nó bị phá khóa (khóa ở đây đ−ợc hiểu nh− một m đ−ợc đ−a vào khi thi hành ch−ơng trình, một đĩa gốc ), copy lại, thậm chí còn sửa đổi cả tên tác giả, rồi tung ra thị tr−ờng với giá rẻ ch−a từng có. Những hành động vô đạo đức này là một thách thức đối với các nhà sản xuất phần mềm, do đó, ý t−ởng đ−a một đoạn m phá hoại (destructive code) vào trong phần mềm với mục đích sẽ phá hủy dữ liệu nếu phần mềm này không nằm trên đĩa gốc không phải là ý t−ởng gì mới lạ. Nh−ng việc giấu một đoạn m nh− thế nào và bản chất của đoạn m ra sao thì lại tùy thuộc vào nhà sản xuất và không một ai thừa nhận (tất nhiên, kể cả những nhà sản xuất ra nó) cũng nh− chứng kiến điều này cả. Mặt khác, tin học đ và đang trở thành phổ cập cho toàn thế giới, những cấu trúc nội tại, những kĩ thuật lập trình đều đ−ợc h−ớng dẫn tỉ mỉ và nghiêm túc đang tiếp cận từng ng−ời và cụ thể là với tầng lớp thanh niên. Với đầy đủ kiến thức và tính hiếu thắng, đua tài của tuổi trẻ, một t− t−ởng nổi loạn hay sự tự khẳng định mình qua những ch−ơng trình mang tính chất phá hoại đều có thể gây nguy hiểm và thực tế cũng không ít ví dụ chứng minh cho điều này. Căn cứ vào tính chất của đoạn m phá hoại, ta có thể chia chúng thành hai loại: virus và trojan horse. 1/ Trojan horse: Thuật ngữ này dựa vào một điển tích cổ, chỉ những đoạn m đ−ợc ‘cắm’ vào bên trong một phần mềm, cho phép xuất hiện và ra tay phá hoại một cách bất ngờ nh− những ‘anh hùng’ xông ra từ bụng con ngựa thành Troa. Trojan horse là một đoạn m HOàN TOàN KHÔNG Có TíNH CHấT LÂY LAN , chỉ nằm trong những phần mềm nhất định. Đoạn m này sẽ phá hoại vào một thời điểm xác định có thể đ−ợc tác giả định tr−ớc và đối t−ợng của chúng là thông tin trên đĩa nh− format lại đĩa, xóa FAT, Root Thông th−ờng các phần mềm có chứa Trojan horse đ−ợc phân phối nh− là các version bổ sung, hay mới, và điều này sẽ trừng phạt những ng−ời thích sao chép phần mềm ở những nơi có nguồn gốc không xác định. Tuy nhiên đối với hiện t−ợng này, ở Việt nam nói chung và thành phố ta ch−a xuất hiện. Và cũng dễ thấy tầm hoạt động và mức phá hoại khi hoạt động trên các máy đơn sẽ vô cùng hạn chế. 2/ Virus tin học: Thuật ngữ này nhằm chỉ một ch−ơng trình máy tích có thể tự sao chép chính nó lên những đĩa, file khác mà ng−ời sử dụng không hay biết. Thông th−ờng virus cũng mang tính phá hoại, nó sẽ gây ra lỗi thi hành, lệch lạc hay hủy dữ liệu 4
- www.updatesofts.com So với Trojan horse, virus mang tầm vóc ‘vĩ đại’ hơn, sự lan truyền xa hơn và do đó tác hại của nó vô cùng khủng khiếp hơn. ở thành phố, virus đ xuất hiện khá sớm và cũng đ gây nhiều tác hại với −u thế của virus so với Trojan horse. ở đây , một bài báo nhan đề “Lí thuyết và cơ cấu của các phần tử tự hành phức tạp “(Theory and Organization of Complicated Automata). Trong bài báo của mình, ông đ nêu ra lí thuyết về sự tự nhân lên nhiều lần của các ch−ơng trình máy tính. Những đồng nghiệp của ông đ dè bỉu nhiều về ý t−ởng này nh−ng điều này cũng dễ hiểu vì những chiếc máy tính điện tử đầu tiên (electronic computer) đ−ợc phát triển nhiều năm sau đó. M−ời năm sau đó, trong một chi nhánh của hng AT&T’s Bell, ba thảo ch−ơng viên trẻ tuổi đ phát triển một trò chơi tên là ‘Core War’, ba ng−ời này tên là Mc Ilroy, Victor Vysottsky và Robert Morris, đều là những ng−ời nắm vững những cấu trúc nội tại của máy. ‘Core War’ là một cuộc đấu trí giữa hai đoạn m của hai thảo ch−ơng viên. Mỗi đấu thủ đ−a một ch−ơng trình có khả năng tự tái tạo (reproducing program) gọi là Organism vào trong bộ nhớ của máy tính. Khi bắt đầu cuộc chơi Organism, mỗi đấu thủ sẽ cố gắng phá hủy organism của đối ph−ơng và tái tạo organism của mình. Đấu thủ thắng cuộc là đấu thủ phát triển nhiều lần cơ cấu của mình. Trò chơi ‘Core War’ này đ−ợc giữ kín cho đến năm 1983, Ken Thompson, một tay chơi lỗi lạc đ viết version đầu cho hệ điều hành UNIX, để lộ ra khi nhận một trong những phần th−ởng danh dự của giới kỹ nghệ điện tử - Giải th−ởng A.M Turing. Trong bài diễn văn của mình, ông đ đ−a ra một ý t−ởng về ph−ơng pháp làm virus. Thompson cũng đề cập đến Core War và sau đó tiếp tục khuyến khích thính giả của mình hy làm thử! Tháng 5/1984 tờ báo Scientific America có đăng một bài báo mô tả về Core War và cung cấp cho đọc giả cơ hội mua những lời h−ớng dẫn về trò chơi này - nó đ−ợc gởi đến tận nhà với giá 2 USD c−ớc phí b−u điện! Đầu tiên, virus tin học đ bắt đầu trên các máy lớn nh− CREEPER (1970, RABBIT (1974), ANIMAL (1980) Sau đó mới bắt đầu xuất hiện trên máy PC. Đ có một số tài liệu cho rằng virus tin học trên PC bắt đầu từ năm 1987, tuy nhiên điều này cũng không đ−ợc chắc chắn khi virus Brain ‘thông báo’ nó đ−ợc ra đời từ năm 1986! Virus đầu tiên trên máy IBM PC đ−ợc phát hiện và nhanh chóng trở nên nổi tiếng là Lehigh virus (vì nó xuất hiện đầu tiên ở tr−ờng Đại học này) vào tr−ớc lễ Tạ ơn năm 1987. Cùng thời với virus này, một virus khác âm thầm đổ bộ từ Pakistan vào Mĩ là Brain với mục tiêu đầu tiên là tr−ờng Đại học Delaware. Một nơi khác trên thế giới cũng đ t−ờng thuật sự xuất hiện của virus: Đại học Hebrew - Israel. Tất cả đều có chung một điểm: từ các tr−ờng Đại học, nơi có các sinh viên giỏi, hiếu động và thích đùa. Mặc dù xuất hiện ở nhiều nơi trên thế giới, virus vẫn có chung một ph−ơng pháp lây lan, vì không nắm rõ cách thức này, một số ng−ời đ cảm thấy hốt hoảng khi đ diệt bằng mọi cách, máy tính vẫn cứ bị nhiễm đi nhiễm lại một virus. Dù vậy, vẫn phải có một phân loại nào đó chi tiết hơn về virus, làm cho nó dễ kiểm soát và đ−a ra ph−ơng pháp chữa trị thích hợp. Do đó, ng−ời ta đ chia virus thành hai loại chính căn cứ theo cách lây và đối t−ợng lây. Ta sẽ khảo sát lần l−ợt từng đối t−ợng một. III - Cách Thức Lây - Phân Loại. Dựa vào đối t−ợng lây lan là file hay đĩa, ta chia virus thành hai nhóm chính: + B - virus (boot virus): virus chỉ tấn công lên các Boot sector hay Master boot. + F - virus (file virus): virus chỉ tấn công lên các file thi hành đ−ợc (dạng có thể thi hành bằng chức năng 4Bh của DOS hơn là những file dạng .COM hay .EXE). 5
- Dù vậy, cách phân chia này cũng không phải là duy nhất, mà cũng không hẳn chính xác. Vì sau này, các F - virus vẫn phá hoại hay chèn m phá hoại vào Boot sector, cũng nh− B - virus chèn đoạn m vào file. Tuy nhiên, những hiện t−ợng này chỉ nhằm phá hoại chứ không coi đó là đối t−ợng để lây lan. Dạng tổng quát của một virus có thể biểu diễn bằng sơ đồ sau: Tìm file/đĩa Nhiễm ? Exit Lây Nh− đ giới thiệu về định nghĩa virus, đoạn m này một lúc nào đó phải đ−ợc trao quyền điều khiển. Nh− vậy, rõ ràng virus phải khai thác một chỗ hở nào đó mà máy ‘tự nguyện’ trao quyền điều khiển lại cho nó. Thực tế có hai kẽ hở nh− thế, mà ta sẽ lần l−ợt xét sau đây: 1/ B - virus : Khi máy tính bắt đầu khởi động (Power on), mọi thanh ghi của CPU sẽ đ−ợc xóa, các thanh ghi phân đoạn (segment) đ−ợc gán giá trị 0FFFFh, còn tất cả các thanh ghi còn lại đều đ−ợc xóa về 0. Lúc này CS:IP dĩ nhiên sẽ trỏ đến 0FFFFh:0. Tại địa chỉ này là một lệnh JMP FAR chuyển quyền điều khiển đến một đoạn ch−ơng trình định sẵn trong ROM, đoạn ch−ơng trình này sẽ thực hiện quá trình POST (Power On Seft Test: tự kiểm tra khi khởi động). Quá trình POST sẽ lần l−ợt kiểm tra các thanh ghi, kiểm tra bộ nhớ, khởi tạo các chíp điều khiển DMA, bộ điều khiển ngắt, đĩa Nếu quá trình này hoàn thành tốt đẹp, công việc tiếp theo sẽ dò tìm các card thiết bị gắn thêm vào (th−ờng các thiết bị này là card điều khiển đĩa cứng hay màn hình) và trao quyền điều khiển để cho chúng tự khởi tạo rồi sau đó lấy lại khi card hoàn thành xong phần khởi tạo. Tuy vậy cũng phải chú ý: toàn bộ đoạn ch−ơng trình này nằm ngay trong ROM, có tính chất Chỉ Đọc nên không thể sửa đổi cũng nh− chèn bất kì một đoạn m ch−ơng trình khác vào đ−ợc. Sau khi mọi việc khởi tạo đều hoàn thành tốt đẹp, lúc này đoạn ch−ơng trình trong ROM mới tiến hành đọc Boot sector từ đĩa vật lí đầu tiên (là đĩa A) vào trong RAM tại địa chỉ 0:07C00h (Boot sector là sector đầu tiên trên đĩa nằm ở sector 1, head 0, track 0). Nếu việc đọc không thành công, (không có đĩa trong ổ đĩa ) Boot Master của đĩa cứng sẽ đ−ợc đọc vào (nếu có đĩa cứng). Giả sử việc đọc đ thành công, quyền điều khiển sẽ đ−ợc trao cho đoạn m nằm trong Boot record bằng một lệnh JMP FAR 0:07C00 mà không cần biết đoạn m này làm gì. Nh− vậy, đến lúc này bất kể trong Boot record chứa đoạn m nào, quyền điều khiển vẫn đ−ợc trao và nếu đoạn m đó lại tiến hành format lại đĩa!. Rõ ràng, đây là một kẽ hở đầu tiên mà máy mắc phải. Nh−ng điều này cũng dễ hiểu vì PC không thể kiểm tra đ−ợc đoạn m trong Boot record - ứng với mỗi hệ điều hành, hoặc ngay cả các version khác nhau - đoạn m này cũng khác nhau. Nếu tự kiểm điểm lại mình, bạn sẽ không khỏi giật mình vì số lần để quên đĩa mềm trong ổ đĩa cũng không phải là ít. Tuy vậy, cũng còn may mắn là đoạn m trong Boot record lại hoàn toàn trong sạch, nghĩa là nó đ−ợc format d−ới hệ điều hành hiện hành và hơn nữa ch−a có ai sửa đổi, thay thế đoạn m này cả. Lúc này, đoạn m sẽ dò tìm, và nếu có sẽ tải 2 file hệ thống vào vùng nhớ (nếu là hệ điều hành MS-DOS, 2 file này sẽ có tên IO.SYS và MSDOS.SYS) rồi một lần nữa trao quyền điều khiển. Lúc này, CONFIG.SYS (nếu có) sẽ đ−ợc đọc vào và tiến hành khởi tạo các device driver, định buffer file cho các file cuối cùng COMMAND.COM sẽ đ−ợc gọi (nếu không có lệnh SHELL trong CONFIG.SYS) để rồi dấu nhắc A:\> quen thuộc xuất hiện trên màn hình. Lợi dụng kẽ hở đầu tiên này, B - virus sẽ tấn công vào Boot sector, nghĩa là nó sẽ thay một Boot sector chuẩn bằng một đoạn m virus, quyền điều khiển lúc này sẽ đ−ợc trao cho virus 6
- www.updatesofts.com tr−ớc khi Boot record nhận quyền điều khiển rồi sau đó mọi chuyện vẫn tiến hành một cách bình th−ờng cho đến khi Do đặc điểm lên tr−ớc cả hệ điều hành, virus phải tự làm hết mọi chuyện. Và vì vậy điều này cũng không phải là dễ dàng với một kích th−ớc ch−ơng trình nhỏ bé (nếu không tin bạn có thể thử định vị và phân tích FAT mà không dùng đến bất kì một thông tin nào từ DOS xem) 2/ F - virus : Sau khi COMMAND.COM đ−ợc gọi, lúc này nó sẽ tìm file AUTO.EXEC.BAT để thi hành (nếu có) và sau cùng dấu nhắc sẽ xuất hiện để chờ nhận lệnh. Tất nhiên không ai dùng những lệnh nội trú của DOS để thi hành (trừ những ng−ời bắt đầu học hệ điều hành DOS). Thông th−ờng, ng−ời ta sẽ thi hành một file nào đó. Đơn giản nhất là anh ta muốn thi hành phần mềm Foxbase chẳng hạn bằng cách đánh tên Mfoxplus ở dấu nhắc đợi lệnh của DOS và bấm phím Enter. Lúc này DOS sẽ tìm một file có tên Mfoxplus.EXE. May mắn thay file này đ đ−ợc tìm thấy, DOS bắt đầu tổ chức lại vùng nhớ, tải nó lên rồi trao quyền điều khiển mà không một chút băn khoăn xem nó định làm cái gì và có nguy hiểm không? May thay, kẽ hở thứ hai này cũng bị bỏ qua mà không một ai gây phiền phức gì. Sau khi thi hành xong anh ta có thể trở về dấu nhắc của hệ điều hành một cách an toàn. Thực chất, kẽ hở thứ hai này cũng đ−ợc virus tận dụng. Điều gì sẽ xảy ra nếu quyền điều khiển thay vì đ−ợc trao cho file lại rẽ nhánh sang cho một kẻ lạ mặt sống ‘kí sinh’ lên file? Điều này chỉ có virus mới biết đ−ợc và tất nhiên sau đó, khi kết quả phá hoại cũng đ rõ ràng thì ng−ời sử dụng cũng biết. ội tại của hệ điều hành mà ta ch−a đ−ợc biết. Qui −ớc: + Các số trong cuốn sách này đ−ợc ngầm hiểu d−ới dạng thập lục hơn là thập phân nếu không ghi rõ dạng. + Các ch−ơng trình virus đ−ợc minh họa hầu hết đ−ợc Unassembler bằng phần mềm D68. 7
- đĩa - sơ l−ợc về đĩa Ch−ơng này không nhằm mục đích khảo sát t−ờng tận từng cấu trúc vật lí cũng nh− logic mà chỉ đơn giản nhằm cung cấp cho độc giả một số thông tin thật cần thiết, tiện cho việc phân tích B-virus trong ch−ơng tiếp theo. Dù vậy, vẫn có một số thông tin bổ ích cho việc tham khảo. I - Cấu Trúc Vật Lí. Cấu trúc đĩa - dù vật lí hay logic, trong thực tế ít đ−ợc ai đề cập đến vì mức độ phức tạp, nhất là đĩa cứng. Tuy nhiên, những khái niệm cơ bản nhất lại vô cùng đơn giản. Các loại đĩa (cả đĩa cứng lẫn đĩa mềm) đều dựa vào hiện t−ợng từ hóa để chứa dữ liệu: đầu từ đọc ghi sẽ từ hóa những phần tử cực nhỏ trên bề mặt, mỗi phần tử di chuyển qua đầu từ sẽ bị từ hóa. Do hình dạng ban đầu của đĩa là hình tròn nên nhiều ng−ời lầm t−ởng đây là hình dạng bắt buộc, thực ra, bạn có thể tạo ra một đĩa với hình dạng bất kì, miễn sao tồn tại một ổ đĩa cho phép bạn truy xuất những thông tin trên đó. Khác với trên băng từ, trên đĩa chúng ta sẽ ghi dữ liệu d−ới dạng rời rạc (hoặc sẽ mang giá trị tối đa là 1 hoặc mang giá trị tối thiểu là 0) . Cách thể hiện nh− thế đ−ợc gọi là digital. Chúng ta sẽ bắt đầu với khái niệm Track. 1/ Track : Nếu bạn đặt một cây bút cho lên một đĩa hát đang xoay. Đ−ờng bút chì sẽ tạo trên thành đĩa một hình tròn. Và bạn cứ việc coi rằng đĩa là một đĩa mềm, còn đầu bút chì là đầu từ đọc ghi. Đ−ờng do cây bút chì tạo nên bây giờ có tên là Track. Do một Track chỉ là một hình tròn chiếm một phần rất nhỏ, nên trên một đĩa, ta có thể tạo nên nhiều hình tròn đồng tâm để có đ−ợc nhiều Track. 2/ Side : Bất một đĩa mềm nào cũng có hai mặt (Side), do đó, không ai bắt buộc chúng ta phải sử dụng một mặt đĩa (mặc dù DOS đ làm điều này, nh−ng sau đó, nó cũng sửa sai). Ghi dữ liệu lên cả hai mặt đĩa rõ ràng mang lại tính king tế hơn vì khả chứa dữ liệu của đĩa tăng lên gấp đôi mà không cần tốn thêm một ổ đĩa thứ hai. Đơn giản là đặt thêm một đầu đọc thứ hai ở phía bên kia để tạo thành một ‘gọng kìm’. Hai mặt đ−ợc đánh số lần l−ợt là mặt 1 và mặt 0. 3/ Cylinder : Rõ ràng, một thuận lợi thứ hai của đĩa hai mặt: dữ liệu có thể ghi hai lần nhanh hơn tr−ớc khi đầu đọc chuyển sang Track mới. Dữ liệu đầu tiên có thể ghi lên Track của mặt bên nay rồi sau đó cùng một Track nh− thế nh−ng ở mặt bên kia, cuối cung mới chuyển sang Track khác. Một cặp Track nằm đối xứng nh− thế đ−ợc tham chiếu đến nh− một phần tử duy nhất Cylinder. Để thuận lợi cho việc tham chiếu, Track và Cylinder đ−ợc đánh số. Track ở ngoài cùng đ−ợc đánh số là Track 0. Track ở mặt trên ngoài cùng là Track 0, Side 0; Track ở mặt d−ới là Track 0 Side 1. Những Track 0 nh− thế đ−ợc gọi chung là Cylinder 0. Bạn chắc đ từng nghe nói đĩa mềm 360 Kb, những đĩa mềm loại nh− thế có 80 Track đ−ợc đánh số từ 0 đến 79. Thông th−ờng, việc đánh số trên máy tính bắt đầu từ 0 hơn là từ 1, song vẫn có ngoại lệ khi Sector bắt đầu đánh số từ 1 và Cluster đ−ợc đánh số bắt đầu từ 2 mà chúng ra sẽ xét sau. Đối với đĩa cứng, một mô hình đơn giản là các đĩa mềm đ−ợc xếp song song với nhau thành hình trụ. Đĩa trên cùng là Side 0, đáy của nó là Side 1 đĩa thứ hai có hai mặt lần l−ợt là Side 2 và 3 Tập hợp những track 0 đ−ợc tham khảo d−ới tên gọi Cylinder 0. Tất nhiên số đầu đọc cũng sẽ tăng theo. Khối l−ợng dữ liệu trên một track trên đĩa cứng cũng thay đổi tùy thuộc từng máy, tuy nhiên, th−ờng từ 8Kb đến 12Kb trên một track.
- www.updatesofts.com 4/ Sector : Mặc dù có thể đọc/ghi dữ liệu lên đĩa một lúc 8 đến 12 Kb, nh−ng trong thực tế, không ai dám dùng đến một khối l−ợng lớn đến nh− thế. Bộ điều khiển đĩa th−ờng đ−ợc thiết kế để có thể đọc và ghi một lần chỉ từng phân đoạn của Track. Số byte trong một phân đoạn, đ−ợc gọi là Sector, phụ thuộc vào phần cứng mà của bộ điều khiển đĩa và vào hệ điều hành: các nhà thiết kế sẽ tạo những kích th−ớc Sector khác nhau và hệ điều hành sẽ chọn một trong những kích th−ớc này. Thông th−ờng, các kích th−ớc này là 128, 256, và 1024 byte. Đối với hệ điều hành DOS, kích th−ớc đ−ợc chọn là 512 byte cho mỗi Sector với tất cả các loại đĩa. Trên đĩa mềm 360 Kb, mỗi Track có thể đạt tới 10 Sector, tuy nhiên, vì vấn đề an toàn dữ liệu, DOS chỉ chọn 9 Sector cho mỗi Track. Chính vì điều này, sẽ thấy một đĩa 40 Track sẽ có: 40Track * 2Side * 9Sector 8 512byte = 360 Kb. Đối với đĩa cứng, mật độ Track trên một inch có thể đạt đến 600 Track/inch, do đó khả năng l−u trữ dữ kiệu của đĩa cứng lớn hơn đĩa mềm rất nhiều. Lúc này, để tham chiếu, không những chúng ta phải chỉ ra mặt (Side) và Track mà còn phải chỉ ra số Sector nào trong Track đó. 5/ Đánh địa chỉ Sector : Khi chúng ta đ đạt đến Track cần đọc/ghi, làm thế nào để có thể nhận ra Sector cần tìm. Có hai cách để định vị Sector, đó là : + Đánh số Sector bằng ph−ơng pháp cứng (Hard sectoring): Những lỗ đều nhau sẽ đ−ợc bấm xung quanh đĩa và mỗi lỗ nh− thế có ý nghĩa đánh dấu sự bắt đầu một Sector. Ph−ơng pháp này tỏ ra không còn hiệu nghiệm khi tốc độ truy xuất đĩa ngày càng tăng. + Đánh số Sector mềm (Soft sectoring): Ph−ơng pháp này m hóa địa chỉ của Sector thành dữ liệu của Sector đó và đ−ợc gắn vào tr−ớc mỗi Sector. Vì Sector đ−ợc đánh số tuần tự xung quanh Track nên địa chỉ của nó đơn giản là các số liên tiếp xung quanh Track (nh−ng đối với một số đĩa đ−ợc thiết kế chống sao chép thì điều này khác). Hiện nay, ph−ơng pháp đánh số mềm đ−ợc dùng rộng ri. Với ph−ơng pháp này, tr−ớc khi đĩa đ−ợc dùng, địa chỉ của Sector phải đ−ợc ghi vào Sector (quá trình này đ−ợc thực hiện bằng việc Format đĩa). Địa chỉ Sector này thực ra chỉ là một phần thông tin trong dữ liệu ở phần đầu Sector, ngoài ra còn một số thông tin khác mà thiết nghĩ rằng nêu ra ở đây chỉ làm rối cho độc giả. 6/ Format vật lí : Ghi toàn bộ địa chỉ Sector, các thông tin khác vào phần đầu của Sector đ−ợc gọi là format vật lí hay format ở mức thấp, vì việc này đ−ợc thực hiện chỉ bằng phần cứng của bộ điều khiển đĩa. Trong quá trình format, phần mềm sẽ bắt bộ điều khiển đĩa tiến hành format với những thông số về kích th−ớc của một Sector còn công việc còn lại tự bộ điều khiển đĩa phải làm. Format vật lí phải đ−ợc thực hiện tr−ớc khi đĩa đ−ợc đ−a vào sử dụng. Một quá trình độc lập thứ hai - format logic - cũng phải đ−ợc thực hiện ngay sau đó tr−ớc khi đĩa chuẩn bị chứa dữ liệu. ở mức này, tùy theo cách tổ chức của từng hệ điều hành, nó sẽ chia đĩa thành từng vùng t−ơng ứng. Trong thực tế, hầu nh− không ai chú ý đến vẫn đề này vì đ có lệnh Format của DOS. Tuy nhiên để giải thích công việc cụ thể của lệnh này thì hầu nh− ít ai quan tâm đến. Có thể giải thích nh− sau : + Với đĩa mềm: một đĩa cho dù đ đ−ợc format lần nào hay ch−a đều đ−ợc đối xử “bình đẳng “nh− nhau, nghĩa là đầu tiên DOS sẽ tiến hành forrmat vật lí, sau đó sẽ là format logic nhằm khởi tạo các vùng hệ thống và dữ liệu. Dễ thấy, đối với một đĩa đ qua một lần format, quá trình format vật lí sẽ không còn cần thiết, trừ tr−ờng hợp muốn format vật lí, do đó nếu chỉ có quá trình format logic sẽ làm giảm thời gian format một đĩa. ý t−ởng này, thực tế đ đ−ợc các phần mềm chuyên dụng khai thác rất kĩ. PCformat của Central point, SafeFormat của Norrton đều có những option cho phép chỉ định tác vụ này. 9
- + Đối với đĩa cứng: mọi đĩa cứng tr−ớc khi đ−a ra thị tr−ờng đều đ đ−ợc format vật lí và do đó không có một lí do nào để format lại nếu không thấy cần thiết. Đối với tr−ờng hợp này, DOS không cần phải format vật lý mà đơn giản chỉ tiến hành format logic. Trong tr−ờng hợp này, tốc độ format trên đĩa cứng sẽ rất nhanh chứ không ì ạch nh− trên đĩa mềm. Sau khi đ qua format, đĩa của chúng ta giờ đây đ sẵn sàng chứa dữ liệu. II - Cấu Trúc Logic. ở phần trên, ta đ có đề cập đến format logic, nh−ng lại không đ−a ra một chi tiết nào, sau đây ta sẽ lần l−ợt xét chi tiết đến chúng. Rõ ràng, đối với một đĩa có dung l−ợng lớn, việc quản lí dữ liệu nh− thế nào cho hiệu quả và nhanh chóng là một vấn đề phức tạp. Do đó, mỗi hệ điều hành cần thiết phải tổ chức cho mình một vài cấu trúc nào đó giúp cho việc kiểm soát đĩa đ−ợc nhanh và chính xác, cho biết phần nào đ dùng để chứa dữ liệu, phần nào còn trống Cách ghi nhớ những cấu trúc nh− thế lên đĩa đ−ợc gọi là format logic đĩa. Dù là loại đĩa nào, DOS vẫn tổ chức đĩa thành các phần sau: Boot Sector, bảng FAT (file allocation table), Root directory và phần dữ liệu (ba phần đầu đôi khi đ−ợc gọi d−ới tên Vùng hệ thống). Trên đĩa cứng, với dung l−ợng quá lớn, có thể chia thành từng phần khác nhau đ−ợc gọi là Partition, do đó còn phải thêm một phần thứ 5 Partition table. Sau đây, chúng ta sẽ lần l−ợt khảo sát từng phần một. 1/ Boot Sector : Luôn chiếm Sector đầu tiên trên Track 0, Side 1 của đĩa, tuy vậy, điều này cũng chỉ tuyệt đối đúng trên các đĩa mềm, còn đối với đĩa cứng, vị trí này phải nh−ờng lại cho Partition table. Boot sector này sẽ đ−ợc đọc vào địa chỉ 0:07C00 sau khi máy thực hiện xong quá trình POST. Quyền điều khiển sẽ đ−ợc trao lại cho đoạn m nằm trong Boot sector. Đoạn m này có nhiệm vụ tải các file hệ thống vào nếu có. Ngoài ra, Boot sector còn chứa một bảng tham số quan trọng đến cấu trúc đĩa, bảng này đ−ợc ghi vào trong quá trình format logic đĩa và ngay cả đối với những đĩa không phải là đĩa boot đ−ợc . a. Cấu trúc của bảng tham số đĩa BPB (Bios Parameter Block): Bảng tham số này ở offset 0B của Boot sector và có cấu trúc sau : offset Size Nội dung +0 3 JMP xx:xx Lệnh nhảy gần đến đầu đoạn m boot +3 8 Tên công ty hay version. +0Bh 2 SectSiz Số byte 1 sector < Start of BPB. +DH 1 ClustSiz Số sector mỗi cluster. +Eh 2 ResSecs Số sector dành riêng (sector tr−ớc FAT). +10h 1 FatCnt Số bảng FAT. +11h 2 RootSiz Số đầu vào tối đa cho Root (32 byte cho mỗi đầu vào). +13h 2 TotSecs Tổng số sector trên đĩa (hay partition). +15h 1 Media Media descriptor đĩa (giống nh− byte đầu bảng FAT. +16h 2 FatSize Số l−ợng sector cho một bảng FAT < end of BPB . +18h 2 TrkSecs Số sector trên mỗi track. +1Ah 2 HeadCnt Số đầu đọc ghi. +1Ch 2 HindSec Số sector dấu mặt (đ−ợc dùng trong cấu trúc 10
- www.updatesofts.com partition). +1Eh Đầu đoạn m trong Boot sector. +1Ch 4 HindSec Số sector dấu mặt (đ đ−ợc điều chỉnh lên số 32 bit) +20h 4 TotSecs Tổng số sector trên đĩa nếu giá trị ở offset 13h bằng 0. +24h 1 PhsDsk Số đĩa vật lí (0: đĩa mềm, 80h: đĩa cứng) +25h 1 Resever Dành riêng. +26h 1 Dos4_ID Kí hiệu nhận diện của DOS 4.xx (có giá trị 29h). +27h 4 Serial Một số nhị phân 32 bit cho biết Serial number. +2Bh Bh Volume Volume label. +36h 8 Reserve Dành riêng. +3Eh Đầu đoạn m ch−ơng trình. Đối với DOS 4.xx, do số l−ợng sector quản lí đ−ợc không còn nằm trong giới hạn số 16 bit, do đó giá trị trong offset 13h đ trở nên ‘chật hẹp’. Bắt đầu từ DOS 4.xx, cấu trúc của bảng có một số sửa đổi và bổ xung nho nhỏ, tuy vậy, vẫn không làm mất đi cấu trúc tr−ớc đó. ở đây chỉ có một điểm cần l−u ý là giá trị tổng số sector trên đĩa, nếu số sector vẫn còn là một số 16 bit, vùng ở offset 13h vẫn còn dùng đến, trong tr−ờng hợp ng−ợc lại, vùng này phải đ−ợc gán là 0 và giá trị mới đ−ợc l−u giữ tại offset 20h (dễ thấy các đĩa mềm vẫn có nội dung nh− tr−ớc đây). b. Đoạn m: do Boot sector chỉ chiếm đúng một sector, nghĩa là chỉ có đúng 512 byte, trừ đi cho bảng tham số BPB, phần còn lại vẫn còn quá ít cho một ch−ơng trình tự xoay xở làm đủ mọi việc. Các đoạn m sau d−ới DOS đều làm các công việc sau đây: + Thay lại bảng tham số đĩa mềm (ngắt 1Eh). + Định vị và đọc sector đầu tiên của Root và địa chỉ 0:0500h. + Dò tìm và đọc hai file hệ thống vào nếu có. Có thể biểu diễn bằng l−u đồ sau Thay ngắt 1Eh Đọc sector root vào ? SYS > Non system disk Nạp file hệ thống vào JMP FAR 070:0 2/ FAT (file allocation table) : Đây là một trong hai cấu trúc quan trọng nhất (cấu trúc thứ hai là Root) mà DOS khởi tạo trong quá trình format logic đĩa. Cấu trúc này dùng để quản lí file trên đĩa cũng nh− cho biết sector nào đ hỏng. ở mức này DOS cũng đ−a ra một số khái niệm mới : a. Cluster: Khi đĩa đ−ợc format fogic, đơn vị nhỏ nhất trên đĩa mà DOS có thể quản lí đ−ợc là sector (theo DOS tự qui định - kích th−ớc của một sector cũng đ cố định là 512 byte). Nh− thế, DOS có thể quản lí từng sector một xem nó còn dùng đ−ợc hay không. Tuy nhiên, một đĩa có dung l−ợng cao (th−ờng là đĩa cứng), số sector quá lớn không thể quản lí theo cách này mà thay vào đó, DOS đ−a ra một khái niệm Cluster: là tập hợp nhiều sector, do đó, thay vì quản quản lí nhiều sector, DOS bây giờ chỉ quản lí trên các cluster. Rõ ràng số l−ợng cluster sẽ giảm đi nhiều nếu ta tăng số l−ợng sector cho một cluster. b. Khái niệm về FAT: Vấn đề phức tạp và then chốt của việc quản lí file trên đĩa là làm sao quản lí đ−ợc sự thay đổi kích th−ớc các file. Đây là một điều tất nhiên vì khi làm việc với máy, đòi hỏi ta phải truy xuất đến file trên đĩa. 11
- Giả sử, có một file có kích th−ớc 2250 byte đ−ợc chứa trên đĩa có dung l−ợng 1.2 Mb (đối với loại đĩa này, một cluster chỉ là một sector), ta phải dùng tới 5 cluster để chứa file này, 4 cluster đầu tiên đ chứa 2048 byte, sector còn lại chỉ chứa 2250 - 2048 = 202 byte (vì rõ ràng, ta không thể ghi một khối nhỏ hơn một sector). Tiếp theo, file thứ hai đ−ợc ghi lên 7 sector kế đó. Bây giờ, vấn đề sẽ khó khăn nếu ta muốn bổ xung thêm 460 byte vào file đầu. Làm thế nào cho tối −u ? Rõ ràng, ta chỉ có thể bổ xung vào sector cuối file một thêm 512 - 202 = 310 byte, nh− thế vẫn d− lại 460 - 310 = 150 byte mà không biết phải để vào đâu. Ghi vào sector thứ sáu chăng ? Không thể đ−ợc vì sector này đ đ−ợc dành cho file thứ hai rồi. Cách giải quyết t−ởng chừng đơn giản là dời toàn bộ file này xuống một sector . Tuy nhiên, đây cũng không phải là một ph−ơng pháp tối −u vì nếu file thứ hai chiếm đến 1Mb. Để ghi thêm 150 byte mà cần phải dời (thực chất là phải đọc/ghi lại) đi 1Mb thì thật là quá tốn kém và không thiết thực chút nào. Ph−ơng pháp giải quyết tốt nhất đ đ−ợc DOS đề nghị: dùng một bảng l−u trạng thái các sector (FAT) cho phép DOS biết đ−ợc sector nào còn dùng đ−ợc, sector nào đ dùng do đó, dễ tìm đ−ợc một sector nào đó còn trống để phân bổ cho file mới. Nh−ng để quản lí những sector nh− thế cần quá nhiều byte cho FAT. Giả sử một đĩa cứng có dung l−ợng 32 Mb sẽ có khoảng 64 Kb sector (32Mb/512byte). Nếu một sector cần phải tốn đến 2 byte để quản lí thì phải mất 2*64=128Kb cho bảng FAT. Thế nh−ng, để tiện cho việc truy xuất, phần lớn FAT sẽ đ−ợc tải vào bộ nhớ trong, nh− thế kích th−ớc quá lớn cũng làm giảm đi tốc độ truy xuất. Vì vậy, đây cũng là lý do mà DOS đ đ−a ra khái niệm cluster nhằm giảm bớt đáng kể kích th−ớc của FAT. Là một sản phẩm của DOS, họ có toàn quyền định đoạt để có bao nhiêu sector cho một cluster, do vậy, số này sẽ thay đổi tuy thuộc vào dung l−ợng của đĩa sao cho tối −u nhất. Với các đĩa mềm, th−ờng số sector cho một cluster từ 1 đến 2 sector, trên đĩa cứng, con số này là 4 hay 8. c. Đánh số sector - đánh số cluster: Nh− ta đ biết, bộ điều khiển đĩa tham chiếu một sector trên đĩa thông qua 3 tham số: Cylinder, Head, và Sector (vì vậy, đôi khi nó còn đ−ợc biết d−ới tên gọi hệ 3 trục toạ độ). Tuy nhiên, hệ trục này lại không thuận lợi cho ng−ời sử dụng vì họ chẳng cần phải biết cấu trúc chi tiết của đĩa: gồm bao nhiêu Track, bao nhiêu head, cũng nh− bao nhiêu sector trên một Track ra sao. Để tránh sự bất tiện này, DOS tiến hành định vị dữ liệu trên đĩa chỉ theo một chiều: sector. DOS đơn giản là đánh số sector lần l−ợt bắt đầu từ sector 1, Track 0, head 0 cho đến hết số sector trên track này, rồi chuyển sang sector 1 của Side 1. Tất cả các sector của một Cylinder sẽ đ−ợc đánh số tuần tự tr−ớc khi DOS chuyển sang track kế. Việc đánh số này thực chất cũng nhằm tối −u việc di chuyển đầu đọc của đĩa, khi đ hết sector trên track này mới chuyển đầu đọc sang track kế. (Vì lí do này, một số phần mềm đ tìm cách dồn file lại trên các sector liên tiếp nhằm tăng tốc độ truy xuất cũng nh− khả năng khôi phục file khi bị sự cố nh− SpeedDisk của Norton Untility). Cách đánh số nh− vậy đ−ợc gọi là đánh số sector logic, khác với sector vật lí, sector logic bắt đầu đếm từ 0. Một khi sector đ đ−ợc đánh số, cluster cũng đ−ợc đánh số theo. Nh− ta đ biết: FAT chỉ quản lí những cluster để l−u chứa dữ liệu nên cluster bắt đầu đ−ợc đánh số từ những sector đầu tiên của phần dữ liệu. Nếu đĩa đ−ợc qui định 2 sector cho một cluster thì hai sector đầu tiên của phần dữ liệu (phần bắt đầu ngay sau Root) sẽ đ−ợc đánh số là 2, hai sector kế tiếp là cluster 3 và cứ thế cho đến hết. Vì vậy, nếu một đĩa có 15230 cluster cho phần dữ liệu thì sector cuối cùng của đĩa sẽ đ−ợc đánh số 15231. d. Nội dung của FAT: Mỗi cluster trên đĩa đ−ợc DOS quản lí bằng một entry (đầu vào), hai entry đầu tiên đ−ợc dùng để chứa thông tin đặc biệt: byte nhận dạng (đây cũng là lí do cluster đ−ợc đánh số từ 2), entry thứ 3 chứa thông tin về cluster 2, cứ thế tiếp tục Khi format logic đĩa, trong khi xây dựng FAT, DOS sẽ lần l−ợt tiến hành đọc từng sector lên, nếu gặp lỗi ứng với cluster nào, cluster đó sẽ đ−ợc đánh dấu là hỏng. Khi quản lí file, làm sao DOS có thể biết những cluster nào là của file nào? Rất đơn giản: giá trị entry của cluster này chứa giá trị là số thứ tự entry tiếp theo nó, cứ thế, các cluster của file 12
- www.updatesofts.com tạo thành một chuỗi (chain) cho đến khi gặp dấu hiệu kết thúc. Tùy theo kích th−ớc của entry là 12 hay 16 bit, giá trị của cluster có thể biến thiên theo bảng : Giá trị ý nghĩa 0 Cluster còn trống, có thể phân bổ đ−ợc. (0)002-(F)FEF Cluster đang chứa dữ liệu của một file nào đó (0)002 giá trị của nó là số cluster kế tiếp trong chain (F)FF0-(F)FF6 Dành riêng không dùng (F)FF7 Cluster hỏng (F)FF8-(F)FFF Cluster cuối cùng của chain Một ví dụ nhằm minh họa chain trong FAT: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 ID FF 03 04 05 FF 00 00 09 0A 0B 15 00 00 00 00 10 00 00 00 00 00 16 17 19 F7 1A 1B FF 00 00 00 00 Trong ví dụ trên, ‘entry’ 0 và 1 đ−ợc dành riêng cho byte nhân diện: FDh (đĩa 360Kb), giá trị của cluster 2 trỏ đến cluster 3, giá trị của cluster 3 trỏ đến cluster 4 cho đến khi cluster 5 chứa giá trị là 0FFh cho biết đ là cuối file, cluster 6 và 7 có giá trị 0 cho biết hai cluster này ch−a dùng tới, có thể phân bổ nếu cần. Cluster 18 có giá trị 0F7h cho biết đ đánh dấu bỏ. Tuy nhiên, ở đây lại xuất hiện một câu hỏi khác: làm sao xác định cluster nào bắt đầu một file? (cũng là đầu vào một chain) và kích th−ớc thật sự của file (vì rõ ràng sector cuối cùng không dùng hết). Điều này sẽ đ−ợc DOS đề cập đến trong cấu trúc tiếp theo - cấu trúc Root. e. Phân loại FAT - Định vị cluster: Giả sử ta có một đĩa 360 Kb, có khoảng 720 sector, nếu sử dụng 2 sector cho một cluster, và nh− thế tối đa cũng chỉ 720/2=360 cluster. Để quản lí số l−ợng entry không lớn lắm này, ta phải cần đến một entry bao nhiêu bít ? Rõ ràng, với kích th−ớc một byte, ta không thể quản lí đ−ợc vì giá trị tối đa mà một byte có thể biểu diễn đ−ợc lên tới tối đa 255 < 360. Nh−ng nếu dùng một word để biểu diễn thì lại quá thừa vì giá trị tối đa của nó lên tới 65535. Tất nhiên là quá lớn so với 360 cluster mà ta định biểu diễn. Cách tốt nhất là lấy kích th−ớc trung gian: 12bit (một byte r−ỡi). Rõ ràng, kích th−ớc này rất xa lạ với mọi ng−ời, kể cả những thảo ch−ơng viên hệ thống vì chỉ có khái niệm byte, bit, word hay thậm chí double word mà thôi. Dù vậy, khái niệm FAT12 bit này vẫn đ−ợc dùng cho đến nay do tính hiệu quả của nó trên các đĩa có dung l−ợng nhỏ. Với 12 bit có thể quản lí tối đa 4095 cluster, số này không phải là nhỏ. Tuy nhiên, với sự ra đời của các đĩa cứng dung l−ợng cao: 20Mb, 40 Mb đ làm xuất hiện nh−ợc điểm của FAT12: chỉ quản lí tối đa 4095 cluster, do đó với số l−ợng sector trên đĩa càng nhiều thì chỉ có một cách giải quyết là tăng số l−ợng sector trong một cluster. Nh−ng cách này cũng không phải là tối −u vì số byte cấp phát thừa cho 1 file sẽ tăng lên nhanh khi số sector trong cluster tăng lên. Vì lí do này, FAT 16 bit đ ra đời và số l−ợng cluster quản lí đ−ợc đ tăng lên 65535 cluster. Với sự xuất hiện của hai loại FAT, vấn đề lại trở nên phức tạp: cách định vị hai loại FAT này hoàn toàn khác nhau. Tuy vậy có thể tính toán nh− sau : * Đối với FAT 16 bit: mỗi entry của cluster chiếm hai byte nên vị trí của cluster tiếp theo sẽ bằng giá trị cluster hiện thời nhân hai. * Đối với FAT 12 bit: vì mỗi entry chiếm 1.5 byte nên vị trí của cluster tiếp theo trên FAT bằng giá trị cluster hiện thời nhân với 1.5. Nh−ng giá trị tiếp theo phải đ−ợc tính lại vì nó chỉ chiếm 12 bit trong khi giá trị lấy ra là 1 word (trong các lệnh máy, rất tiếc không có lệnh nào cho phép lấy một giá trị 12 bit cả). Cách giải quyết nh− sau : + Nếu số thứ tự số cluster là chẵn, giá trị thực tế là 12 bit thấp. 13
- + Nếu số thứ tự số cluster là lẻ, giá trị thực tế là 12 bit cao. Tất cả các đĩa mềm và những đĩa cứng có dung l−ợng d−ới 12Mb vẫn còn dùng FAT 12 bit. Đoạn m sau minh họa cách định vị cluster: LocateCluster proc near ;Chức năng: tiến hành định giá trị của cluster kế trong FAT_Buffer đ−a vào số cluster và ;loại FAT trong biến FAT_type, bit 2 của biến này = 1 cho biết loại FAT là 16 bit. ;Vào SI = số cluster đ−a vào. ;Ra DX = số cluster tiếp theo. mov AX, 3 test FAT_type ;FAT thuộc loại nào je FAT_12 ;Nếu 12bit sẽ nhân với 3 inc AX ;Nếu 16bit sẽ nhân với 4 FAT_12: mul SI shr AX, 1 ;Chia lại cho 2 để ra đúng số mov BX, AX mov DX, FAT_buffer[BX] ;DX=giá trị của cluster kế test FAT_type, 4 ;FAT thuộc loại nào? jne FAT_16 ;Nếu là FAT 12 sẽ tính tiếp mov ch, 4 test SI, 1 ;Cluster đ−a vào là chẵn hay lẻ je chan shr DX, CL ;Chuyển 4 bit cao thành thấp Chan: and DH, 0Fh ;Tắt 4 bit cao FAT_16: ret Locate_cluster endp (Trích PingPong virus). 3/ Root directory : Là cấu trúc bổ xung cho FAT và nằm ngay sau FAT. Nếu FAT nhằm mục đích quản lí ở mức thấp: từng sector, xem nó còn dùng đ−ợc hay không, phân phối nếu cần thì Root directory không cần quan tâm mà chỉ nhằm quản lí file, một khái niệm cao hơn, mà không cần biết nó gồm những sector nào. Root có nhiệm vụ l−u giữ thông tin về file trên đĩa. Mỗi file đ−ợc đặc tr−ng bởi một đầu vào trong Root Dir. Không nh− FAT, mỗi entry của Root Dir có kích th−ớc xác định 32 byte l−u giữ những thông tin sau : Offset K/th−ớc Nội dung +0 8 Tên file, đ−ợc canh trái +8 3 Phần mở rộng, đ−ợc canh trái +0Bh 1 Thuộc tính file +0Ch 0Ah Dành riêng +16h 2 Thời gian tạo hay bổ xung sau cùng 18h 2 Ngày tạo hay bổ xung sau cùng 1AH 2 Số cluster bắt đầu của file trong FAT 1Ch 4 Kích th−ớc file (byte) 14
- www.updatesofts.com Thuộc tính file: mô tả thuộc tính mà file sẽ mang, những thuộc tính này là Read Only, Hidden, System, Volume, SubDir và Attrive. Các bit biểu diễn những thuộc tính này nh− sau : byte thuộc tính: + bit 0 = 1: file chỉ đọc. + bit 1 = 1: file ẩn. + bit 2 = 1: file hệ thống. + bit 3 = 1: Volume label + bit 4 = 1: SubDir. + bit 5 = 1: file ch−a đ−ợc backup. Entry đầu file trong FAT cũng đ−ợc l−u giữ tại đây cho phép tăng tốc độ tính toán và truy xuất file cũng nh− kích th−ớc file cho biết kích th−ớc cụ thể của từng file hơn là số cluster quá trừu t−ợng. Nội dung của th− mục gốc: có thể là một file hay một th− mục con (SubDir). Ta sẽ đi sâu vào sự khác nhau giữa th− mục gốc và th− mục con. Th− mục gốc luôn nằm trong vùng hệ thống, ngay sau FAT, kích th−ớc (số sector) dành cho Root đ−ợc tạo ra trong khi format logic và không thay đổi trong suốt quá trình sử dụng, do đó, số entry trong Root bị giới hạn. Ng−ợc lại, SubDir lại nằm trong vùng dữ liệu nên kích th−ớc không bị hạn chế, nó có thể đ−ợc tạo ra, thêm bớt, hủy nh− một file. Thực chất, SubDir là cấu trúc ‘lai’ giữa file và Root: nó có thể đ−ợc phân phối cluster để chứa dữ liệu, tăng giảm kích th−ớc nh− file, tuy nhiên, dữ liệu của nó lại là các entry nh− Root Dir. Chính cấu trúc của SubDir làm cho cấu trúc toàn th− mục nói chung không bị hạn chế (tât nhiên, cũng bị hạn chế do dung l−ợng đĩa) tạo thành một cấu trúc cây cho phép thi hành giải thuật truy xuất trên cây gọn và đầy hiệu quả. Cũng nh− những entry của FAT, entry của Root cũng mang những giá trị nào đó để chỉ ra entry này hoặc đ dùng, còn trống hay đ bỏ đi Kí tự đầu tiên của tên file phản ánh điều này. Nếu một entry bắt đầu bằng byte có giá trị: 0: entry còn trống ch−a đ−ợc dùng, do đó, cho phép DOS biết nó đ đạt tới entry cuối cùng. ‘.’ (dấu chấm): kí tự này ở byte đầu cho biết entry này dành riêng cho DOS, đ−ợc dùng trong cấu trúc th− mục con. 0E5: kí tự sigma này thông báo cho DOS biết entry này của một file bị xóa. Khi xóa một file, thực chất DOS chỉ dánh dấu byte đầu tiên là 05E và xóa chain của file trong FAT. Do đó, có thể khôi phục lại file nếu ch−a bị file khác đè lên. Một kí tự bất kì: là tên một file, entry này đang l−u giữ thông tin về một file nào đó. 4/ Cấu trúc Partition table : Giá một đĩa cứng t−ơng đối mắc, mặt khác, dung l−ợng đĩa quá lớn cũng làm DOS không quản lí nổi (chỉ từ DOS 3.4 trở đi, mới có khả năng quản lí trên 32Mb), và nhất là muốn tạo một đĩa với nhiều hệ điều hành khác nhau, do đó đòi hỏi phải chia đĩa cứng thành từng phần gọi là Partition. Các cấu trúc đĩa mà ta trình bày trên chỉ hoàn toàn đúng đối với đĩa mềm, còn đĩa cứng, nếu đ đ−ợc chia thành các Partition thì cấu trúc trên vẫn đúng trong các Partition mà DOS quản lí. Các thông tin về điểm bắt đầu và kích th−ớc của từng partition đ−ợc phản ánh trong Partition table. Partition table này luôn tìm thấy ở sector đầu tiên trên đĩa (track 0, Side 0, sector 1) thay vì Boot sector (còn đ−ợc gọi d−ới tên Master boot). Nh− đ biết, sector này sẽ đ−ợc đọc lên đầu tiên và trao quyền điều khiển, do đó, ngoài Partition table, Master boot còn chứa đoạn m cho phép xác định partition nào đang hoạt động và chỉ duy nhất có một partition hoạt động mà thôi. Partition table nằm ở offset 01BE, mỗi partition đ−ợc đặc tr−ng bằng một entry 16 byte phản ánh những thông tin về nó. Mỗi entry có cấu trúc nh− sau: Offset Size Nội dung 15
- +0 1 Cờ hiệu boot: 0=không active; 80h=active +1 1 Số head bắt đầu +2 2 Số sector và Cylinder của boot sector +4 1 M hệ thống: 0=unknow; 1=FAT 12 bit; 4= 16 bit +5 1 Số head kết thúc. +6 2 Số sector và Cylinder của sector cuối cùng. +8 4 Số sector bắt đầu t−ơng đối. (low high) +0Ch 4 Tổng số sector trên partition.(low high) +10h Đầu vào của một partition mới hay tận cùng của bảng nếu có giá trị 0AA55. III - Các Tác Vụ Truy Xuất Đĩa. Các phần trên đ đề cập khá chi tiết đến cấu trúc vật lí cũng nh− cấu trúc logic của đĩa. Tất nhiên, các bạn sẽ hỏi: ứng với cấu trúc nh− thế, việc truy xuất phải nh− thế nào? Liệu rằng với hai cách tổ chức đĩa (vật lí và logic theo DOS), việc truy xuất có gì khác nhau? Phần sau đây sẽ giải quyết câu hỏi này. 1/ Mức BIOS (Basic Input/Output System): T−ơng ứng với mức cấu trúc vật lí, bộ điều khiển đĩa cũng đ−a ra các khả năng cho phép truy xuất ở mức vật lí. Các chức năng này đ−ợc thực hiện thông qua ngắt 13h, với từng chức năng con trong thanh ghi AH. Các chức năng căn bản nhất sẽ đ−ợc khảo sát sau đây: a. Reset đĩa: Vào: AH = 0 DL = số hiệu đĩa vật lí (0=đĩa A, 1=đĩa B 080=đĩa cứng). Nếu DL là 80h hay 81h, bộ điều khiển đĩa cứng sẽ reset sau đó đến bộ điều khiển đĩa mềm. Ra: Không Chức năng con này đ−ợc dùng để reset đĩa sau một tác vụ gặp lỗi. b. Lấy m lỗi của tác vụ đĩa gần nhất: Vào: AH = 1 DL = đĩa vật lí. Nếu DL=80h lấy lỗi của đĩa mềm DL=7Fh lấy lỗi của đĩa cứng. Ra: AL chứa m lỗi, thực chất của lỗi này, BIOS lấy ra từ vùng dữ liệu của nó tại địa chỉ 0:0441. Một số m lỗi th−ờng gặp đ−ợc liệt kê sau đây: M lỗi Mô tả 00h Không gặp lỗi 01h Sai lệnh hoặc lệnh không hợp lệ. 03h Ghi vào đĩa có dán nhn chống ghi. 04h Sector ID sau hay không tìm thấy. 05h Reset gặp lỗi. 10h Bad CRC: CRC không hợp lệ khi dữ liệu trên sector đ−ợc kiểm tra. 20h Controller gặp lỗi. 40h Seek gặp lỗi, track yêu cầu không tìm thấy. 80h Đĩa không sẵn sàng. 0BBh Lỗi không xác định. c. Đọc sector: 16
- www.updatesofts.com Vào: AH=2 DL=số hiệu đĩa (0=đĩa A, , 80h=đĩa cứng 0, 81h= đĩa cứng 1); DH=số đầu đọc ghi. CH= số track (Cylinder) CL=số sector. AL=số sector cần đọc/ghi (không v−ợt quá số sector trên một track). ES:BX=địa chỉ của buffer chứa thông tin. 0:078=bảng tham số đĩa mềm (đối với các tác vụ trên đĩa mềm). 0:0101=bảng tham số đĩa cứng (đối với các tác vụ trên đĩa cứng). Ra: CF=1 nếu có lỗi và m lỗi chứa trong AH. d. Ghi sector: Vào: AH=3 ES:BX trỏ đến buffer chứa dữ liệu còn lại t−ơng tự nh− chức năng đọc sector. Ra: CF=1 nếu có lỗi và m lỗi chứa trong AH. ở đây cần l−u ý đến quy −ớc phức tạp trong việc xác định track và số thứ tự sector trong thanh ghi CX. Rõ ràng, số sector trên một track là quá nhỏ (số sector trên một track lớn nhất th−ờng gặp hiện này cũng chỉ khoảng 34 (chiếm cao lắm khoảng 6 bit), trong khi đó, số l−ợng track trên đĩa có thể lớn, do đo, khó mà đ−a giá trị đó vào thanh ghi CH (chỉ biểu diễn tối đa 256 track mà thôi). Giải pháp là dùng thêm 2 bit trong CL là 2 bit cao cho số track, làm cho nó có khả năng biểu diễn đ−ợc số track tối đa lên đến 1024 track. Sơ đồ nh− sau: F E D C B A 9 8 7 6 5 4 3 2 1 0 c c c c c c c c C c S s s s s s 2 bit đ−ợc dùng nh− bit cao cho tr−ớc Theo sơ đồ này, 2 bit cuối của CL đ−ợc gán là 2 bit cao nhất thêm vào bên giá trị CH. Do đó, giá trị lớn nhất của sector (6 bit) là 3Fh=63 sector trên một track (cũng vẫn ch−a khai thác hết khả năng này) và bây giờ số track tối đa có thể quản lí đ−ợc lên đến 3FFh=1024 track. Chính vì cách quy −ớc này, việc thực hiện điều chỉnh cả hai giá trị track vả vào thanh ghi CX đòi hỏi một giải thuật khéo léo. Đoạn ch−ơng trình sau sẽ minh họa cách giải quyết nay: Ready_CX proc near :Chức năng: cho giá trị 2 biến track và sector vào thanh CX chuẩn bị cho tác vụ đọc ghi ;sắp tới. Push DX ;Cất thanh ghi DX mov DX, track ;DX=giá trị track trong các bit ;từ 0 tới 9 xchg DH, DL ;DH chứa 8bit thấp, DL chứa 2bit ;cao mov CL, 5 ;tuy nhiên lại nằm ở bit 0 và 1 shl DL, CL ;Cần đẩy chúng sang trái 6 vị trí or DL, sector ;Đ−a giá trị sector vào DL 17
- mov CX, DX ;CX đ làm xong pop DX ;Lấy lại giá trị DX ret Ready_CX endp e. Verify sector: Chức năng này cho phép kiểm tra CRC của các sector đ−ợc chọn. Vào: AH=4 Các thanh ghi nh− c và d Ra: CF=1 nếu có lỗi và m lỗi chứa trong AH. 2/ Mức DOS : Các chức năng của ngắt 13h cho phép đọc bất kì một sector nào trên đĩa. Tuy nhiên, do các quy định thanh ghi phức tạp, nhiều yếu tố ảnh h−ởng (track, head, sector), các chức năng này không đ−ợc ng−ời sử dụng −a chuộng lắm. Thay vào đó, DOS đ cung cấp một cách truy xuất đĩa khác rất thuận lợi cho ng−ời sử dụng vì tính đơn giản và hiệu qủa. Chức năng đọc và ghi đĩa d−ới DOS đ−ợc phân biệt bởi hai ngắt 25h và 26h, tham số đ−a vào bây giờ chỉ còn là sector logic. Nh−ng nh−ợc điểm của nó trên các đĩa cứng có chia partition: nó chỉ cho phép truy xuất các sector bắt đầu từ Boot sector của partition đó. Để tiện việc gọi tên đĩa, DOS không xem các đĩa mềm đ−ợc đánh số từ 0 đến 7Fh và đĩa cứng bắt đầu từ 80h nh− BIOS mà thay vào đó, gọi các đĩa theo thứ tự các chữ cái từ A đến Z. Cách đánh số này làm cho ng−ời sử dụng dễ hình dung ra ổ đĩa đ−ợc truy xuất. Các tham số cho chức năng này nh− sau: Vào: AL=số đĩa (0=A, 1=B, ) CX=số l−ợng sector cần đọc/ghi DX=số sector logic bắt đầu. DS:BX=địa chỉ của buffer chứa dữ liệu cho tác vụ đọc/ghi Ra: Lỗi nếu CF=1, m lỗi ch−a trong AX. Ng−ợc lại, tác vụ đọc/ghi đ−ợc thực hiện thành công, các giá trị thanh ghi đều bị phá hủy, trừ các thanh ghi phân đoạn và một word còn sót lại trên stack. Các ngắt này vẫn bị hai nh−ợc điểm gây khó chịu cho ng−ời dùng. Tất cả các thanh ghi đều bị thay đổi, do vậy, tr−ớc khi gọi chức năng này, nên cất những thanh ghi nào cần thiết. Mặt khác, khi thực hiện xong, DOS lại để lại trên stack một word sẽ gây lỗi cho ch−ơng trình nếu không để ý đến. Đoạn ví dụ sau đọc Boot sector của đĩa A bằng ngắt 25h. ReadBoot proc near ;đọc Boot sector của đĩa A vào MyBuffer mov AL, 0 ;Đĩa A mov DX, 0 ;Sector 0 mov CX, 1 ;Đọc một sector lea BX, MyBuffer ;DS:BX trỏ đến MyBuffer int 25h pop DX ;Lấy lại một word trên stack ret ReadBoot endp Nếu để ý, ta sẽ thấy số sector logic đ−ợc đặt trong một thanh ghi 16 bit, nghĩa là số sector tối đa cũng chỉ đạt tới 65535. Nếu số byte trên sector vẫn là 512 byte thì dung l−ợng đĩa mà DOS quản lí đ−ợc chỉ có 32Mb dù số l−ợng cluster lớn nhất mà DOS quản lí có thể gấp 4 hoặc 8 lần. 18
- www.updatesofts.com Nh−ợc điểm này cần phải đ−ợc khắc phục tr−ớc sự cạnh tranh khốc liệt giữa các hệ điều hành. Bắt đầu từ DOS 4.xx, DOS đ mở rộng số sector logic từ 16 bit lên 32 bit và vẫn t−ơng thích hoàn toàn với các version tr−ớc đó. Sự t−ơng thích này nh− sau: nếu CX=-1: số sector lớn nhất của DOS, dạng thức của DOS 4.xx sẽ đ−ợc áp dụng. Lúc này, DS:BX sẽ là giá trị của Control Package, một cấu trúc gồm 10 byte - chứa các thông tin về sector ban đầu, số sector cần đọc Cấu trúc của Control Package nh− sau: Offset Kích th−ớc Nội dung 0 4 Số sector logic ban đầu 4 2 Số sector cần đọc/ghi 6 4 Địa chỉ của buffer dữ liệu Lỗi của chức năng mở rộng này t−ơng tự nh− các version tr−ớc. Tuy vậy, nếu bạn không dùng cấu trúc 32 bit nh− trên để truy xuất những partition có hơn 65535 sector cũng bị gặp lỗi. Lỗi trả về có thể là 2 (Bad address mark) hay 7 (Unknow Media). Lẽ dĩ nhiên DOS đ tạo thuận tiện cho ng−ời sử dụng nh−ng ít ai chịu thỏa mn những yêu cầu của mình. Rõ ràng, khi truy xuất đĩa ta phải biết loại của nó, mặt khác, làm sao ta có đ−ợc những thông tin quan trọng về đĩa, xem FAT của nó gồm bao nhiêu sector, Root Dir bắt đầu từ đâu chẳng hạn.Toàn những thông tin quan trọng. Thực tế, cũng đ nhiều ng−òi tự làm bằng cách đọc boot sector lên và sử dụng phần BPB để tính toán. Song cách này đem lại nhiều phức tạp trong vấn đề tính toán, đó là ch−a kể những đĩa mà boot sector chứa ‘rác’ thay cho dữ liệu ta cần. DOS cũng không có một tài liệu công bố chính thức nào đề cập đến vấn đề này. Tuy nhiên, trong quá trình nghiên cứu, những ng−ời thảo ch−ơng viên giàu kinh nghiệm phát hiện một chức năng của DOS (ngắt 21h) cho phép lấy những thông tin này. Từ đây trở đi, những chức năng tự ng−ời sử dụng phát hiện đ−ợc sẽ gọi là Undocumented (tài liệu không đ−ợc công bố chính thức). Chức năng này là: Vào: AH=32h DL=đĩa (0=ngầm định, 1=A ) Ra: AL=0 nếu đĩa hợp lệ 0FFh nếu đĩa không hợp lệ DS:BX là địa chỉ của bảng tham số đĩa của đĩa đ−ợc chỉ định. Cấu trúc của bảng tham số đĩa nh− sau: Offset Size Nội dung +0 1 Số hiệu đĩa (0=A, 1=B ) +1 1 Số hiệu con từ Device Driver +2 2 Số byte trong một sector +4 1 Số sector trong một cluster +5 1 Cluster to sector shift (cluster là 2 mũ số sector) +6 2 BootSiz: Số sector dành riêng +8 1 Số bảng FAT. +9 2 MaxDir: số đầu vào tối đa trong Root +0B 2 Số sector ứng với cluster #2 +0D 2 Tổng số cluster + 2 +0F 1 Số sector cần cho 1 bảng FAT. +10 2 Sector bắt đầu Root. +12 4 Off Seg: địa chỉ của device header +16 1 Byte media descriptor +17 1 Cờ access: 0 nếu đĩa đ truy xuất. +18 4 Off Seg: địa chỉ của bảng tham số kế 19
- cuối bảng nếu là FFFFh Tuy vậy, cũng cần chú ý một điều: DOS sẽ không chịu trách nhiệm về những điều mình không công bố và do đó, nếu ch−ơng trình của bạn có sử dụng đến chức năng nào gây thiệt hại đáng kể cho đĩa của bạn thì đó là lỗi của bạn! Mặt khác, cấu trúc này có thể thay đổi trong t−ơng lai khi một version mới ra đời. Thực tế đ chứng minh điều này: bảng tham số đĩa trên đ có một sự thay đổi nhỏ trong cấu trúc (tuy vậy, cũng đ làm ‘Run time error’ cho một số ch−ơng trình). Do nhu cầu mở rộng khả năng quản lí đĩa, số sector dành cho một bảng FAT có thể v−ợt quá giới hạn 255 sector và do đó giá trị sector dành cho một bảng FAT tăng từ một byte lên một word. 3/ Các giải thuật chuyển đổi - định vị : a. Chuyển đổi: Sự tồn tại 2 cách truy xuất theo các yếu tố vật lí hoặc logic theo DOS làm phát sinh vẫn đề: sector a trên head b track c sẽ t−ơng ứng với sector logic bao nhiêu và ng−ợc lại, từ sector logic x nào đó làm sao tìm đ−ợc toạ độ vật lí của nó? Việc đánh số của cả hai cách đều đ−ợc khảo sát, do đó, cũng không phức tạp lắm để làm một công thức thay đổi từ hệ này sang hệ kia và ng−ợc lại. Sector_logic=(sect-1)+Hd*SecTrk+Cyl*SecTrk*HdNo Trong đó: Sect : số sector hiện thời theo BIOS SecTrk : số sector trên một track Cyl : số Cylinder hiện thời Hd : số head hiện thời theo BIOS HdNo : số đầu đọc của đĩa Chú ý là công thức trên chỉ đúng nếu Boot sector cùng nằm ngay tại track 0, head 0 và sector 1, nghĩa là việc đánh số của cả hai phải bắt đầu cùng một gốc. Nếu trên partition, phải chú ý đến giá trị của các sector dấu mặt (hidden sector). Để tiến hành chuyển đổi ng−ợc lại, ta cũng có công thức: Sect=SecLog mod SecTrk+1 Dh=(SecLog/SecTrk) mod HdNo Cyl=SecLog/(SecTrk*HdNo) Trong đó: Sect= sector tính theo BIOS HD= head tính theo BIOS Cyl= Cylinder tính theo BIOS SegLog= số sector logic HdNo= số đầu đọc của đĩa Ba tham số của ngắt 13 cũng đ−ợc chuyển đổi, tuy nhiên, vẫn phải bảo đảm đánh số cùng gốc và điều chỉnh lại nếu không cùng gốc. Việc chuyển đổi không chỉ xảy ra giữa BIOS và DOS mà còn xảy ra ngay chính trong DOS. Chính vì quá nhiều khái niệm đ−a ra làm cho nó vô cùng phức tạp và đôi lúc cũng làm nản lòng những ng−ời muốn tự mình làm việc quản lí đĩa thay cho DOS. Dù đ đ−a ra khái niệm sector logic để tiện truy xuất, DOS lại đ−a ra khái niệm cluster để tiện việc quản lí. Việc chuyển đổi giữa hai khái niệm này cũng là điều nên biết. Việc chuyển từ cluster sang sector logic đòi hỏi phải biết đ−ợc số sector logic đầu tiên của vùng data. Nghĩa là phải biết số sector dành cho từng phần: FAT và Root Dir (có lẽ ta không nên đề cập đến số sector dành cho Boot sector). Ngoài ra, còn phải quan tâm đến các sector dành riêng (kể cả boot). Số sector dành cho Root Dir: RootSec=(RootSize*32)/SecSize Trong đó : 20
- www.updatesofts.com RootSec là số sector bắt đầu Root RootSize là entry tối đa dành cho Root SecSize là số byte trong một sector. Số sector dành cho FAT: FatSec=FatSize*FatCnt Trong đó: FatSec là số sector đầu FAT FatSize là số sector cho một FAT FatCnt là số FAT lúc này, số sector logic sẽ đ−ợc tính bởi SecLog=SecRev+FatSec+RootSec+(cluster-2)*ClusterSize với ClusterSize là số sector trong một cluster. Dễ thấy, các thành phần của việc chuyển đổi đều nằm trong bảng tham số đĩa. Việc chuyển đổi ng−ợc lại cũng t−ơng tự, nghĩa là cũng phải xác định sector logic đầu vùng data. Phần chuyển đổi này đ−ợc coi nh− phần bài tập dành cho các bạn trong b−ớc đầu làm quen với đĩa. b. Định vị cấu trúc logic đĩa: Vấn đề định vị ở đây đ−ợc nêu ra có vẻ hơi thừa vì mọi thông tin về bất kì phần nào cũng có thể lấy đ−ợc một cách nhanh chóng thông qua chức năng 32h của ngắt 21h. Nh−ng, rõ ràng ng−ời ta không thể quả quyết rằng cấu trúc này đúng trên mọi hệ điều hành DOS và nhất là cũng không dám quả quyết nó sẽ đúng trên mọi version. Mặt khác, tự tay định vị các phần của đĩa cứng là điều thú vị đấy chứ! Việc định vị nh− đ nói không dùng đến DOS, do đó, phải truy nhập và sử dụng các tham số của bảng BPB trên Boot sector. Chính DOS cũng đ làm điều này (nếu Boot sector quả thật chứa tham số của bảng này một cách chính xác) tr−ớc khi định vị bằng cách khác (thông qua Media byte). Việc định vị các phần chỉ đơn giản là định vị sector đầu FAT, sector đầu Root và sector đầu vùng data. Việc định vị sector đầu FAT t−ơng đối dễ dàng, nó cũng chính là giá trị của các sector dành riêng kể cả Boot sector. Việc định vị sector đầu Root bằng sector đầu FAT cộng với số sector trên hai bảng FAT. Việc định vị sector đầu vùng Data bằng sector đầu Root cộng với số sector dành cho Root. Đoạn ch−ơng trình sau minh họa việc đọc Boot sector từ đĩa A (giả sử có chứa bảng tham số đĩa) và tiến hành định vị. AnalysisBoot proc near ;Chức năng: định vị đầu vào mỗi phần trong vùnh system và chứa vào trong các biến ;sector_begin_FAT, sector_begin_root, sector_begin_data ;Boot sector đ−ợc đọc vào trong buffer My_Buffer mov AL, 0 ;Đĩa A mov DX, 0 ;Đoc sector 0 mov CX, 1 ;1 sector lea BX, my_buffer :DS:BX là địa chỉ buffer int 25h ;Đọc lấy 1 word trong pop DX ;Stack jnc cont1 jmp error cont1: mov AX, my_buffer[0Eh] ;Sector reserved mov sector_begin_FAT, AX 21
- xor DX, DX mov AL, my_buffer[10] ;Số FAT*sector/FAT =số sector xor AH, AH ;cho FAT mul my_buffer[16h] add AX, my_buffer[1Ch] ;sector dấu mặt add AX, my_buffer[Eh] ;sector dành riêng mov sector_begin_root, AX ;Sector đầu root đ tính xong mov sector_begin_data, AX ;Sector đầu data sẽ là giá trị này + mov AX, 20h ;số sector dành cho root mul my_buffer[11h] ;Số entry tối đa*số byte/entry mov BX, my_buffer[Bh] add AX, BX ;Làm tròn thành bội số byte dec AX ;Chia số byte trên sector. div BX add sector_begin_data, AX ;Sector đầu data đ đ−ợc tính ret analysis_boot endp sector_begin_FAT dw 0 sector_begin_root dw 0 sector_begin_data dw 0 my_buffer db 512 dup (0) 4/ Phân tích Boot : Các phần trên đ cung cấp cho các bạn khá chi tiết về cấu trúc logic cũng nh− các bảng tham số đĩa quan trọng của DOS. Bây giờ, các thông tin bổ ích đó sẽ giúp chúng ta lần l−ợt phân tích 2 đoạn m trong Partition table và trong Boot record. Việc hiểu biết t−ờng tận công việc của Boot record, dù chỉ cụ thể trên 1 version của DOS cũng giúp chúng ta có một cái nhìn khái quát và dễ tiếp cận với B-virus hơn. a. Partition table: Công việc chính của đoạn m trong Partition table gồm: + Chuyển chính ch−ơng trình của mình đi chỗ khác để dọn chỗ cho việc tải Boot record của Active partition vào. + Kiểm tra dấu hiệu nhận diện Boot record bằng 1 giá trị word ở off 01BEh (nếu là Boot record, giá trị này là 0AA55h). + Cung cấp bảng tham số của entry t−ơng ứng vào 0:7BE. + Chuyển quyền điều khiển cho Boot record vừa đọc. Partition table mà ta khảo sát d−ới hệ điều hành MSDOS trên đĩa cứng 40Mb đ−ợc chia làm 2 đĩa bằng FDISK: C có kích th−ớc 26Mb và D là 15Mb. Org 07C00h begin: ;Khởi tạo stack cli xor AX, AX mov SS, AX mov SP, 07C00h mov SI, SP push AX pop ES push AX 22
- www.updatesofts.com pop DS sti ;Chuyển ch−ơng trình sang vùng 0:0600 để dành chỗ cho Boot sector của partition đ−ợc ;đọc vào cld mov DI, 0600 mov CX, 100h repne movsw jmp 0:061DH ;Chuyển quyền điều khiển sang vùng mov SI, 07BEh ;mới, trỏ SI đến bảng tham số mov BL, 4 ;Kiểm tra xem partition nào là check: ;active (dựa vào boot_flag) cmp BL[SI], 80h je check_partition ;Nếu là active, chuyển sang cmp byte ptr [SI], 0 ;phần kiểm tra partition jne invalid ;có hợp lệ không add SI, 100h ;Hợp lệ kiểm tra tiếp dec BL ;partition kế jne check ;Nếu không có partition nào thỏa int 1Bh ;chuyển sang FCB BASIC Check_partition: mov DX, word ptr[SI] ;Đ−a giá trị định vị Boot sector mov CX, word ptr[SI+2] ;vào mov BP, SI Next_partition: ;Để đảm bảo tính hợp lệ, các partition cong lại phải không đ−ợc là active add SI, 10h dec BL je load_system ;Hợp lệ sẽ tải hệ thống vào cmp byte ptr[SI] ;? No active je Next_partition ;Kiểm tra tiếp invalid: mov SI, offset error1_mess ;Nếu không hợp lệ: sai next_char: lodsb cmp AL, 0 je loop push SI mov BX, 7 mov AH, Eh int 10h pop SI jmp Next_char loop: jmp loop 23
- load_system: mov DI, 5 ;Sẽ đọc lại 5 lần nếu lỗi Try: mov BX, 07C00h mov AX, 0201h push DI int 13h pop DI jne load_ok xor AX, AX int 13h dec DI jne Try mov SI, offset error2_mess jmp next_char Load_ok: mov SI, offset error3_mess mov DI, 07DFEh cmp word ptr [DI], 0AA55h ;Kiểm tra tính hợp lệ jne next_char ;của boot sector mov SI, BP jmp 0:07C00h error1_mess db ‘Invalid partition table’, 0 error2_mess db ‘Error loading operating system’, 0 error3_mess db ‘Missing operating system’, 0 reserved db offset reserved - offset begin dup (0) Partition1: bootflag1 db 80h ;Active headNo1 db 1 secCylBegin1 dw 1 System_ID1 db 4 ;DOS FAT 16 bit HeadEnd1 db 0 secCylEnd1 dw 6B91h RelSecs1 dd 11h TotalSec1 dd 0CD76h Partition2: bootflag2 db 0 ;No Active headNo2 db 0 secCylBegin2 dw 6C81h System_ID2 db 5 ;DOS FAT 16 bit HeadEnd2 db 4 secCylEnd2 dw 0C5D1h RelSecs2 dd 0CDEDh TotalSec2 dd 0727Ch 24
- www.updatesofts.com Partition3: bootflag3 db 0 headNo3 db 0 secCylBegin3 dw 0 System_ID3 db 0 HeadEnd3 db 0 secCylEnd3 dw 0 RelSecs3 dd 0 TotalSec3 dd 0 Partition4: bootflag4 db 0 headNo4 db 0 secCylBegin4 dw 0 System_ID4 db 0 HeadEnd4 db 0 secCylEnd4 dw 0 RelSecs4 dd 0 TotalSec4 dd 0 ID_disk dw 0AA55h b. Boot sector: công việc chính của Boot sector gồm: + Khởi tạo ngắt 1Eh (bảng tham số đĩa mềm) bằng bảng tham số trong Boot sector (nếu có điều kiện, các bạn có thể nên quan tâm đến sự thay đổi các tham số đĩa mềm qua version khác nhau của DOS). + Định vị các phần trên đĩa bằng bảng tham số BPB (nh− chúng ta đ khảo sát). + Đọc Root vào và kiểm tra sự tồn tại của hai file hệ thống. + Nếu có, tải hai file này vào và trao quyền điều khiển. Boot sector mà chúng ta sẽ phân tích là Boot sector trên đĩa mềm 360Kb đ−ợc format d−ới DOS 3.3 ;Chức năng: kiểm tra và nạp hệ điều hành nếu có ;Vào : không ;Ra : CH= media đĩa DL= số hiệu vật lí đĩa (0=đĩa A, 80h=đĩa cứng) BX= sector đầu vùng dữ liệu org 7C00h jmp sort begin ;Bảng tham số đĩa nop OEM db ‘MSDOS 3.3’ SectorSize dw 200h ClusterSize dw 2 ReservedSector dw 1 FatCnt db 2 25
- RootSize dw 70h TotalSector dw 2D0h Media db 0FDh FatSize dw 2 TrackSect dw 9 HeadCnt dw 2 HiddenSector dw 0 Reserved db 0Dh dup (0) ;Bảng tham số đĩa mềm cho ngắt 1Eh Parameter: No_use db 4 dup (0) EOT db 12h No_use db 4 dup (0) HeadSettleTime db 1 MotorStartup db 0 Begin: ;Khởi tạo các thanh ghi phân đoạn và Stack cli xor AX, AX mov SS, AX mov SP, 7C00h push SS pop ES ;Khởi tạo bảng tham số đĩa mov DX, 78h lds SI, SS:[BX] ;DS:SI trỏ đến bảng tham số push DS ;chuẩn của ROM BIOS push SI ;Giá trị cũ của tham số sẽ push SS ;đ−ợc trả lại nếu không tìm push BX ;đ−ợc hai file hệ thống mov DI, offset parameter mov CX, 0Bh cld Cont1: lodsb ;Những tham số nào của ROM có cmp ES:byte ptr[DI], 0 ;phần tử t−ơng ứng trong boot je cont0 ;bằng 0 sẽ đ−ợc copy lại mov AL, byte ptr[DI] Cont0: stosb mov AL, AH loop cont1 push ES pop DS ;Đặt lại ngắt 1Eh mov word ptr [BX+2] 26
- www.updatesofts.com mov word ptr [BX], offset parameter sti int 13h ;Reset lại đĩa ;Phần định vị các thành phần trong vùng hệ thống jb error1 ;Nếu gặp lỗi mov AL, FatCnt ;FatCnt*FatSize mul word ptr FatSize ;= số sector cho FAT add AX, HiddenSector ;+số sector dấu mặt add AX, ReservedSector ;+số sector dành riêng mov word ptr [07C3Fh], AX ;=sector đầu Root mov word ptr [07C37h], AX ;L−u vào sector đầu data mov AX, 20h ;Kích th−ớc 1 entry mul RootSize ;Số MaxEntry mov BX, SectorSize ;=số byte cho Root add AX, BX ;chia số byte 1 sector dec AX ;=số sector đầu data div BX add word ptr [07C37h], AX ;Phần kiểm tra 2 file hệ thống bằng cách đọc sector đầu Root vào địa chỉ 0:0500 rồi ;so sánh lần l−ợt 2 entry đầu tiên với hai tên file hệ thống trong Boot sector. mov BX, 0500h ;Buffer 0:0500h mov AX, word [7C3Fh] ;AX=sector đầu data call ChangeSectorToPhysic ;Chuẩn bị giá trị mov AX, 201h ;Chức năng đọc call ReadSetor ;Đọc một sector jb error2 ;Lỗi ? ;Phần kiểm tra 2 file hệ thống mov DI, BX ;ES:DI trỏ đến tên file mov CX, 0Bh ;hệ thống 1 mov SI, offset SysFile1 ;So sánh ? repe cmpsb jne error3 lea DI, [BX+20h] ;ES:DI trỏ đến tên file hệ mov SI, offset SysFile2 ;thống 2 mov CX, 0Bh ;So sánh ? repe cmpsb je cont2 Error3: mov SI, offset error3_mess ;Thông báo nếu không có Print: call Print_mess xor AH, AH ;Khôi phục lại các tham số int 16h ;của bảng tham số đĩa mềm pop SI pop DS 27
- pop word ptr [SI] pop word ptr [SI+2] int 19h ;Reboot Error1: mov SI, offset error1_mess jmp shor print Cont2: ;Lấy kích th−ớc của file hệ thống trong Root vừa đọc để tính ra số sector ;cần đọc vào. mov AX, word ptr [51Ch] xor DX, DX div SectorSize inc AL ;Tính số sector mov byte ptr [7C3Ch], AL ;ứng với kích th−ớc file mov AX, word ptr [7C37h] ;tìm đ−ợc mov BX, 700h ;Đọc vào buffer bắt 0:700h Cont4: mov AX, word ptr [7C37h] call ChangeSectorToPhysic mov AX, TrackSect sub AL, byte ptr [7C3Bh] inc AX cmp byte ptr [7C37h], AL ja cont3 mov AL, byte ptr [7C3Ch] Cont3: push AX call ReadSecto pop AX je error1 sub byte ptr [7C3Ch], AL je cont5 add word ptr [7C37h], AX add BX, AX jmp short cont4 Cont5: ;Chuyển tham số cho file hệ thống mov CH, Media mov DL, Disk mov BX, word ptr [7C3Dh] jmp 70:0 Print_mess proc near ;In một chuỗi ASCIIZ trong DS:SI lod sb or AL, AL ;? cuối chuỗi ASCIIZ je exit 28
- www.updatesofts.com mov AH, 0Eh mov BX, 7 int 10h ;In ra màn hình jmp short Print_loop Print_mess endp ChangeSectorToPhysic proc near ;Vào: AX= sector logic cần đổi ;Ra: Các giá trị t−ơng ứng Track, Head và sector đ−ợc tính và gán cho các biến ;word[7C39h], byte[7C2Ah], byte[7C3Bh] xor DX, DX div TrackSect inc DL mov byte ptr [7C3Bh], DL xor DX, DX div HeadCnt mov byte ptr [7C2A], DL mov word ptr [7C39], AX Exit: ret ChangeSectorToPhysic endp ReadSector proc near ;Chức năng: đọc sector có giá trị Track, head sector đ đ−ợc tính tr−ớc đó qua ;thủ tục ChangeSectorToPhysic ;Vào: AL = số sector ; ES:BX trổ đến buffer chứa dữ liệu ;Ra : STC nếu gặp lỗi mov AH, 2 mov DX, word ptr [7C39] mov CL, 5 shl DH, CL or DH, byte ptr [7C3Bh] xchg CL, CH mov DL, Disk mov DH, byte ptr [7C2A] int 13h ret ReadSector endp Error1_mess db 0Dh, 0Ah, ’Non-system disk or disk error’, 0 Error2_mess db 0Dh, 0Ah, ’Disk boot failure’, 0 File_sys1 db ‘IO.SYS’ File_sys2 db ‘MSDOS.SYS’ Reserved db 17 dup (0) Disk db 0 ID-Disk dw 0AA55h 29
- Đây chỉ là b−ớc phân tích một Boot sector đơn giản, đối với DOS 4.xx, khả năng quản lí đĩa đ−ợc mở rộng thêm (trên 32Mb), do đó, cũng tạo nên đôi phần phức tạp cho đoạn m định vị các vùng hệ thống trên đĩa. Dù sao, đây cũng là một đề tài thú vị mà các bạn có thể tự mình phân tích lấy. Một gợi ý nho nhỏ khác là theo dõi sự biến đổi các tham số đĩa mềm qua các thế hệ máy, qua các version của DOS và qua các phần mềm cho phép format đĩa. 30
- www.updatesofts.com b - virus Qua ch−ơng 1, các bạn đ đ−ợc cung cấp nhiều thông tin lí thú về đĩa và cũng đ phân tích xong các đoạn m trong Partition table cũng nh− Boot sector. Tát cả những điều đó cũng chỉ nhằm một mục đích duy nhất: giúp chúng ta nắm vững và phân tích tốt một B - virus. Để bắt đầu, chúng ta phải trả lời câu hỏi: Virus này từ đâu ra? I - Ph−ơng Pháp Lây Lan Nh− ta đ biết, sau quá trình POST, sector đầu tiên trên đĩa A (nếu không sẽ là C) đ−ợc đọc vào, một tác vụ kiểm tra nho nhỏ để tránh một lỗi: sector đó có thể không phải là một Boot sector hợp lệ, bằng cách kiểm tra giá trị nhận diện 0AA55 tại cuối sector. Nh−ng việc kiểm tra này cũng không tránh khỏi sơ hở nếu ai đó thay đoạn m trong Boot sector bằng một ch−ơng trình khác với ý đồ xấu và đó cũng chính là cách lây lan của một virus loại B. Đối với đĩa mềm, sector 0 luôn là Boot record, do đó, việc lây chỉ tiến hành đơn giản bằng cách thay Boot record trên track 0, Side 0, sector 1. Song trên đĩa cứng có chia các partition, mọi chuyện lại phức tạp hơn vì đầu tiên Master boot đ−ợc đọc vào, sau quá trình kiểm tra partition active, Boot sector t−ơng ứng mới đ−ợc đọc vào. Chính vì thế, các Hacker có quyền chọn một trong hai nơi. Nh−ng cả hai đều có nh−ợc điểm của mình. Đối với Partition table, −u điểm có vẻ rõ ràng: nó luôn luôn đ−ợc nạp vào vùng nhớ đầu tiên, cho dù sau đó hệ điều hành nào đ−ợc kích hoạt và vì B - virus hoạt động không t−ơng thích với một hệ điều hành nào mà chỉ thực hiện đối với đĩa. Mặt khác, nếu bất kì một phần mềm nào d−ới DOS dùng các ngắt 25h và 26h cũng không thể truy nhập đến Partition table, do đó nó tránh khỏi cặp mắt tò mò của nhiều ng−ời. Dù vậy, nó vẫn có khuyết điểm: phải chú ý đến Partition table, nghĩa là đoạn m đ−ợc thay thế không đ−ợc ghi đè vào bảng tham số này. Một xâm phạm dù nhỏ cũng sẽ ảnh h−ởng đến việc quản lí đĩa cứng nếu ng−ời sử dụng Boot máy từ đĩa mềm. Điều này cũng lí giải tại sao một số virus trong n−ớc không chú ý tới điều này và vì thế đ tạo ra lỗi: không kiểm soát đ−ợc đĩa C khi máy đ−ợc Boot từ A (NOPS virus). Đối với Boot sector lại khác, một virus chọn giải pháp Boot record thay cho Partition table có thể gặp thuận lợi trong việc sử dụng bảng tham số đĩa BPB, đoạn m lây cho đĩa mềm cũng sẽ đ−ợc dùng t−ơng tự cho đĩa cứng. Tuy nhiên lại phải tốn kém cho giải thuật định vị một partition boot đ−ợc, chính điều này lại gây cho nó một thất lợi: không lây đ−ợc trên đĩa cứng không có Active partition. Việc lựa chọn Partition table hay Boot sector vẫn là một vấn đề đang bàn ci của các virus (hay đúng hơn là giữa những nhà thiết kế virus), tuy nhiên hầu hết các virus sau này đều dùng Master boot hơn là Boot sector. Vấn đề then chốt mà virus cần phải giải quyết là Boot sector nguyên thủy của đĩa. Rõ ràng Boot này phải đ−ợc thay, nh−ng virus không thể làm thay mọi chuyện cho một Boot record vì thực sự nó đâu có biết Boot record nguyên thủy phải làm gì, biết đâu đó là một đoạn m khác nhằm một mục đích khác? Chính vì vậy, virus cũng không thể bỏ đ−ợc Boot sector. Thay vào đó, nó sẽ cất Boot này vào một chỗ nhất định nào đó trên đĩa và sau khi thi hành xong tác vụ cài đặt của mình, virus sẽ đọc và trao quyền cho Boot cũ. Mọi việc đ−ợc Boot cũ tiếp tục làm trông rất ‘bình th−ờng’. Nh−ng khó khăn lại xuất hiện: cất Boot record cũ ở đâu khi mà mọi chỗ trên đĩa đều có thể bị sửa đổi: FAT, ROOT và nhất là Data area. Cách giải quyết câu hỏi này cũng giúp chúng ta phân loại chi tiết hơn về B - virus. 31
- II - Phân Loại. Khó khăn trên đ−ợc B - virus giải quyết ổn thỏa theo hai h−ớng: cất Boot record lên một vị trí xác định trên mọi đĩa và chấp nhận mọi rủi ro mất mát Boot sector (do bị ghi đè) dù tất nhiên chỗ cất dấu này có khả năng bị ghi đè thấp nhất. H−ớng này đơn giản và do đó ch−ơng trình th−ờng không lớn. Chỉ dùng một sector thay chỗ Boot record và do đó đ−ợc gọi là SB - virus (Single B - virus). Mặt khác, có thể cất Boot sector này vào một nơi an toàn trên đĩa, tránh khỏi mọi sai lầm, mất mát có thể xảy ra. Vì kích th−ớc vùng an toàn có thể định vị bất kì nên ch−ơng trình virus th−ờng chiếm trên nhiều sector và đ−ợc chia thành hai phần: một phần trên Boot record, một trên đĩa (trên vùng an toàn). Vì đặc điểm này, nhóm này đ−ợc gọi là DB - virus (Double B - virus). 1/ SB - virus : Do tính dễ di chấp nhận mọi mất mát nên ch−ơng trình ngắn gọn chỉ chiếm đúng một sector. Thông th−ờng, SB - virus chọn nơi cất đấu Boot là những nơi mà khả năng bị ghi lên là ít nhất. Đối với đĩa mềm, các nơi th−ờng đ−ợc chọn là: + Nh− độc giả cũng biết, ít khi nào ta khai thác hết số entry trên th− mục gốc, trong khi đó DOS còn khuyến khích chúng ta dùng cấu trúc th− mục con để tạo cấu trúc cây cho dễ quản lí. Chính vì lí do này, số entry ở những sector cuối Root Dir th−ờng không đ−ợc dùng đến và những sector này là nơi lí t−ởng để cất giấu Boot record. + Khi phân phối cluster cho một file nào, DOS cũng bắt đầu tìm cluster trống từ đầu vùng data căn cứ vào entry của nó trên FAT, do đó, những sector cuối cùng trên đĩa cũng khó mà bị ghi đè lên. Đây cũng là nơi lí t−ởng để cất giấu Boot record. Đối với đĩa cứng, mọi chuyện xem ra lại đơn giản. Trên hầu hết các đĩa cứng, track 0 chỉ chứa Partition table (cho dù đĩa chỉ có 1 partition) trên sector 1, còn những sector còn lại trên track này đều không đ−ợc dùng đến. Do đó, các SB - virus và hầu hết DB - virus đều chọn nơi này làm chốn ‘n−ơng thân’. 2/ DB -virus : Một sector với kích th−ớc 512 byte (do DOS quy định) không phải là quá rộng ri cho những tay hacker nhiều tham vọng. Nh−ng việc mở rộng kích th−ớc không phải là dễ dàng, họ cũng đ giải quyết bằng cách đặt tiếp một Boot record ‘giả’ lên sector 1, track 0, Side 0. Boot record này có nhiệm vụ tải ‘hệ điều hành’ virus vào bên trong vùng nhớ rồi trao quyền. Sau khi cài đặt xong, ‘hệ điều hành’ mới tải Boot record thật vào. ‘Hệ điều hành‘ này phải nằm ở một ‘partition’nào đó ngay trong lòng DOS hay từ một phần khác trên đĩa cứng. Cách giải quyết này có thể là: Đối với đĩa cứng: những sector sau Partition table sẽ là chốn n−ơng thân an toàn hoặc giải quyết t−ơng tự nh− với đĩa mềm. Đối với đĩa mềm: qua mặt DOS bằng cách dùng những cluster còn trống để chứa ch−ơng trình virus. những entry t−ơng ứng với các cluster này trên FAT ngay sau đó sẽ bị đánh dấu ‘Bad cluster’ để DOS không còn ngó ngàng đến nữa. Ph−ơng pháp này tỏ ra hữu hiệu vì số l−ợng cluster đ−ợc dùng chỉ bị hạn chế bởi số l−ợng cluster tối đa của đĩa cứng còn dùng đ−ợc. Tuy nhiên, chính mặt mạnh này cũng là mật yếu của nó: dễ bị phát hiện bởi bất kì một phần mềm DiskMap (PCTOOLS, NDD ). Cho dù thế nào đi nữa ph−ơng pháp này vẫn đ−ợc −a chuộng cho các loại DB - virus vì tính t−ơng thích với mọi loại ổ đĩa. Ph−ơng pháp thứ hai có nhiều tham vọng hơn: v−ợt ra khỏi tầm kiểm soát của DOS bằng cách tạo thêm một track mới tiếp theo track cuối mà DOS đang quản lí (chỉ áp dụng đối với đĩa mềm). Một đĩa 360Kb có 40 track đ−ợc đánh số từ 0 đến 39 sẽ đ−ợc tạo thêm một track số 40 chẳng hạn. Điều này cũng tạo cho virus một khoảng trống rất lớn trên đĩa (9sector*1/2Kb = 4, 5Kb). Tuy thế, ph−ơng pháp này đ tỏ rõ nh−ợc điểm của nó trên các loại ổ đĩa mềm khác nhau. Các bộ điều khiển đĩa mềm khác nhau có thể có hoặc không có khả năng quản lí thêm track. Do đó, đ tạo ra lỗi đọc đĩa khi virus tiến hành lây lan (đĩa kêu cót két). 32
- www.updatesofts.com Cho dù là loại SB - virus hay DB - virus đi nữa, cấu trúc bên trong của chúng vẫn nh− nhau. Để có thể có cái nhìn đúng đắn về virus, chúng ta sẽ bắt đầu khảo sát B - virus bằng cách phân tích cấu trúc của nó. III - Cấu Trúc Ch−ơng Trình B - Virus. Do đặc điểm chỉ đ−ợc trao quyền điều khiển một lần khi Boot máy, virus phải tìm mọi biện pháp tồn tại và đ−ợc kích hoạt lại khi cần thiết - nghĩa là xét về mặt nào đó - nó cũng giống nh− một ch−ơng trình ‘Pop up’ TSR (Terminate and Stay Resident). Do vậy, phần ch−ơng trình virus đ−ợc chia làm hai phần: phần khởi tạo (install) và phần thân. Chi tiết từng phần đ−ợc khảo sát t−ờng tận sau đây: 1/ Phần install: Việc −u tiên hàng đầu là vấn đề l−u trú (Resident), không thể dùng đ−ợc các chức năng của DOS để xin cấp phát vùng nhớ (vì DOS cũng ch−a đ−ợc tải vào), virus đành phải tự mình làm lấy và trong thực tế việc này rất đơn giản. Theo sau vẫn đề l−u trú luôn luôn là việc chuyển toàn bộ ch−ơng trình virus (mà ta gọi là Progvi) sang vùng này tiến hành thay thế một loạt các ngắt cứng. Để bảo đảm tính ‘Pop up’ của mình một khi đĩa đ−ợc truy xuất, Progvi luôn chiếm ngắt 13h. Ngoài ra, để phục vụ cho công tác phá hoại, gây nhiễu, , Progvi còn chiếm cả ngắt 21h của DOS nữa. Sau khi đ install xong, Boot record cũ sẽ đ−ợc trả lại đúng địa chỉ và trao quyền. Đối với loại DB - virus, phần install sẽ tiến hành tải toàn bộ phần thân vào, ngay sau khi đ−ợc nạp, tr−ớc khi thi hành các b−ớc trên. Sự khác nhau này chỉ đơn giản là do kích th−ớc của nó quá lớn mà thôi. Sơ đồ của phần install có thể tóm tắt bằng sơ đồ khối sau: Đ tồn tại trong bộ nhớ ch−a? Yes No Đọc phần thân (nếu là Db - virus) Chuyển ch−ơng trình và l−u trú Chiếm các ngắt cứng (13h, 8, 9) Trả lại Boot record cũ JMP FAR 0:07C00h 2/ Phần thân: Là phần quan trọng của một virus, chứa các đoạn m mà phần lớn sẽ thay thế cho các ngắt. Có thể chia phần này làm 4 phần nhỏ ứng với 4 chức năng rõ rệt. + Lây lan: là phần chính của phần thân, thay thế cho ngắt 13h, có tác dụng lây lan bằng cách copy chính ch−ơng trình này vào bất kì một đĩa nào ch−a nhiễm. + Phá hoại: bất kì một virus nào cũng có đoạn m này vì một lí do đơn giản: không ai bỏ công sức để tạo ra một virus không làm gì cả, mà ng−ời tạo ra phải gánh lấy một phần trách nhiệm nếu bị phát hiện là tác giả. Phần phá hoại có thể chỉ mang tính hài h−ớc trêu trọc ng−ời sử dụng, thách đố về giải thuật ngắn gọn cho đến những ý đồ xấu xa nhằm hủy diệt dữ liệu trên đĩa. 33
- + Dữ liệu: để l−u chứa những thông tin trung gian, những biến nội tại, dùng riêng cho ch−ơng trình virus, cho đến những bộ đếm giờ, đếm số lần lây phục vụ cho công tác phá hoại. + Boot record: thực ra phần này có thể không nên kể vào ch−ơng trình virus vì nó thay đổi tùy theo đĩa mà không dính dáng, không ảnh h−ởng gì đến ch−ơng trình virus. Tuy nhiên, với một quan điểm khác, Progvi luôn phải đảm bảo đến sự an toàn của Boot sector, sự bảo đảm này chặt chẽ đến nỗi hầu nh− Boot sector luôn ‘cặp kè’ bên cạnh ch−ơng trình virus, trong bộ nhớ cũng nh− trên đĩa. Mặt khác, nếu kết luận Progvi không sử dụng đến Boot record là không đúng vì mọi việc định vị các phần trên đĩa, virus đều phải lấy thông tin trong BPB trên đĩa đối t−ợng. Vì vậy, Boot sector cũng đ−ợc xem nh− một phần không thể thiếu của ch−ơng trình virus. Khi mọi việc install đ đ−ợc làm xong, Boot record này đ−ợc chuyển đến 0:7C00h và trao quyền điều khiển. Để virus có thể tồn tại và phát triển, vẫn phải có một số yêu cầu về môi tr−ờng cũng nh− chính virus. D−ới đây, chúng ta sẽ phân tích các yêu cầu cần có ở một B - virus. IV - Các Yêu Cầu của B - Virus . 1/ Tính tồn tại duy nhất: Virus phải tồn tại trên đĩa cứng cũng nh− trong bộ nhớ, đó là điều không thể chối ci đ−ợc. Tuy nhiên, việc tồn tại quá nhiều bản sao của chính nó trên đĩa chỉ làm chậm qua trình Boot, mặt khác, nó cũng chiếm quá nhiều vùng nhớ, ảnh h−ởng đến việc tải và thi hành các ch−ơng trình khác. Đó là ch−a kể tốc độ truy xuất đĩa sẽ chậm đi đáng kể nếu có quá nhiều bản sao nh− thế trong vùng nhớ, Chính vì lí do này, một yêu cầu nghiêm ngặt đối với mọi loại B - virus là phải đảm bảo đ−ợc sự tồn tại duy nhất trên đĩa. Sự tồn tại duy nhất trên đĩa sẽ đảm bảo sự tồn tại duy nhất trong vùng nhớ sau đó. Tuy nhiên, với tốc độ tăng đáng kể về số l−ợng B - virus, hiện t−ợng 2 hay nhiều virus cùng ‘chia xẻ’ một đĩa tất nhiên sẽ xảy ra. Trong tr−ờng hợp này, việc kiểm tra sự tồn tại sẽ dẫn đến sự sai lệch và hậu quả 1 virus sẽ tạo bản sao chính nó nhiều lần trên đĩa, gây khó khăn cho việc sửa chữa sau này. 2/ Tính l−u trú : Không nh− F -virus, B - virus chỉ đ−ợc trao quyền điều khiển một lần duy nhất. Do đó, để đảm bảo đ−ợc tính ‘Popup’, nó phải có tính chất của một TSR, nghĩa là phải th−ờng trú. Song khi virus vào vùng nhớ, DOS ch−a đ−ợc trao quyền tổ chức Memory theo ý mình nên virus có quyền chiếm đoạt không khai báo bất kì một l−ợng vùng nhớ nào mà nó cần, DOS sau đó sẽ quản lí phần còn lại của vùng nhớ. 3/ Tính lây lan : Đây không phải là yêu cầu cần có mà chỉ phải có nếu virus muốn tồn tại và phát triển. Việc lây lan chỉ xảy ra trong quá trình truy xuất đĩa, nghĩa là virus sẽ chi phối ngắt 13h để thực hiện việc lây lan. 4/ Tính phá hoại : Không phải là tính bắt buộc nh−ng hầu nh− (nếu không nói là tất cả) mọi virus đều có tính phá hoại. Những đoạn m phá hoại này sẽ đ−ợc kích hoạt khi đến một thời điểm xác định nào đó. 5/ Tính gây nhiễm và ngụy trang : Khi bản chất của virus đ−ợc khảo sát t−ờng tận thì việc phát hiện virus không còn là vấn đề phức tạp. Do đó, yêu cầu ngụy trang và gây nhiễu ngày càng trở nên cấp bách để bảo đảm tính sống còn của virus. Việc gây nhiễu tạo nhiều khó khăn cho những nhà chống virus trong việc theo dõi ch−ơng trình để tìm cách khôi phục Boot, việc ngụy trang làm cho virus có một vẻ bề ngoài, làm cho khả năng phát hiện b−ớc đầu bị bỏ qua. 6/ Tính t−ơng thích : Không nh− F - virus, B - virus không phụ thuộc vào hệ điều hành nào (mặc dù những virus sau này quá lạm dụng khả năng của DOS). Tuy nhiên, vì đĩa có quá nhiều loại, chỉ riêng đĩa mềm cũng đ có loại 360Kb, 1.2Mb, cũng gây nhiều khó khăn cho virus trong việc thiết kế. Nó phải t−ơng thích - hiểu theo nghĩa lây lan đ−ợc - với mọi loại đĩa. Càng t−ơng thích bao nhiêu, khả năng tồn tại và lây lan sẽ cao bấy nhiêu. 34
- www.updatesofts.com Mặt khác, sự thừa kế của các bộ vi xử lí (8086 - 80x86) đ làm xuất hiện nhiều điểm dị đồng mặc dù tính t−ơng thích đ−ợc bảo đảm tối đa. Một hacker tài giỏi phải chú ý đến điều này. Một ví dụ đơn giản có thể kể ra: ở bộ vi xử lí 8088, có thể gán giá trị từ thanh ghi AX vào thanh ghi phân đoạn m CS bằng lệnh MOV CS, AX. Điều này không thể thực hiện đ−ợc trên các bộ vi xử lí khác. Các yêu cầu của một B - virus đ đ−ợc khảo sát xong. Nh−ng những kĩ thuật để biến các yêu cầu này thành hiện thực lại ch−a đ−ợc đề cập đến. Phần sau sẽ minh họa từng kĩ thuật này. V - Phân Tích Kĩ Thuật. Yêu cầu đầu tiên là phải đ−a ra kĩ thuật l−u trú - kĩ thuật sẽ ảnh h−ởng đến mọi tác vụ sau đó. 1/ Kĩ thuật l−u trú: Khi thực hiện xong ch−ơng trình POST, giá trị tổng số vùng nhớ vừa đ−ợc test (vùng nhớ cơ bản) sẽ l−u vào vùng Bios data ở địa chỉ 0:413h. Khi hệ điều hành nhận quyền điều khiển, nó sẽ coi vùng nhớ mà nó kiểm soát là giá trị trong địa chỉ này. Do đó, sau qua trình POST và tr−ớc khi hệ điều hành nhận quyền điều khiển, nếu “ai đó “ thay đổi giá trị trong địa chỉ này sẽ làm cho hệ điều hành mất quyền quản lí vùng nhớ đó. Tất cả các B - virus đều làm điều này, tùy theo kích th−ớc ch−ơng trình virus và buffer cho riêng nó, vùng nhớ cơ bản sẽ bị giảm xuống t−ơng ứng. Tuy nhiên, cho đến nay, hầu nh− không có virus nào chiếm hơn 7Kb cho một mình nó, nh−ng việc tòn tại nhiều loại virus trên 1 đĩa Boot sẽ làm tốn khá nhiều bộ nhớ và do đó cũng góp phần giảm tốc độ thực hiện. Đoạn m sau sẽ minh họa cho kĩ thuật này bằng cách giảm vùng nhớ đi 2 Kb: mov AX, 0 mov DS, AX ;DS: Bios data mov AX, word ptr [0413] ;AX= tổng memory co bản dec AX dec AX ;Giảm AX đi 2Kb mov word ptr [0413], AX ; Vùng nhớ đ bị giảm (Trích ch−ơng trình virus Stone) Về sau, kĩ thuật này bộc lộ nhiều nh−ợc điểm: khi gặp Warm Boot, quá trình test memory không đ−ợc thực hiện lại và do đó virus lại tự nó giảm kích th−ớc thêm một lần nữa. Quá trình Warm Boot nếu đ−ợc lặp đi lặp lại vài lần (nhất là khi các độc giả đang “nghiên cứu “về virus chẳng hạn) sẽ làm đầy vùng nhớ và đó sẽ là dấu hiệu “đáng ngờ “về sự xuất hiện của virus. Để giải quyết tr−ờng hợp này, tr−ớc khi tiến hành l−u trú, virus sẽ kiểm tra sự tồn tại của mình trong vùng nhớ, nếu không gặp một nhận dạng đáng kể nào, việc l−u trú mới đ−ợc thực hiện. 2/ Kĩ thuật kiểm tra tính duy nhất : Đầu tiên, chỉ có việc kiểm tra trên đĩa, một đĩa ch−a bị lây sẽ bị lây. Nh−ng, nh− đ đề cập ở trên, nh−ợc điểm của ph−ơng pháp l−u trú cũng đòi hỏi kĩ thuật này đ−ợc áp dụng vào việc kiểm tra vùng nhớ. Tuy vậy, vẫn có sự khác nhau giữa 2 cách kiểm tra này. Chúng ta sẽ xét lần l−ợt ở đây. a. Trên đĩa: Việc kiểm tra trên đĩa gặp nhiều điều phiền toái vì nó đòi hỏi phải thỏa mn 2 yêu cầu: + Thời gian kiểm tra: nếu mọi tác vụ đọc/ghi đều phải kiểm tra đĩa thì rõ ràng thời gian truy xuất sẽ bị tăng gấp đôi, gia tăng nguy cơ bị nghi ngờ. + Kĩ thuật kiểm tra: phải bảo đảm tính chính xác giữa một đĩa bị lây và một đĩa ch−a bị lây, cũng nh− bảo đảm tính trùng hợp ngẫu nhiên là ít nhất. Để giải quyết cả 2 yêu cầu trên, các kĩ thuật sau đ đ−ợc các virus áp dụng 35
- Đối với thời gian kiểm tra có thể giảm số lần kiểm tra xuống bằng cách chỉ kiểm tra nếu phát hiện có sự thay đổi truy xuất từ ổ này sang ổ khác. Mặt khác, chuyển số lần kiểm tra th−ờng xuyên thành “định kì “bằng cách kiểm tra thời gian. Một hình thức khác cũng giảm bớt số lần kiểm tra nếu ta để ý đĩa cứng luôn cố định, không bị thay đổi, do đó nếu tiến hành lây một lần sẽ không cần thiết phải kiểm tra, còn đối với đĩa mềm, mọi tác vụ đọc track 0 mới kiểm tra. Điều này cũng không có gì đáng ngạc nhiên nếu ta biết FAT trên đĩa mềm hầu nh− bắt đầu sau virus và DOS cần phải có bảng FAT để quản lí đĩa đó. Đoạn m sau áp dụng 2 ph−ơng pháp đầu: ;Khi ngắt 13h đ−ợc gọi cmp Disk, DL ;So sánh đĩa của tác vụ tr−ớc với giá trị mov Disk, DL ;của tác vụ này jne kiemtra ;Nếu có thay đổi sẽ kiểm tra xor AH, AH int 01AH ;Lấy timetick count mov CX, DX ;Cất time low sub DX, count ;Trừ giá trị timetick low hiện thời mov count, CX ;với timetick low của tác vụ tr−ớc sub DX, 24h ;và l−u lại chênh lệch 2 tác vụ đ jb khongkiemtra ;tới 2 giây ch−a? kiemtra: (Trích PingPong virus) Đoạn m sau minh họa ph−ơng pháp thứ 3: push DS push AX cmp AH, 2 ;Tác vụ đọc/ghi? Bằng cách so sánh jb notInfect ;tác vụ với 2 và 4 cmp AH, 4 jae notInfect or DL. DL jne notInfect ;Đĩa A? ;Đoạn m lây notInfect: (Trich Stone virus) Đối với kĩ thuật kiểm tra, có nhiều cách. Tuy nhiên, có thể nêu ra 2 cách sau: Kiểm tra giá trị từ khóa (Key value): mỗi virus sẽ tạo cho mình một giá trị đặc biệt tại 1 vị trí xác định trên đĩa. Việc kiểm tra sẽ đơn giản bằng cách đọc Boot record lên và kiểm tra giá trị từ khóa này. Giá trị của Key value này thay đổi tùy theo virus. Đối với Brain 9.0, giá trị của key value này là 01234 ở offset 03, đối với Pingpong virus, key value là 1357h ở offset 01FCh. Một dạng khác của Key value là kiểm tra giá trị của một m lệnh đặc biệt mà nếu không có m lệnh này ch−ơng trình virus sẽ không còn ý nghĩa gì nữa (virus sẽ không lây hay không thi hành). Đó là tr−ờng hợp của virus Stone với cách kiểm tra 2 từ khóa ở offset 0 và 2 là 05EAh và 0C000h, Đây là m lệnh của một lệnh JMP FAR, theo đó toàn bộ ch−ơng trình sẽ đ−ợc định vị lại theo segment:offset mới Kĩ thuật key value này đ gặp nhiều trở ngại khi số l−ợng B - virus tăng lên đáng kể mà vị trí trên Boot sector thì có hạn. Vì vậy không có gì đáng ngạc nhiên nếu Disk Killer virus và Brain 36
- www.updatesofts.com 9.2 có cùng một offset của key value tại vị trí 03Eh với hai key value khác nhau là 03CCBh và 01234h. Chính vì vậy, một kĩ thuật mới phải đ−ợc đ−a ra nhằm khắc phục điều này. Cách khắc phục này sẽ làm giảm khả năng trùng hợp ngẫu nhiên bằng cách tăng số l−ợng m lệnh cần so sánh lên. Việc so sánh này tiến hành bằng cách so sánh một đoạn m quan trọng của virus trong vùng nhớ với đoạn m t−ơng ứng trên Boot sector của đĩa. Mọi sự khác biệt dù chỉ trên một byte cũng dẫn đến việc lây lan. Đoạn m so sánh này cần phải mang tích chất đặc biệt cho virus đó, cùng tồn tại với sự tồn tại của virus đó. Đoạn m sau sẽ minh họa kĩ thuật này bằng cách so sánh 2 chuỗi: ;Giả sử Boot sector đ−ợc đọc vào buffer có tên Buffer1 mov SI, offset buffer1 mov AX, CS sub AX, 20h ;ES:DI trỏ đến offset 2 của mov ES, AX ;buffer chứa Boot sector mov DI, 2 mov BL, ptr byte [DI-1] ;Tính toán offset của đoạn m mov bh, 0 ;cần phải dò add DL, BX add SI, BX mov CX, 179h sub CX, DL cld repe cmpsb je Da_nhiem Da_nhiem: (Ch−ơng trình của Joshi virus). Ngoài ra, không phải là đ hết các kĩ thuật kiểm tra khác có thể nêu ra ở đây nh− kĩ thuật Checksum, tuy nhiên, kĩ thuật càng tinh vi, càng chính xác bao nhiêu thì đoạn m kiểm tra càng dài bấy nhiêu. Tr−ớc mắt, kĩ thuật trên cũng đ bảo đảm tốc độ kiểm tra và tính chính xác nên có lẽ sẽ không còn một kĩ thuật nào khác đ−ợc đ−a ra (khả năng để một đĩa trùng nhau đoạn m hầu nh− là không có vì các đĩa đều đ−ợc format d−ới một vài hệ điều hành quen thuộc, do đó ‘tác giả’ có thể đ thử nghiêm rồi! Mặt khác, nếu hai virus cùng nhận diện một đoạn m thì cũng coi nh− đ bị nhiễm virus rồi. b. Trong vùng nhớ: Việc kiểm tra sự tồn tại của mình trong vùng nhớ bảo đảm virus không để quá nhiều bản sao của mình trong vùng nhớ nếu máy tính bị Boot mềm liên tục (warm boot) điều này bảo đảm cho virus tránh đ−ợc nguy cơ bị phát hiện vì đ làm giảm tốc độ làm việc của ch−ơng trình. Mặt khác, làm giảm đi thời gian “nạp “lại ch−ơng trình virus vào vùng nhớ. Để kiểm tra sự tồn tại của mình trong vùng nhớ, B - virus đơn giản có thể dò tìm một key value tại một vị trí xác định trên vùng nhớ cao hoặc phức tạp hơn, có thể dò tìm một đoạn mang m virus sẽ phải “nạp “ch−ơng trình của mình vào nếu việc dò tìm không thành công. Đoạn ch−ơng trình sau sẽ minh họa cách dò tìm nay: cli ;Tạo stack và khởi tạo các thanh ghi mov AX, CS ;phân đoạn mov DS, AX mov SS, AX 37
- mov SP, 0F000h sti ;Lấy giá trị tổng cộng mov AX, w[0413] ;Vùng nhớ áp dụng kĩ thuật mov CL, 6 ;th−ờng trú shl AX, CL ;Đổi sang đoạn mov ES, AX ;ES trỏ đến vùng này mov AX, 0200 ;Xác định vị trí cần dò tìm sub AX, 021h mov DI, 0 mov SI, 07C00 ;DS:SI trỏ đến Boot record add SI, AX ;của virus add DI, AX ;ES:DI trỏ đến offset 200h-21h mov CX, 1079 ;của vùng cao sub CX, AX ;CX chứa số byte cần so sánh cld ;CX=179h-21h repe cmpsb jne naplai ;So sánh nếu không bằng sẽ nạp lại mov AX, ES ;ch−ơng trình, nếu bằng chuyển add AX, 20h ;quyền điều khiển cho đoạn trên mov ES, AX ;vùng cao mà không cần nạp lại mov BX, 0 ;ch−ơng trình push ES push BX mov AX, 1 retf Naplai: (Trích Joshi virus). 3/ Kĩ thuật lây lan: Việc lây lan chiếm một phần lớn m lệnh của ch−ơng trình. Để bảo đảm việc lây lan gắn liền với đĩa, virus sẽ chiếm ngắt đĩa quan trọng nhất: ngắt 13h. Sơ đồ chung của phần này nh− sau: Đọc/Ghi No Yes Đọc Boot sector Đ nhiễm? Ghi Boot sector của virus 38
- www.updatesofts.com Ghi phần thân và Boot sector vào một vùng xác định Thông th−ờng, không phải mọi chức năng của ngắt 13h đều dẫn đến việc lây lan vì điều này sẽ làm giảm đi tốc độ truy xuất một cách đáng ngờ mà tốt nhất chỉ những tác vụ đọc/ghi (chức năng 2 và 3). Việc lây lan bắt đầu bằng cách đọc Boot sector lên nếu không thỏa (ch−a bị nhiễm) virus sẽ tạo một Boot sector mới có các tham số t−ơng ứng, còn Boot sector vừa đọc lên cùng với phần thân (nếu là loại DB - virus) sẽ đ−ợc ghi vào một vùng xác định trên đĩa. Tuy vậy, việc lây lan cũng đòi hỏi những bảo đảm sau: Boot sector vẫn còn chứa những tham số đĩa thuận tiện cho các tác vụ truy xuất đĩa (bảng tham số BPB - trong tr−ờng hợp Boot sector hay bảng Partition table trong tr−ờng hợp Master boot), do đó, virus phải bảo đảm cho đ−ợc bảng tham số này bằng cách l−u giữ nó. Việc không bảo toàn có thể dẫn đến chuyện virus sẽ mất quyền điều khiển hay không thể kiểm soát đ−ợc đĩa nếu virus không có mặt trong môi tr−ờng. Ví dụ: phần mềm NDD (Norton Disk Doctor) sẽ điều chỉnh lại bảng BPB trong tr−ờng hợp bảng tham số này sai, hay việc mất bảng tham số đĩa trên ổ đĩa loại 720Kb hoặc 1.44Mb cũng dẫn đến việc không kiểm soát đ−ợc đĩa này. Do đó, điều tốt nhất là vẫn phải giữ nó lại trong Boot sector mới và một ích lợi thứ hai là có thể dựa vào đây để định ra các thành phần của đĩa (xem ch−ơng 1). Đoạn m sau minh họa việc trả lại bảng tham số BPB trong Boot sector mới: ;Đọc Boot sector vào offset 07C00 và tạo Boot sector mới tại 08000 mov AX, 0201 mov DH, 0 mov CX, 1 mov BX, 07C00h int 13h ;Đọc Boot sector vào mov SI, 08002 ;Copy bắt đầu từ sau lệnh nhảy mov DI, 07C02 mov CX, 01Ch ;Copy 1Ch byte rep movsb (Trich PingPong virus) Sự an toàn dữ liệu của Boot sector cũng đ−ợc đặt lên hàng đầu. Ngoài việc chấp nhận mất mát do đặt ở những chỗ mà xác suất bị ghi đè là ít nhất, chúng ta sẽ khảo sát 2 kĩ thuật đảm bảo an toàn cho Boot sector. Đó là format thêm track và đánh dấu cluster hỏng trên đĩa. + Format thêm track: kĩ thuật này chỉ áp dụng đ−ợc trên đĩa mềm (trên đĩa cứng đ có những vùng tuyệt đối an toàn rồi). Thông th−ờng, bộ điều khiển đĩa mềm đều cho phép format thêm track, nh−ng do mức độ an toàn thông tin không bảo đảm, DOS chỉ dùng một số nào đó mà thôi. Việc format thêm track đòi hỏi virus phải chuẩn bị bảng mô tả sector trong track mà nó dự định format (sector descriptor) có dạng: mỗi sector trong một track đ−ợc đặc tr−ng 4 byte có dạng ‘CHNS’. Trong đó: C=Cylinder; H=head; N=số sector; S=kích th−ớc của sector (0=128 byte, 1=256 byte, 2=512 byte, ). Các b−ớc tiến hành việc format nh− sau: - Xác định loại đĩa để từ đó suy ra track cuối cùng, tuy nhiên, điều này chỉ đúng với đĩa đ−ợc format d−ới DOS. - Đặt lại cấu hình ổ đĩa tr−ớc khi format. - Khởi tạo bảng sector descriptor căn cứ vào số track tính đ−ợc. 39
- Đoạn m sau của Joshi virus không định dạng ổ đĩa tr−ớc khi format nên đ gây lỗi khi format đĩa loại 1.2Mb. mov AX, CS sub AX, 20h mov ES, AX mov DI, 2 mov BH, 0 mov BL, ptr byte [DI-1] add DI, BX cmp DI, 80h ;Định vị để ES:DI trỏ vào bảng tham số jb Floppy mov ptr byte [DI-3], 0 ;offset nội dung mov ptr byte [DI-2], 2 ; -1: số đĩa vật lí mov ptr byte [DI-1], 80h ; -2: số sector jmp cont0 ; -3: số track Floppy: mov ptr byte {DI-2], 1 ;Nếu đĩa mềm sẽ khởi tạo sector 1 mov ptr byte [DI-1], 0 ;Đĩa physic 0 mov ptr byte [DI-3], 28h ;Track 28h (đĩa 360Kb) mov AL, 4 ;Verify sector 15, nếu gặp lỗi coi nh− không mov AL, 1 ;có sector này, ng−ợc lại, đĩa sẽ có 50h track mov CH, 0 ;do đó đĩa là 1,2Mb mov CL, 0Fh mov DH, 0 call OldDisk je cont1 mov ptr byte [DI-3], 50h ;Điều chỉnh lại số track theo loại đĩa Cont1: ;Phần khởi tạo descriptor mov AL, ptr byte [DI-3] ;AL = số track push CS pop ES mov DI, offset SectorDescriptor mov CX, 8 ;Tạo 8 sector một track Cont2: stosp ;Tạo giá trị inc DI inc DI inc DI ;Trỏ đến tham số kế trong bảng loop cont2 ;Phần format đĩa mov AX, CS sub AX, 20h mov ES, AX mov DI, 2 mov bh, 0 40
- www.updatesofts.com mov BL, ptr byte [DI-1] add DI, BX push CX mov AH, 5 ;Format mov AL, 1 mov ch, ptr byte [DI-3] ;Track thêm mov CL, 1 mov DH, 0 ;Head 0 push CS pop ES mov BX, offset SectorDescriptor call OldDisk OldDisk proc near pushf ;Hàm này gọi xa đến địa chỉ cũ call far int13 ;của ngắt 13 ret OldDisk endp SectorDescriptor db 28h,00h,01h,02h 28h,00h,02h,02h 28h,00h,03h,02h 28h,00h,04h,02h 28h,00h,05h,02h 28h,00h,06h,02h 28h,00h,07h,02h 28h,00h,08h,02h (Trích Joshi virus) Ph−ơng pháp này ít đ−ợc các hacker −a chuộng và dùng vì tính t−ơng thích không cao giữa các loại ổ đĩa. Ph−ơng pháp chiếm cluster vẫn đ−ợc nhiều ng−ời dùng dù độ phức tạp của nó cao hơn. ở đây, tôi sẽ không đi sâu vào chi tiết cách phân tích và định vị cluster trên FAT vì sẽ mất quá nhiều thì giờ mà làm cho độc giả thêm khó hiểu. Tuy nhiên, vẫn nêu ra đây các khó khăn gặp phải khi sử dụng ph−ơng pháp này. + Nên phân tích FAT chỉ cho đĩa mềm hay cho cả hai loại đĩa mềm lẫn đĩa cứng? Thông th−ờng, các hacker chọn ph−ơng án chỉ phân tích trên FAT của đĩa mềm vì tất cả các loại đĩa mềm (và cả đĩa cứng d−ới 12Mb) đểu dùng loại FAT 12 bit, đơn giản hơn là phải phân tích thêm FAT 16 bit. Mặt khác, các đĩa cứng dù có chia partition hay không cũng th−ờng có các sector ẩn (Hidden sector) không dùng đến (nếu nó ch−a bị một virus khác tr−ng dụng), rất thuận lợi cho việc cất dấu. Nh−ng vẫn có ngoại lệ khi Pingpong virus vẫn làm điều khó khăn này, nó chiếm các cluster trên cả hai loại FAT với đoạn m phân tích FAT ‘tối −u’ về kích th−ớc cũng nh− giải thuật, đ−ợc ‘trích đoạn’ từ m phân tích FAT trong file hệ thống IO.SYS của DOS. + Chọn ph−ơng pháp này, hacker phải chấp nhận tải FAT vào vùng nhớ để phân tích. Nh−ng kích th−ớc FAT của mỗi đĩa là khác nhau, có thể chiếm nhiều sector (đối với đĩa 1.2Mb lên đến 7 sector cho một FAT). Do đó, kích th−ớc vùng nhớ mà virus phải chiếm chỗ cho FAT cũng đ quá lớn, ch−a kể đến đoạn ch−ơng trình của virus. Giải quyết vấn đề này cũng không phải là dễ dàng nếu ta biết DOS cũng phải đến version 3.xx mới giải quyết đ−ợc. 41
- 4/ Kĩ thuật phá hoại : Không ai xa lạ gì về kiểu phá hoại của virus (đôi khi cũng đổ lỗi cho virus để che dấu sự thiếu hiểu biết của mình). Có thể chia những loại phá hoại thành hai nhóm chính. a. Định thời: Đối với loại định thời, virus sẽ kiểm tra một giá trị (có thể là ngày giờ, số lần lây, số giờ máy đ chạy ). Khi giá trị này v−ợt qua một giá trị cho phép, virus sẽ bắt đầu phá hoại. Do tính chất chỉ ‘ra tay’ một lần, virus loại này th−ờng nguy hiểm. Để có thể đếm giờ, virus có thể dùng các cách sau: + Chiếm ngắt 8 để đếm giờ: việc quy đổi sễ đ−ợc tính tròn hơn là chính xác. Theo cách tính nh− vậy, một giá trị 0FFFFh của timetick count sẽ t−ơng đ−ơng nh− một giờ. Cách tính này th−ờng dùng để tính số giờ chạy máy, giá trị đếm có thể cập nhật lại sau đó trên đĩa. Đặc tr−ng cho cách này là virus Disk Killer với bộ đếm giờ ‘khủng khiếp’, sau khi chạy máy đ−ợc 48 giờ, toàn bộ partition boot đ−ợc của bạn sẽ bị m hóa toàn bộ (một tài liệu n−ớc ngoài cho là đĩa cứng bị format lại hoặc bị ghi ‘rác’ vào - nh−ng điều này hoàn toàn sai lầm). + Chiếm ngắt 21h của DOS để lấy ngày tháng: việc lấy ngày tháng xem ra khó khăn cho B - virus hơn là F - virus, vì ở mức độ quá thấp, khi máy vừa khởi động, DOS ch−a khởi tạo các ngắt cho riêng mình, kể cả ngắt 21h. Do đó, virus chỉ có thể lấy ngày tháng từ CMOS RAM trên các máy AT, điều này lại không có trên XT. Do tính không ‘t−ơng thích’ này mà các B - virus bỏ qua không dùng đến cách này. Tuy nhiên, về sau, khi đ ‘phát triển’ cao, B - virus đ có thể vòng lại một lần nữa để lấy ngắt 21h thì việc này mới đ−ợc giải quyết xong. Đặc tr−ng cho loại này là Joshi virus, với sự kiểm tra liên tục ngày tháng của hệ điều hành, nếu đúng vào ngày 5 tháng 1, nó sẽ bắt ng−ời sử dụng đánh vào một câu chúc mừng ‘Happy birthday Joshi’ tr−ớc khi có thể làm thêm bất kì một điều gì. + Đếm số lần lây cho các đĩa khác: cách này dễ thực hiện hơn vì không cần phải đếm giờ, ngày tháng cho mất công. Khi một đĩa đ−ợc virus ‘kí tên’ vào, bộ đếm của nó sẽ tự động tăng lên một đơn vị. Khi số đĩa bị lây đ v−ợt quá một con số cho phép, đĩa đó sẽ bị phá hoại. b. Ngẫu nhiên và liên tục: Virus không cần phải đếm giờ, chỉ sau vài phút xâm nhập vào hệ thống, nó sẽ phát huy tác dụng. Do tính chất này, virus không mang tính phá hoại mà đơn giản là gây một số hiệu ứng phụ ở loa, màn hình, bàn phím để gây sự ngạc nhiên và thích thú (lẫn bực dọc) cho ng−ời sử dụng. Điển hình cho loại này là Pingpong virus, sau khi thâm nhập xong, vài phút sau đ thấy trên màn hình xuất hiện một trái banh chuyển động trên màn hình và tuân theo đúng các định luật phản xạ khi gặp các đ−ờng biên. Đặc biệt, những kí tự mà nó đi qua vẫn giữ nguyên không bị thay đổi (các bạn có thể xem đoạn ch−ơng trình mô phỏng ở phần phụ lục A). 5/ Kĩ thuật ngụy trang và gây nhiễu : Kĩ thuật này thực ra đ ra đời khá muộn màng do khuynh h−óng ngày càng dễ bị phát hiện. Kích th−ớc virus khá nhỏ bé nên việc dò từng b−ớc (trace) xem nó làm gì là điều mà các thảo ch−ơng viên có thể làm đ−ợc. Trong thực tế khó có một ph−ơng pháp hữu hiệu nào để chống lại ngoài cách viết cố tình rắc rối. Ph−ơng pháp này có vẻ cổ điển nh−ng lại rất hữu hiệu. Bằng một loạt các lệnh mà ng−ời dò theo có thể bị halt máy nh− đặt lại stack vào một vùng mà không ai dám thi hành tiếp, chiếm và xóa một số ngắt, đặt lại thanh ghi phân đoạn để ng−ời dò không biết dữ liệu lấy từ đâu ra Các ch−ơng trình B - virus về sau đ gây khó khăn không ít trong cố gắng khôi phục đĩa bị nhiễm. Một ph−ơng pháp khác có thể dùng là m hóa ngay chính ch−ơng trình virus, tuy nhiên, cho đến nay ch−a có một ch−ơng trình B - virus nào dùng đến ph−ơng pháp này. Việc gây nhiễu này chỉ có tác dụng trên các máy đ bị nhiễm hoặc dùng một phần mềm debug theo dõi. Nếu toàn bộ ch−ơng trình virus đ−ợc đổ ra thành file và xem từng b−ớc một thì virus cũng đành phải chào thua. Để tránh bị phát hiện quá sớm hoặc bị phát hiện bởi các phần mềm chống virus, đòi hỏi virus phải có tính ngụy trang. Việc ngụy trang này xảy ra trong vùng nhớ lẫn trên đĩa. Đối với vùng nhớ, với kĩ thuật l−u trú, B - virus luôn chiếm ở vùng nhớ cao, do đó sẽ tạo ra sự chênh lệch giữa vùng nhớ do BIOS quản lí và vùng nhớ thực sự của máy. Bất kì một phần mềm 42
- www.updatesofts.com công cụ nào kiểu Memory Map đều có khả năng thông báo điều nay (chẳng hạn PCTools của Central Point ). Thực tế ‘đau lòng’ không thể nào tránh khỏi này đang là nỗi đau đầu cho các hacker. Đến nay, vẫn ch−a có B - virus nào giải quyết vấn đề này và mọi chuyện vẫn còn ở phía tr−ớc. Đối với đĩa, mọi chú ý đều tập trung vào Boot sector (và Partition table nữa). Mọi thay đổi trên Boot sector dù nhỏ cũng tạo một mối nghi ngờ cho ng−ời sử dụng - ng−ời đ có quá nhiều kinh nghiệm qua nhiều lần phá hoại của virus. B - virus đ giải quyết vấn đề này bằng hai cách. Chỉ cài đúng đoạn m chính vào Boot sector (nếu virus thuộc loại DB - virus), đoạn m này càng ngắn càng tốt và nhất là càng giống đoạn m chuẩn trong Boot sector. Đoạn này chỉ có một nhiệm vụ cỏn con là nạp tiếp phần còn lại vào trong vùng nhớ và trao quyền cho nó. Vì lí do này khả năng phát hiện virus đ giảm xuống đáng kể. Tuy vậy, cách thứ hai vẫn luôn đ−ợc áp dụng: khi máy đang nằm trong quyền chi phối của virus, mọi yêu cầu đọc ghi Boot sector (hay Partition table), tất nhiên là trừ chính virus, sẽ đ−ợc virus trả về cho một bản Boot sector chuẩn - Boot sector tr−ớc khi virus lây. Và điều này, sẽ gây ra một ‘ảo t−ởng’ về sự trong sạch của máy và đánh lừa luôn cả những ch−ơng trình Antivirus nếu nó đ−ợc thiết kế không tốt. Đoạn m sau sẽ trình bày cách trả Boot sector: ;Đầu vào của ngắt 13h đ bị virus chiếm cmp CH, 2 ; Chức năng đọc? Jne exit0 cmp DL, 2 ; Truy xuất trên đĩa mềm? ja exit0 cmp ch, 0 ;Track 0? Je cont0 ;Nếu không phải track 0 sẽ thực hiện ; việc kiểm tra exit0: jmp exit1 cont0: mov ptr byte [227h], 0 mov ptr byte [225h], 4 push AX push BX push CX push DX mov ptr byte [226h], DL ;Cất giá trị đĩa mov CX, 4 ;Ngắt 13h cũ đ đ−ợc đổi thành ngắt push CX ;6DH mov AH, 0 int 6Dh ;Reset lại đĩa jb error push ES mov DH, 0 ;Đọc Boot sector vào buffer của virus mov CX, 1 mov BX, offset buffer mov AX, CS mov ES, AX mov AX, 201h 43
- int 06Dh pop ES jae cont1 ;Không gặp lỗi cont1: pop CX ;Kiểm tra key value ở offset 3 mov AX, ptr word buffer[3] cmp AX, 1234h ;Key value là 1234h jne infect ;Nếu sai chuyển sang chế độ lây mov ptr byte [227] ;Bật cờ hiệu đ nhiễm jmp cont2 infect: Cont2: pop DX pop CX pop BX pop AX cmp CX, 1 ;Track 0 sector 1? jne exit1 cmp ptr byte [227h], 1 ;Đ lây ch−a? jne exit2 mov CX, buffer [7] ;CX=Track+sector mov DX, buffer[5] ;DX=head mov DL, ptr byte [226] ;DL=đĩa jmp exit1 ;Địa chỉ của Old boot trên đĩa exit1: int 6Dh ;Đọc sector cũ vào retf 2 (Trích Brain virus version 9.2) Do đó, sơ đồ chung có thể đ−ợc bổ sung nh− sau: Đọc Boot sector? No Ngắt 13 cũ Yes Đọc boot của virus vào Định vị và đọc Boot sector cũ vào 6/ Kĩ thuật định vị ch−ơng trình: Kĩ thuật này ít đ−ợc ai để ý dù rằng nó đóng một vai trò không nhỏ trong việc gây nhiễu và dễ thiết kế ch−ơng trình trong việc truy xuất dữ liệu. Nh− ta đ biết, Boot sector đ−ợc tải vào địa chỉ 0:07C00h. Nh− vậy các dữ liệu trong bảng tham số phải đ−ợc tham chiếu bằng CS và lấy ra từ offset 07C00h. Rõ ràng, điều này gây khó chịu cho ng−ời thiết kế lẫn ng−ời muốn đọc nó. Cách tốt nhất là bằng một phép biến đổi nào đó, chuyển địa chỉ này sang một dạng khác với offset quen thuộc hơn. Ph−ơng pháp th−ờng đ−ợc dùng là: định vị ngay một vùng nhớ l−u trú, chuyển toàn bộ ch−ơng trình sang vùng này và chuyển quyền với offset mới là 0 hay 100h (t−ơng ứng với file dạng COM và BIN). Ph−ơng 44