Trao đổi với tôi

http://www.buidao.com

7/4/09

[Virus] An simple example encrypted parasitic virus (Win32.Atav) (Part 1)

-Tác giả virus Win32.Atav: Radix16
-Tác giả bài viết: Benina (REA)

Trước tiên tôi chỉ muốn nói rằng: bài này chỉ dành cho newbiez. Các pro đi chổ khác chơi để tụi em mầm ăn nhe. Hehe.

Đây là con virus rất cơ bản, thích hợp cho các bạn mới tìm hiểu về virus khám phá.
Tôi biết được con virus này do spinx giới thiệu trong bài viết của mình bên HVA.
Nhưng spinx ko chú thích nhiều về nó cũng như ko hướng dẫn gì cả chỉ vì HVA ko cho ...phổ biến vx.?????!!
Nhưng với source gốc thì con virus này ko chạy do một số lỗi chưa fix (tác giả cố tình làm thế thì phải?).
Vì vậy tôi đã thay đổi tương đối cơ bản source của con virus này cho thích hợp để học tập. Đồng thời
cũng sắp xếp lại một số đọan code để cho dễ theo dõi và tìm hiểu họat động của nó. Việc này hòan tòan ko
phải là ý định của tác giả, mà đi ngược lại hòan tòan. Vì tác giả vrus này viết code rất “lộn xộn” nhằm
làm cho các avers khó khăn trong lúc debugging. Đây cũng là “một kỹ thuật gây rối code” trong coding virus.
Tôi cũng bỏ qua routine check timer gây crash process của source gốc để các bạn an tâm khi thực hành.

Con virus này có các đặc điểm sau đây:

-Anti-debugging do dùng kỹ thuật kinh điển SEH. Bây giờ thì ko còn khó khăn đối với các debugger đỉnh cao
như Olly chẳng hạn. Kỹ thuật này cũng được các vxer cho là vx được “bọc vỏ”.

-Find Base Kernel: bằng cách tìm hàm GetModuleHandleA trong import table của chính program bị infect. Từ đó
dùng hàm này tìm ra base kernel.

-Nếu tìm base kernel theo pp trên ko thành công (do target ko import hàm GetModuleHandleA) thì tôi có add
thêm routine tìm base kernel theo pp PEB. Nếu chưa nắm pp này, bạn nên đọc tut của tôi đã public mấy năm trước.

-Encrypt/decrypt một đọan code của virus để anti- heuristic scanner các Avs. Thuật tóan rất củ chuối
nhưng đủ xài, đạt đựơc mục đích đề ra. Chú ý quan trọng khi học tập là đọan code mã hóa đó có các string của APIs.
Nhằm tránh các Avs scan tìm ra (chính là kỹ thuật anti- heuristic).
Đây cũng là phần chúng ta nên học tập trong source này, vì nó rất căn bản, dễ hiểu, và là bài học về cách coding mã hóa
một đọan trong body virus (một block code vx), rồi giải mã đọan code mã hóa đó khi virus thực thi.

-Trong source sửa chửa này tôi chỉ cho lây nhiểm (infect) 2 file PE trong thư mục hiện hành để tránh tác hại
gây ra trong quá trình học tập. Con virus này lây nhiểm (infect) bằng kỹ thuật injection (tiêm chích code bẩn vào file)
Vì vậy, khi chúng ta biên dịch nó ra file exe, chúng ta nên cho nó vào 1 thư mục để nó ko lây nhiễm tùm lum.
Cảnh báo: các bạn tự chịu trách nhiệm khi thực hành. Nếu có chuyện gì xảy ra ko được đổ thừa cho tui nhe.
Chú ý: cách inject (tiêm chích code bẩn) vào file exe trong vx này chưa chuẩn. Nếu bạn ko tin bạn hảy cho inject vào
file calc.exe hay notepad.exe của Windows thử xem. Nó sẽ gây lỗi. Đây cũng là một bài tập để các bạn nghiên cứu cách inject
hòan hảo vào file. Hy vọng tôi có thời gian sẽ writting một tut về injection.
Nói thêm chút, virus này (bản gốc) các Avs cho rằng “nguy hiểm”. Ko phải nó có kỹ thuật tiên tiến gì cả mà vì:
“The infection procedure is buggy (nhiều lỗi) and destroys (hủy họai) the PE-file structure ,
and most of infected files become corrupted.”. Thật là buồn cười??!!!. Vì vậy các bạn hết sức cẩn thận khi playing với nó!!!??

-Hành vi bẩn thỉu (dirty behaviour) (con virus nào cũng phải có tính năng này, hehe) của virus này chỉ là hiển thị một hộp
thọai thông tin đến user có nội dung "Reached dirty behaviour of vx!". Chỉ có vậy thôi, ko tác hại gì cả.
Nhưng trong source gốc thì vô cùng tai hại. Tác giả đã bẩn thỉu cho check timer, nếu “hợp thời” nó sẽ cho thực thi
một đọan code vô nghĩa gây crash process. Tương tự như hành vi của một kẻ đang cầm dao điên khùng lên cơn điên
đâm chém lung tung, đến khi nào chém được thì thôi và lúc đó hắn mới chịu “im”!!. Ghê thiệt. Hehe. Vì vậy tôi đã bỏ phần
code này để các bạn đỡ phải lo lắng.

-Trong quá trình “tìm kiếm file nạn nhân” (find file victim) để lây nhiểm (infect), virus này có một bất lợi là ko có chức năng
filter (lọc) khi lây nhiệm (inject). Tức là khi 1 file bị lây nhiểm rồi nhưng khi virus thực thi lần thứ hai nó cũng ko
biết (vì ko filter), nên nó chỉ biết nhắm mắt nhắm muổi inject tiếp tùm lum tùm la.
Phần chức năng filter inject là một bài tập cho các bạn.
Do tính năng này con virus mới có thuộc tính parasitic (lây tạp)

-Source này chỉ có tính chất học tập, nên càng rõ ràng càng tốt. Vì vậy code ko được tối ưu hóa (optimize). Khi codding
vx điều quan trọng chúng ta phải làm là làm sao cho vx cần nhỏ càng tốt. Do đó cần optimaze code vx. Đây là một chủ đề khác.

-Tác giả con virus này rõ ràng là một “tính đồ” của “nhà mô phạm virus” Billy Belceb£. Billy là một trong những
thành viên của nhóm virus 29A khét tiếng từ những ngày đầu thành lập. Billy đã viết một bài hướng dẫn coding virus rất vở
lòng và mô phạm. Vì vậy tôi cho Billy là “nhà mô phạm virus” chính vì lý do đó. Trong virus này ta sẽ thấy dáng dấp của Billy.

-Các bạn nên chú ý: hai hàm Mutate1 và Write_File nằm ngòai đọan code mã hóa (crypted block code). Do hai hàm này xử lý đọan code
mã hóa đó, nên buộc chúng phải nằm ngòai đọan mã hóa. Cũng chú ý một số biến mà hai hàm này dùng, hay những phần ko bị mã hóa
sử dụng cũng phải nằm ngòai đọan code encrypt.

-Quá trình làm việc của con virus này như sau:

1./Vì con virus này tự giải mã khi running file bị lây nhiễm, nên trước tiên khi tạo lần đầu, nó phải
mã hóa (encrypt) đọan code đó như hình hài cần thiết của nó khi được inject.
2./Sẽ hiển thị một hộp thoại báo virus được sinh ra đầu tiên nhằm giao tiếp với user đụơc thuận tiện.
3./Bắt đầu đi vào body virus. Đầu tiên nó dùng kỹ thuật SEH để anti-heuristic. Sau đó dùng kỹ thuật
“delta offset” để chuẩn hóa (normalize) các offset tham chiếu. Tạo nên đọan code virus có thuộc tính
“independent code” (đọan mã độc lập). Các kỹ thuật này tôi có trình bày trong các tuts trước rồi.
4./Hành vi tiếp theo là giải mã đọan code của virus bị mã hóa bằng thuật tóan xor. Chúng ta chú ý:
khi A xor B = C thì C xor B = A. Lợi dụng tính chất này để thực hiện encrypt và decrypt.
5./Bắt đầu thực thi đọan code đã giải mã. Mọi app chạy trên Windows đèu phải dùng các hàm APIs để thực hiện
các hành vi của mình. Virus cũng ko lọai trừ. Vì vậy việc trước tiên phải làm là tìm Base Kernel32.dll
(trong thư vịên dll này chứa các hàm cốt lõi của Windows). Vì có được base kernel là ta sẽ sử dụng được
tất cả các hàm export của nó.
6./Sau khi có base kernel. Ta sẽ search addr của các hàm APIs cần dùng. Bằng cách search name API trong export table
của kernel32.dll. Muốn nắm bắt được kỹ thuật này chúng ta phải hiểu rõ cấu trúc file PE. Rất nhiều tuts đã dịch sang
tiếng Việt. Các bạn nên tìm hiểu.
7./Có được các addrs APIz, virus sẽ thực hiện hành vi bẩn thỉu của mình.Ở đây tui cho ra 1 hộp thọai thông báo
cho user biết đã đến phần hành vi bẩn thỉu. Chỉ bẩn vì xuất hiện hộp thọai thôi.
8./Tính năng của một số con virus là lây nhiễm (infect). Muốn infect một file exe nào đó thì nó phải
tìm ra file exe trước rồi mới infect được. Vì vậy nó sẽ FindFile đầu tiên (First) để infect. Sau khi infect xong file đầu tiên,
nó sẽ FindFile kế tiếp (Next) để infect tiếp....cứ thế cứ thế mà lây lang. Ở đây ta thấy có một vòng lặp loop find file.
Điều kiện thóat vòng lặp là đạt đến số file mà ta cho lây nhiễm qua cờ (flag) infections. Ở đây tui chỉ cho lây nhiễm 2 file.
Đọan này cũng đựoc gọi là thủ tục “Find file victim”
9./Sau khi infect xong các filez. Nó sẽ kiểm tra xem phải là lần đầu tiên gen (sinh ra) virus ko. Nếu là gen virus đầu tiên thì
exitprocess (dựa vào reg ebp, tôi yêu asm ở điểm này). Nếu ko phải, tức là nó đang thực thi trong file bị lây nhiễm, thì nó sẽ
goto đến Entry Point của origin program. Và thực thi code gốc bình thường.

Trên đây là tòan bộ mô tả về con virus này. Nó cũng là “kiểu mẫu cơ bản” của một con virus “Inject File PE”.
Sau đây là ta bắt đầu học code của nó:

(Khi nào rãnh benina sẽ post tiếp, mệt rồi thong cảm nhe)
Benina

Source vx: http://mirror.sweon.net/madchat/vxdevl/vxsrc/Win32/Win32.Atav/Win32.Atav.asm