Cách viết chương trình Virus
Hướng dẫn lập trình Virus, Dành cho newbie Author: Spinx (hva) Lời nói đầu của Benina: Tòan bộ bài viết này tôi tổng hợp từ các bài viết của spinx trên 4rum HVA và chia ra làm 5 bài. Đầu tiên tôi xin lỗi tác giả vì chưa xin phép và tự đặt tựa các bài viết (vì cho dễ theo dõi). Còn bây giờ đọc đọc.. BÀI 1: MỞ ĐẦU Author: spinx
Kích thước nhỏ: ngôn ngữ ASM sẽ cho ta khả năng lập trình với kích thước nhỏ nhất có thể. Đây là một đặc tính quan trong của VR. Bằng ASM ta sẽ bớt đi rất nhiều code không cần thiết và trùng lặp do các trình biên dịch ngôn ngữ bậc cao sinh ra. Trong quá trình tối ưu mã code ta có thể tối ưu đến từng byte mã lệnh. Lựa chọn các lệnh có cùng kết quả với kích thước nhỏ nhất.... Khả năng kiểm soát: Ta có thể kiểm soát từng lệnh, move code từ vị trí này sang vị trí khác, vừa chạy vừa patch code ( patch on-the-fly ). Mã hoá code từng phần .... Tính linh hoạt: đây là ưu điểm mạnh nhất của ASM khi lập trình. Là một ngôn ngữ phi cấu trúc, khả năng sáng tạo trên ASM là không bị giới hạn. Cuối cùng nhiều khi VR không hoàn toàn là một chương trình (boot VR chẳng hạn) nên chẳng có lý do gì để chọn một ngôn ngữ bâc cao cả trừ phi bạn quá lười. -Chương trình dịch ASM. Bạn có thể chọn TASM, MASM hoặc một chương trình dịch bất kỳ tuỳ thích. Nói chung với tasm 3.1 là đủ với một dos VR Thường trú: Nhiều người nghĩ rằng VR là phải thường trú nhưng không hẳn vậy. Chính vì thế tôi không liệt thao tác này vào trong nhóm các thao tác thường làm. ARMOURING: chống debug và disassembler. Đây là một trong các kỹ thuật tự bảo vệ cho VR (xem thêm bài kỹ thuật lập trình VR). Tôi sẽ cung cấp chi tiết cho các bạn một số cách bẫy ngắt lạ (int 1, int 0, int 6...), đánh lừa stack, đặt điểm dừng (break points), fetch code on-the-fly Mỏi tay quá rồi, hẹn các bác bài sau nhé.... to be continue! BÀI 2: VR TRÊN DOS Author: spinx Tôi có ý định trình bày các kỹ năng lập trình VR tuần tự từ các loại VR COM/EXE không thường trú trên DOS, VR có thướng trú, boot VR rồi mới sang win/unix nhằm tạo cho các bạn nắm được các kiến thức cơ bản trước. Tuy nhiên tôi thấy một số bạn quan tâm tới các kỹ thuật mới nhiều hơn vì vậy tôi sẽ cắt ngắn chương trình đào tạo. Chúng ta sẽ phân tích nhanh một VR file COM trên DOS để lấy khái niệm rồi bài sau sẽ đi vào VR trên win và unix luôn. Sau các bài này khi các bạn đã tự thực hành và trở thành VXer, các bạn nào muốn nâng cao trình độ có thể thảo luận về các kỹ thuật nâng cao trong bài Kỹ thuật lập trình VR của tôi.
Bắt đầu một VR đơn giản: 1. Mở file:
2. Lấy ngày giờ tạo file mov ax, 5700h ; get file time/date 3. Đọc các bytes đầu mov ah, 003Fh xor cx, cx JmpCode:db 0E9h,00,00 mov word ptr ds:[bp+offset JmpCode-Offset get_addr+1],ax ;Địa chỉ jmpcode + 1 5. Nối VR vào cuối tệp mov ah,40h 6. Phục hồi ngày giờ mov ax, 5701h ; restore file time/date 7. Đóng tệp mov ah,3eh 1. Bạn sẽ dùng các lệnh đọc/ghi tệp ghi nội dung VR vào cuối chương trình gốc 1. Tập viết một chương trình bằng ASM hiển thị tất cả các tệp *.com trong Câu hỏi nâng cao: Di rời một đoạn mã máy từ vị trí này sang vị trí khác trên bộ nhớ sẽ có ảnh hưởng thế nào đến các lệnh nhảy và call BÀI 3: KỸ THUẬT BẢO VỆ Author: Spinx Các newbie xem cũng được nhưng bài này không dành cho newbie. Đây không phải khái niêm cơ bản, tôi chỉ muốn tổng kết một số kỹ thuật bảo vệ trong môn virus programming Có nhiều cách lắm và rất đa dạng như bất cứ kỹ thuật nào cần đến sức sáng tạo của con người. Trong phần này tôi sẽ đề cập tới các kỹ thuật chính: Đây là giới thiệu chung nên tôi không đưa hết các code ví dụ. Có thể tôi sẽ phân tích và đưa ra code ví dụ sâu hơn ở từng kỹ thuật nếu thấy có nhiều bạn đọc quan tâm. Nếu bạn nào muốn thảo luận sâu hơn về kỹ thuật nào xin liên hệ trực tiếp. mov edx, esp Đoạn code trên hoàn toàn vô hại thậm chí hơi ngớ ngẩn nếu bạn xem qua nhưng trong thực tế chương trình của ban phát hiện được ngay có kẻ can thiệp vào stack của ban trong khi chạy, vậy chương trình của bạn không chạy thực mà chỉ đang trong chế độ emulator - Tương tự thế bạn có thể lừa AV bằng vài lệnh RETF (rất nhiều VR nội có dùng) - Sử dụng các opcode lạ (undocumented opcodes) của processor như SALC, BPICE. Vô hại với bạn nhưng khó hiểu với AV - Int 0 (divide by zero). Chỉ cần một phép chia cho 0, bạn sẽ nhảy ngay đến code mới mà emulator không theo vết được (ta có thể âm thầm descrypt ở đây) - Dấu code gọi ngắt: mov ax, 3D02h-key - Với 386/486 ngày xưa có thể cùng queue fetch (xin lỗi vì tôi hơi hoài cổ một chút): mov word ptr cs:[offset piq], 20CDh code này ngày nay không dùng được. Bạn sẽ nghĩ chương trình sẽ kết thúc vì lệnh int 20h (20CDh) ư? Không đâu! với 386/486 code chạy vẫn là nop
- Tương tự ngắt int 0. Bạn có thể bẫy int 1, int 6 Thôi kết thúc DOS. Trở lại win ta có thể dùng: Chắc mọi người biết cả rồi vì tôi mới trở lại với "Nghệ thuật hắc ám" gần nên kiến thức trên win không mới lắm.
- Nhảy vào ... giữa mã lệnh:
Bạn có thể thấy ngay thực ra đây không phải lệnh mov mà lệnh ta là 0fcebfa90h cơ - Chèn các mã kiểu (db 0b8h) vào nhiều nơi sau các lệnh ret, jmp, ...
call IsDebuggerPresent ;call API Gọi hàm API Win98/NT kiểm tra API level debugger mov ecx, fs:[20h] ;load context of debugger - Sử dụng SEH
- Chọc vào các thanh ghi debug (Ring-0 only) mov eax, '****' ;set already_infected mark [...] BÀI 4: VR TRÊN WINDOWS OK, không thấy có bạn nào thắc mắc gì nhiều về các VR trên DOS (chắc chẳng ma nào đọc) :rolleyes: đồng thời có nhiều bạn PM cho tôi yêu cầu được biết thêm về VR trên Win và Unix. Chính vì vậy tôi sẽ kết thúc các bài đào tạo cơ bản để chuyển sang VR for Win. Vì thời gian có hạn, tôi sẽ mặc định là các bạn đã biết cách lập VR trên DOS để tập trung phân tích những điểm khác biệt giữa 2 hệ điều hành tất nhiên ở khía cạnh VR programming. Có nhiều bạn (kể cả tôi) lập trình VR trên DOS khá suya cho đến một ngày win ra đời, mọi thứ đảo lộn tiếp cận VR trên win còn khó khăn nên nếu bác nào chưa làm VR mà đọc ngay đừng có choáng nhé. Tôi sở trường dùng ASM nên ngôn ngữ trình bày là Win32Asm. call Delta call [ebp+_] Thực hành: Định hòan thành một bài viết đã lâu nhưng nhìn cái policy của diễn đàn nên chưa dám. Hiện nay diễn đàn không khuyết khích hướng dẫn quảng bá lập trình virus cho newbie nữa, hơn nữa chắc các bạn cũng có thể thấy qua là các kỹ thuật ở đây rất khó và sâu. Vì vậy tôi sẽ post nốt bài này thôi, có gì thắc mắc các bác cố phấn đấu mấy seo rồi vào Elite Member lập topic ta thảo luận tiếp nhe. Đây là sourcecode virus Win32.ATAV của Radix16[MIONS] rất thuận tiện cho học VR trên win. Tôi không dám hướng dẫn nữa đâu, chỉ post lên để các bác xem qua xem chúng nó viết VR thế nào thôi. Đây cũng là minh họa cho mấy phần tôi đã trình bày và là ví dụ để các bác tập trainning on the job cho các phần tôi chưa kịp trình bày. VR có sử dụng vài thư viện nhỏ của nhóm VR rất thành danh là 29A
;Nhưng tôi sẽ không trình bày sâu hơn ở đy, tài liệu nó có rất nhiều trên net, các bác tập nghiên cứu thêm. ;The End BÀI 5: TỰ VIẾT CHƯƠNG TRÌNH DIỆT VIRUS Author: spinx Tôn trọng mục đích của diễn đàn là "hướng thiện" tôi sẽ không đề cập đến nghệ thuật hắc ám nữa ở đây. Nguồn: http://rootbiez.blogspot.com/2009/07/virus-huong-dan-lap-trinh-virus-danh.html |