Upload
hoang-cuong
View
5.257
Download
7
Embed Size (px)
Citation preview
1
MỤC LỤC
DANH MỤC HÌNH ẢNH ........................................................................................ 3
TỪ VIẾT TẮT .......................................................................................................... 4
LỜI MỞ ĐẦU ........................................................................................................... 5
TỔNG QUAN VỀ MÃ ĐỘC ............................................................. 7
1.1. Giới thiệu .................................................................................................. 7
1.1.1. Khái niệm, phân loại và mục đích của mã độc ....................................... 7
1.1.2. Các thức lây nhiễm mã độc ..................................................................... 8
1.1.3. Các loại mã độc mới và dự đoán xu hướng mã độc trong tương lai ....... 9
1.2. Các công cụ sinh mã độc tự động ........................................................... 10
1.2.1. Hướng tiếp cận ...................................................................................... 10
1.2.2. JPS (Virus Maker 3.0) ........................................................................... 11
1.2.3. TeraBIT Virus Maker 3.2 ...................................................................... 16
1.2.4. Kết quả .................................................................................................. 18
TỔNG QUAN VỀ PHẦN MỀM PHÒNG CHỐNG MÃ ĐỘC ...... 19
2.1. Giới thiệu ................................................................................................ 19
2.2. Nguyên lý phát hiện mã độc ................................................................... 20
2.2.1. Phát hiện mã độc dựa vào dấu hiệu đặc trưng ...................................... 21
2.2.2. Phát hiện mã độc dựa vào đặc điểm bất thường ................................... 22
2.3. Các kỹ thuật phát hiện mã độc ............................................................... 23
2.3.1. Checksummers ...................................................................................... 23
2.3.2. Fuzzy Hashing ....................................................................................... 24
2.3.3. Scan String ............................................................................................ 26
2.3.4. Code Emulation ..................................................................................... 27
2.3.5. Static Heuristic Analysis ....................................................................... 28
2.3.6. Behavior Blocking ................................................................................. 29
NGHIÊN CỨU CÁC KỸ THUẬT VƯỢT QUA PHẦN MỀM
PHÒNG CHỐNG MÃ ĐỘC ................................................................................... 31
3.1. Cấu trúc tệp tin thực thi trên Hệ điều hành Windows 32bit ................... 31
3.2. Các kỹ thuật vượt qua các phần mềm phòng chống mã độc .................. 46
2
3.2.1. Kỹ thuật mã hóa .................................................................................... 46
3.2.2. Kỹ thuật chèn mã rác ............................................................................. 48
3.2.3. Kỹ thuật rẽ nhánh .................................................................................. 49
3.2.4. Sử dụng Stub để giải mã và thực thi trực tiếp trên bộ nhớ ................... 50
3.2.5. Kỹ thuật PRIDE (Pseudo-Random Index Decryption) ......................... 52
3.2.6. Các kỹ thuật chống phân tích mã độc ................................................... 54
3.2.7. Kỹ thuật che giấu API ........................................................................... 60
3.2.8. Kỹ thuât sử dụng chữ ký số ................................................................... 62
3.2.9. Khai thác lỗ hổng trên Hệ điều hành ..................................................... 65
3.3. Chương trình và thử nghiệm .................................................................. 67
KẾT LUẬN .......................................................................................................... 72
TÀI LIỆU THAM KHẢO ....................................................................................... 73
3
DANH MỤC HÌNH ẢNH
Hình 1.1.1: Thống kê các loại mã độc mới xuất hiện theo năm. ............................... 9
Hình 1.2.1: Thông tin về chương trình JPS (Virus Macker 3.0) .............................. 11
Hình 1.2.2: Giao diện của chương trình JPS (Virus Maker 3.0) .............................. 11
Hình 1.2.3: Mã độc được tạo ra từ chương trình ..................................................... 12
Hình 1.2.4: Sử dụng Exeinfor PE để xác định trình bảo vệ của mã độc.................. 12
Hình 1.2.5: Lệnh “net user” được thực thi trong mã độc ......................................... 13
Hình 1.2.6: Cứ sau 1 phút mã độc lại tự sao chép chính nó tới vị trí khác .............. 13
Hình 1.2.7: Resource data trong chương trình JPS .................................................. 14
Hình 1.2.8: Các bước thực thi của chương trình chính ............................................ 15
Hình 1.2.9: Giao diện của chương trình TeraBIT virus macker 3.1 ........................ 16
Hình 1.2.10: Mã độc được viết bằng MS Visual Basic ........................................... 17
Hình 1.2.11: So sánh resource trong tệp tin trước và sau khi patch ........................ 17
Hình 1.2.12: Mô tả quá trình patch .......................................................................... 18
Hình 2.1.1: Thị phần các sản phẩm Antivirus 1/2015 theo OPSWAT. ................... 20
Hình 2.2.1: Sự phân chia về các kỹ thuật phát hiện mã độc. ................................... 20
Hình 2.2.2: Việc xây dựng tập signature hoàn chỉnh là vô cùng khó khăn ............. 21
Hình 2.2.3: Phân loại hành vi trong kỹ thuật Anomaly-based Detection ................ 22
Hình 2.3.1: Tệp chứa mã độc được quét trên trang virustotal.com ......................... 24
Hình 2.3.2: Cách tính toán giá trị hash với mỗi khối 3 ký tự .................................. 25
Hình 2.3.3: Mô tả sau khi tiến hành Rolling hash ................................................... 25
Hình 2.3.4: Một đoạn mã của virus Stoned khi được phân tích .............................. 26
Hình 2.3.5: Cấu trúc của thanh ghi và cờ CPU Intel 16bit được định nghĩa lại bằng
ngôn ngữ C ............................................................................................................... 27
Hình 2.3.6: Kỹ thuật Heuristic nhận dạng một số virus thực tế ............................... 28
Hình 2.3.7: Phân loại ngưỡng lây nhiễm ở mức đơn lớp. ........................................ 28
Hình 2.3.8: Một khối ngăn chặn hành vi lừa đảo trên DOS .................................... 29
Hình 3.1.1: Minh họa cấu trúc cơ bản của một PE Tệp tin ...................................... 31
Hình 3.1.2: Một tệp tin PE được mở bằng công cụ FileInSight của McAfee .......... 32
Hình 3.1.3: Thành phần e_magic và e_flanew ......................................................... 33
Hình 3.1.4: Hình ảnh PE header của tệp tin test.exe ................................................ 34
Hình 3.1.5: Vị trí các thành phần của PE Header trong tệp tin test.exe .................. 37
Hình 3.1.6: Cấu trúc Data Directory ........................................................................ 37
Hình 3.1.7: Vị trí của Data Directory trong Optional Header ................................. 38
Hình 3.1.8: Các thành phần của Data Directory ...................................................... 39
Hình 3.1.9: Hình ảnh minh họa việc Import Sections .............................................. 43
Hình 3.1.10: Hình ảnh minh họa việc Export Sections ............................................ 45
Hình 3.1.11: Trường hợp module export theo cả 2 cách ......................................... 46
4
Hình 3.2.1: Trình tự hoạt động chương trình giữa có và không rẽ nhánh ............... 49
Hình 3.2.2: Thành phần của mã độc mới được tạo ra. ............................................. 50
Hình 3.2.3: Cấu trúc tệp tin mới được tạo ra. .......................................................... 51
Hình 3.2.4: Mô hình xử lý công việc đối với máy ảo .............................................. 58
Hình 3.2.5: Thực thi hàm MessageBoxA mà không cần gọi API. .......................... 61
Hình 3.2.6:Bảng Import Directory không có thư viện user32.dll. ........................... 61
Hình 3.2.7: Sơ đồ xác thực sử dụng Chữ ký số. ...................................................... 62
Hình 3.2.8: Chữ ký số trên tệp tin cài đặt phần mềm BKAV. ................................. 64
Hình 3.2.9: Mã độc giả mạo chữ ký số giả. ............................................................. 65
Hình 3.2.10: Sự lây lan của Stuxnet. ........................................................................ 66
Hình 3.3.1: Khi chạy trực tiếp chương trình ............................................................ 67
Hình 3.3.2: Khi chạy chương trình thông qua Visual Studio 2012 ......................... 67
Hình 3.3.3: Khi chạy chương trình ở máy thật ........................................................ 68
Hình 3.3.4: Khi chạy chương trình trong máy ảo VMware Workstation 11 ........... 68
Hình 3.3.5: Lây nhiễm vào các tệp tin trong ổ đĩa E. .............................................. 68
Hình 3.3.6: Thực thi chương trình bị nhiễm. ........................................................... 69
Hình 3.3.7: Tiến trình con được thực thi với quyền SYSTEM ................................ 69
Hình 3.3.8: Kích thước tệp tin thay đổi sau khi bị nhiễm ........................................ 70
Hình 3.3.9: Kết quả Scan Online. ............................................................................ 70
Hình 3.3.10: Kết quả Scan sau khi ký chữ ký số. .................................................... 71
TỪ VIẾT TẮT
Viết tắt Viết đầy đủ
AV Antivirus
PE Portable Executable
API Application Programming Interface
5
LỜI MỞ ĐẦU
Giới thiệu
Trong giai đoạn hiện nay, khi công nghệ thông tin được ứng dụng vào hầu hết
các lĩnh vực của cuộc sống, yêu cầu về an toàn thông tin càng trở nên quan trọng
hơn. Chính vì vậy, các phần mềm phòng chống mã độc (hay phần mềm Antivirus)
ngày càng được nhiều người biết đến. Nhưng cũng vì lẽ đó, người sử dụng đang quên
dần cách tự bảo vệ máy tính của mình, thay vào là giao phó toàn bộ sự an toàn của
máy tính nói chung và các dữ liệu trong máy tính nói riêng vào các phần mềm
Antivirus. Theo ước tính của Trung tâm Nghiên cứu Chiến lược và Quốc tế (CSIS)
Hoa Kỳ, trong năm 2014, cả thế giới tổn thất 445 tỷ USD do tội phạm mạng gây ra
và 8.500 tỷ đồng là số tiền thiệt hại mà người sử dụng Việt Nam phải hứng chịu từ
các loại mã độc máy tính. Liệu các phần mềm Antivirus có thực sự đem lại hiệu quả
cho người sử dụng?
Thông qua nội dung đề tài: “Nghiên cứu một số kỹ thuật sinh mã độc tự
động và vượt qua các phần mềm phòng chống mã độc”, nhóm nghiên cứu đã tìm
hiểu các kiến thức về mã độc, các kỹ thuật sinh mã độc tự động, cũng như muốn
kiểm chứng tính an toàn của các phần mềm phòng chống mã độc. Từ đó có cái nhìn
chính xác hơn về mã độc và cách thức để tự bảo vệ máy tính của mình.
Ý nghĩa, mục đích và yêu cầu
Ý nghĩa:
Ý nghĩa khoa học:
o Tìm hiểu tổng quan về mã độc, phân loại và cách thức lây lan mã độc.
o Nghiên cứu về một số công cụ sinh mã độc tự động hiện có.
o Tìm hiểu một số kỹ thuật phát hiện mã độc của các phần mềm phòng
chống mã độc.
o Tìm hiểu một số kỹ thuật vượt qua cơ chế phát hiện của các phần mềm
phòng chống mã độc.
Ý nghĩa thực tiễn:
o Có khả năng ứng dụng trong các bài toán phát hiện và nhận dạng mã độc
o Có khả năng ứng dụng vào các lĩnh vực liên quan đến an toàn thông tin
6
Mục đích:
Nghiên cứu tổng quan về mã độc và một số công cụ sinh mã độc tự động.
Nghiên cứu, phân tích và đưa ra các giải pháp vượt qua các phần mềm
phòng chống mã độc
Yêu cầu:
Nghiên cứu tổng quan về mã độc và một số công cụ sinh mã độc tự động.
Nghiên cứu các giải pháp vượt qua các phần mềm phòng chống mã độc.
Xây dựng chương trình thử nghiệm các giải pháp vượt qua các phần mềm
phòng chống mã độc.
Nội dung đề tài
Nội dung của đề tài được trình bày thành 6 phần:
Lời mở đầu
Chương 1: Tổng quan về mã độc. Chương 1 trình bày khái quát về mã độc,
khái niệm, mục đích, phân loại mã độc và các hình thức lây lan của mã độc. Bên
cạnh đó, chương 1 cũng trình bày nghiên cứu về một số công cụ sinh mã độc tự động.
Chương 2: Tổng quan về phần mềm phòng chống mã độc. Chương 2 giới
thiệu về các phần mềm phòng chống mã độc, nguyên lý phát hiện mã độc và một số
kỹ thuật phát hiện mã độc được sử dụng trong các phần mềm phòng chống mã độc.
Chương 3: Nghiên cứu các kỹ thuật vượt qua phần mềm phòng chống mã
độc. Chương 3 tập trung trình bày các kỹ thuật vượt qua các phần mềm phòng chống
mã độc đã được công bố: kỹ thuật mã hóa, kỹ thuật rẽ nhánh… Bên cạnh đó, Chương
3 cũng trình bày, phân tích và áp dụng một số kỹ thuật khác như kỹ thuật sử dụng
chữ ký số, khai thác lỗ hổng trên Hệ điều hành, nhằm làm tăng hiệu quả vượt qua
phần mềm phòng chống mã độc.
Kết luận
Tài liệu tham khảo
7
TỔNG QUAN VỀ MÃ ĐỘC
1.1. Giới thiệu
1.1.1. Khái niệm, phân loại và mục đích của mã độc
a. Khái niệm:
Mã độc là một thuật ngữ dùng để ám chỉ những phần mềm được cài đặt vào
máy tính, thực hiện những nhiệm vụ không mong muốn, thường nhằm phục vụ lợi
ích cho bên thứ ba nào đó.
Hiện nay, mã độc không chỉ xuất hiện trong các máy tính mà còn xuất hiện
trong các thiết bị điện tử, thiết bị số khác như điện thoại di động, các thiết bị điều
khiển từ xa…
b. Phân loại:
Mã độc ngày nay đã phát triển dưới nhiều hình thái khác nhau. Mã độc không
chỉ tồn tại dưới một dạng đơn thuần mà còn là sự pha trộn, lai tạo dựa nhiều dạng.
Dưới đây là một số loại mã độc:
Virus: loại mã độc có khả năng tự nhân bản, lây lan trực tiếp vào các tệp tin
dữ liệu của máy tính. Virus có thể thay đổi hoặc xóa bỏ các tệp tin dữ liệu máy tính.
Worm: khác với virus, loại mã độc này không trực tiếp vào các tệp tin dữ liệu
của máy tính, không cần phải gắn vào một chương trình để thực thi hoạt động. Nhưng
vẫn có khả năng tạo ra bản sao để đánh cắp hoặc phá hủy dữ liệu của máy tính.
Trojan: loại mã độc này không có khả năng nhân bản, được che giấu hoặc tạo
một vỏ bọc an toàn của những phần mềm hợp lệ. Chúng bí mật kết nối Internet, đánh
cắp các thông tin máy tính, hoặc phối hợp với Backdoors để tạo ra các điều khiển
máy tính, lây lan các loại mã độc khác từ xa.
Rootkit: loại mã độc nguy hiểm, lây nhiễm vào máy tính ở mức thấp như hệ
điều hành… nên rất khó phát hiện. Chúng gần như “vô hiệu” đối với các phần mềm
phát hiện mã độc.
8
Keyloggers: loại mã độc gián điệp có khả năng thu thập mọi thông tin (tài
khoản đăng nhập, mật khẩu, thông tin cá nhân…) khi bạn gõ bàn phím máy tính. Các
thông tin này sẽ được chuyển ra ngoài nhằm phục vụ việc đánh cắp thông tin.
Adware: loại mã độc này hiển thị những quảng cáo không mong muốn trên
màn hình của người dùng. Về bản chất, các quảng cáo này chỉ gây phiền nhiễu, không
gây nguy hiểm tới người dùng. Nhưng chúng lại được lợi dụng để thực hiện các loại
mã độc khác.
Spyware: loại mã độc gián điệp có khả năng lén lút thu thập thông tin về máy
tính bị lây nhiễm như thông tin hệ thống, địa chỉ IP máy tính, các websites đã ghé
thăm… và gửi các thông tin đó ra ngoài.
Browser Hijacker: có khả năng sửa đổi các thiết lập trên trình duyệt máy tính
như trang mặc định (Home page), thanh công cụ tìm kiếm, tạo ra các phím tắt máy
tính, hiển thị quảng cáo hoặc chuyển hướng liên kết trang web…
Mobile Threats: khác với các loại mã độc trên máy tính, đây là loại mã độc
mới trên các thiết bị di động. Mục đích chủ yếu của loại mã độc này là theo dõi, đánh
cắp thông tin của người sử dụng.
c. Mục đích của mã độc:
- Trò đùa giữa những người lập trình mã độc
- Khẳng định bản thân
- Học tập, nghiên cứu
- Phá hủy dữ liệu, hệ thống máy tính
- Theo dõi và đánh cắp thông tin máy tính, thông tin cá nhân người dùng…
1.1.2. Các thức lây nhiễm mã độc
- Lây nhiễm theo cách cổ điển: mã độc lây nhiễm từ máy tính này sang máy tính
khác, từ thiết bị này sang thiết bị khác thông qua các phương tiện lưu trữ dữ
liệu như: đĩa CD, USB flash, Ổ cứng di động…
- Lây nhiễm qua thư điện tử: mã độc được gắn vào các thư điện tử, các tệp tin
đính kèm, các đường link ẩn… người sử dụng khi nhận được thư điện tử đã
không kiểm tra kỹ, gián tiếp thực thi mã độc.
9
- Lây nhiễm qua truy cập trang web: mã độc được gắn trên các banner, quảng
cáo của các trang web, người sử dùng sẽ trực tiếp hoặc gián tiếp truy cập vào
các trang web bị dính mã độc và bị lây nhiễm.
- Lây nhiễm qua các phần mềm cài đặt: mã độc được đính kèm trong các phần
mềm cài đăt, người sử dụng sẽ bị lây nhiễm khi thực hiện quá trình cài đặt
hoặc sau khi cài đặt phần mềm. Các lây nhiễm này thường dựa vào sự thiếu
hiểu biết hoặc không đọc kỹ các yêu cầu cài đặt của phần mềm.
- Lây nhiễm qua khai thác lỗi bảo mật: thông qua việc khai thác các lỗi bảo mật
trên hệ điều hành, cấu trúc tệp tin… để cài các mã độc nên máy tính nạn nhân.
1.1.3. Các loại mã độc mới và dự đoán xu hướng mã độc trong tương lai
Theo AV-Test, có đến hơn 140 triệu loại mã độc mới xuất hiện trong năm
2014, nhiều hơn hẳn so với các năm trước. Bên cạnh sự vượt trội về số lượng, cũng
có thể thấy năm 2014 xuất hiện nhiều mã độc có đặc điểm khác biệt so với các mã
độc trước đây. Các loại mã độc mới ngày càng được thiết kế tinh vi hơn, đặc biệt các
mã độc được thiết kế cho mục đích tấn công có chủ đích nhằm vào cá nhân hoặc các
tổ chức lớn.
Hình 1.1.1: Thống kê các loại mã độc mới xuất hiện theo năm.
10
Dự đoán trong những năm tới xu hướng phát triển của mã độc sẽ tiếp tục xuất
hiện các phần mềm gián điệp tinh vi nhằm vào hạ tầng trọng yếu của các quốc gia để
đánh cắp và phá huỷ. Các mã độc trên di động tiếp tục tăng nhanh và sẽ xuất hiện
nhiều biến thể phần mềm mã hoá tống tiền (ransomware) trên di động. Quyền riêng
tư của người sử dụng tiếp tục là vấn đề nóng đặc biệt là trên các hãng sản xuất thiết
bị di động hoặc các ứng dụng di động. Có thể xuất hiện nhiều vụ lọ lọt dữ liệu của
người sử dụng tương tự như vụ các diễn viên nổi tiếng bị lộ ảnh nóng trên iCloud.
Các dịch vụ lưu trữ dữ liệu đám mây gặp phải sự nghi ngại của người sử dụng do
vấn đề đảm bảo an toàn. Mạng xã hội như Facebook sẽ trở thành con đường chủ yếu
để những kẻ lừa đảo hoạt động. Các cuộc tấn công mạng mang màu sắc chính trị gia
tăng giữa nhóm hacker của các quốc gia. Hacker tiếp tục nhằm vào các giao thức
mạng hoặc thư viện quan trọng với hy vọng tìm ra những lỗ hổng tương tự Heartbleed
hay Shellshock. Doanh nghiệp đối đầu với các cuộc tấn công đánh cắp dữ liệu ngày
càng tinh vi. Đặc biệt là các tổ chức tài chính và cung cấp dịch vụ internet.
1.2. Các công cụ sinh mã độc tự động
1.2.1. Hướng tiếp cận
Để tiến hành nghiên cứu các công cụ sinh mã độc tự động, nhóm nghiên cứu
sử dụng kỹ thuật Dịch ngược để nghiên cứu cách thức hoạt động của công cụ.
Chuẩn bị:
- Máy ảo và Sanboxie để thực thi chương trình
- Một số công cụ sinh mã độc tự động: JPS (Virus Maker 3.0), TeraBIT Virus
Maker 3.2
- Công cụ Dịch ngược: IDA Pro, Ollydbg
- Các công cụ khác: CFF Explorer, Exeinfo PE…
Mục đích:
Mục đích của việc nghiên cứu là tìm ra phương pháp tự động sinh mã độc, từ
đó có thể xây dựng chương trình tự động sinh hoặc tìm hiểu đặc trưng của các loại
mã độc được sinh tự động để có thể phát hiện và phòng chống.
11
1.2.2. JPS (Virus Maker 3.0)
Thông tin về chương trình:
Hình 1.2.1: Thông tin về chương trình JPS (Virus Macker 3.0)
Chương trình JPS (Virus Maker 3.0) có giao diện như hình dưới đây:
Hình 1.2.2: Giao diện của chương trình JPS (Virus Maker 3.0)
12
Sau khi lựa chọn thử các chức năng, bấm “Create Virus!”. Ta nhận được một
tệp tin “SENDER.EXE” như hình dưới đây.
Hình 1.2.3: Mã độc được tạo ra từ chương trình
Sử dụng công cụ ExeInfoPE để kiểm tra tệp tin mới được tạo ra. Kết quả cho
thấy, tệp tin được nén bằng chương trình UPX.
Hình 1.2.4: Sử dụng Exeinfor PE để xác định trình bảo vệ của mã độc
Tệp tin thực thi đã được nén bằng một trình nén UPX nhưng được người sử
dụng chỉnh sửa. Vậy nên, không thể giải nén bằng các công cụ tự động. Do vậy, ta
sẽ debug các hàm trong mẫu mã độc được sinh ra để xem xét một số chức năng.
Trong hình dưới đây, mã độc tiến hành kiểm tra có thực hiện việc chọn (đánh
dấu) vào chức năng đổi mật khẩu Windows hay không, nếu có sẽ thực hiện đổi mật
khẩu của người dùng trên Windows. Bằng cách sử dụng lệnh “net user” bằng lệnh
WinExec.
13
Hình 1.2.5: Lệnh “net user” được thực thi trong mã độc
Dưới đây là chức năng tự động sao chép với thời gian định trước, mã độc sử
dụng hàm User32.SetTimer với tham số truyển vào là 60000ms, sau mỗi lần lại tiến
hành copy tệp tin tới một thư mục gần vị trí của nó bằng hàm Explorer.00459F4.
Hình 1.2.6: Cứ sau 1 phút mã độc lại tự sao chép chính nó tới vị trí khác
Các chức năng của mã độc được sinh ra thực hiện đúng như mong đợi. Phân
tích chương trình sinh ta có được.
14
Hình 1.2.7: Resource data trong chương trình JPS
Các resource trong chương trình này tương ứng là các tệp tin PE với đầy đủ
các chức năng, nhưng khác nhau đối tượng ICO – được định nghĩa là biểu tượng của
chương trình mã độc được sinh ra. Có thể là tệp tin PDF, tệp tin nén ZIP...
Phân tích chương trình sinh mã độc bằng IDA pro. Chương trình được thực
hiện như sau:
15
Hình 1.2.8: Các bước thực thi của chương trình chính
- Đầu tiên, nạp dữ liệu tệp tin nhị phân từ resource của chương trình vào trong
bộ nhớ.
- Nạp dữ liệu về địa chỉ offset của tệp tin nhị phân về các chức năng được chọn.
- Tiến hành sửa đổi các byte code trong tệp tin nhị phân trên bộ nhớ.
- Xuất ra tệp tin mã độc.
16
Mô tả thuật toán như sau:
Begin;
Read(resource);
Read(AddressByteCode)
Patch(AddressByteCode);
ChoseIcon();
WriteFile();
End;
1.2.3. TeraBIT Virus Maker 3.2
Giao diện chính của chương trình:
Hình 1.2.9: Giao diện của chương trình TeraBIT virus macker 3.1
Lựa chọn các “chức năng” của virus sau đó “Creat Virus”. Kiểm tra chương
trình được viết bằng ngôn ngữ, cũng như trình biên dịch hay trình bảo vệ bằng
Exeinfo PE.
17
Chương trình được viết bằng MS Visual Basic 6.0. Và không được pack hay
protect bằng các trình bảo vệ khác. Tiến hành dịch ngược để có được các đoạn mã
của chương trình.
Hình 1.2.10: Mã độc được viết bằng MS Visual Basic
Ta sử dụng “VB Decompiler Pro” – đây là một công cụ chuyên nghiệp trong
việc dịch ngược lại mã của các chương trình được viết bằng MS Visual Basic 6.0.
Về cơ bản, nguyên lý hoạt động của TeraBIT Virus Maker 3.2 tương tự như
của JPS (Virus maker 3.0). và cũng thực hiện các bước làm tương tự.
Với mỗi lựa chọn được đánh dấu tại giao diện của chương trình, dữ liệu địa
chỉ bycode sẽ được nạp và thay đổi.
Hình 1.2.11: So sánh resource trong tệp tin trước và sau khi patch
Tệp tin A: là tệp tin được tạo ra với đầy đủ các chức năng.
Tệp tin B: là resource trong chương trình.
18
Hai tệp tin này chỉ khác nhau một số byte trong chương trình và PE header, dữ
liệu về biểu tượng hiển thị (phần dưới cùng). Chứng tỏ resource đã bị chỉnh sửa theo
phương pháp đã trình bày ở trên để sinh ra được mã độc có thể thực thi.
1.2.4. Kết quả
Hầu hết các công cụ tự động sinh mã độc được nghiên cứu đều sử dụng phương
pháp sinh mã độc như sau:
Bước 1: Tạo ra một mã độc có đầy đủ các chức năng.
Bước 2: Xây dựng một công cụ Patcher để sửa đổi một số byte code trong tệp
tin nhị phân của mã độc tương ứng với mỗi lựa chọn chức năng hay cấu hình cài đặt
của mã độc được sinh ra.
Hình 1.2.12: Mô tả quá trình patch
Bước 3: Ghi tệp tin mã độc được sinh ra bằng Patcher.
19
TỔNG QUAN VỀ PHẦN MỀM PHÒNG CHỐNG MÃ ĐỘC
2.1. Giới thiệu
Hầu hết các loại mã độc đã xuất hiện trên thế giới từ những năm 1980 hoặc
thậm chí là sớm hơn. Cùng với đó là những mục đích khác nhau khi mã độc được
tạo ra. Thế nhưng mãi đến năm 1987, hai tiện ích phòng chống virus đầu tiên được
ra đời là: Flushot Plus và Anti4us. Trong khoảng từ năm 1987 đến năm 1989, một
nhóm với tên gọi “Virus-L” đã chia sẻ các thông tin về vấn để bảo mật thông tin, các
công cụ, cách thức giúp hạn chế sự lây nhiễm của virus. Cá nhân đầu tiên đã sử dụng
những thông tin này vào việc kinh doanh các sản phẩm phòng chống sự lây nhiễm
virus là John McAfee. Tiếp sau đó là các hãng phần mềm Kaspersky và Norton ra
đời, mở ra cánh cửa mới cho ngành công nghệ sản xuất phầm mềm phòng chống sự
lây lan của virus, mà nay có tên gọi là các phần mềm phòng chống mã độc.
Các phần mềm phòng chống mã độc (Antivirus Software) phổ biến tại Việt Nam
năm 2014:
- Kaspersky Antivirus Software
- Avast Antivirus Software
- Bitdefender Antivirus Software
- Norton Antivirus Software
- Antivirus Guard Software (AVG)
- Bach Khoa Antivirus (Bkav)
- CMC Antivirus Software
Các sản phẩm Antivirus chiếm thị phần nhiều nhất trên thế giới theo báo cáo
thống kê tháng 1/2015 của OPSWAT – là một công ty phần mềm chuyên cung cấp
các kỹ sư, các công cụ và dịch vụ phát triển phần mềm bảo mật)
20
Hình 2.1.1: Thị phần các sản phẩm Antivirus 1/2015 theo OPSWAT.
2.2. Nguyên lý phát hiện mã độc
Hình 2.2.1: Sự phân chia về các kỹ thuật phát hiện mã độc.
Như vậy, có thể thấy các kỹ thuật phát hiện mã độc được chia thành 2 nhóm
chính là:
- Signature-based: dựa vào dấu hiệu đặc trưng
- Anomaly-based: dựa vào các điểm bất thường
Các kỹ thuật phân tích được sử dụng trong các kỹ thuật phát hiện mã độc là:
- Stactic: phân tích tĩnh
- Dynamic: phân tích động
- Hybrid: phân tích lai, là sử kết hợp giữa phân tích động và tĩnh.
21
2.2.1. Phát hiện mã độc dựa vào dấu hiệu đặc trưng
Là việc sử dụng một tập các mẫu nhận dạng được gọi là signature để làm căn
cứ xác định mã độc. Tập các signature sẽ được xây dựng bằng việc cập nhật các mẫu
mã độc đã được kiểm chứng, bằng việc sử dụng những mẫu được xây dựng chuyên
biệt bởi các nhà nghiên cứu.
Ưu thế:
- Phát hiện chính xác các mã độc nếu như có các signature trùng khớp với các
mẫu trong tập mẫu nhận dạng
Hạn chế:
- Vậy xây dựng tập các signature hoàn chỉnh là vô cùng khó khăn.
- Tập mẫu nhận dạng sẽ chạy theo sau sự phát triển của mã độc, và sẽ không
phát hiện được các mã độc mới, các zero-days.
- Khi số lượng signature lớn thì việc lưu trữ và đối chiếu cũng sẽ gặp khó khăn
Hình 2.2.2: Việc xây dựng tập signature hoàn chỉnh là vô cùng khó khăn
Kỹ thuật Nội dung
Dynamic
Xác định chính xác mã độc bằng việc chỉ sử dụng các
thông tin thu thập được từ các chương trình có quyền kiểm
tra (Program Under Inspection – PUI) và được đối chiếu với
các tập mẫu.
22
Static
Bằng cách kiểm tra chương trình dưới các mã, các đoạn
code hoặc kiểm tra hành vi bằng các chuỗi mã. Từ đó đối
chiếu với tập mẫu để phân loại chương trình có chứa mã độc
hay có phải là mã độc hay không.
Điều này giúp việc xác định mã độc có xác suất rất cao,
gần như là tuyệt đối mà không cần thực thi chương trình.
Bù lại, cách thức này mất nhiều công sức, thời gian.
Hybrid Cách thức xác định sử dụng cả 2 hình thức Dynamic và
Static.
2.2.2. Phát hiện mã độc dựa vào đặc điểm bất thường
Cách phát hiện dựa vào các điểm bất thường được chia thành 2 giai đoạn:
- Giai đoạn Training Learning: các detector sẽ cố gắng học những trạng thái
bình thường. Có thể học các trạng thái từ các host, PUI…
- Giai đoạn Detection Monitoring: dựa vào các trạng thái bình thường đã được
học, các detector sẽ xác định được trạng thái bất thường và đưa ra cảnh báo.
Hình 2.2.3: Phân loại hành vi trong kỹ thuật Anomaly-based Detection
Ưu điểm:
- Là chìa khóa để có thể phát hiện ra các khai thác zero-day hay zero-attack.
23
Hạn chế:
- Sai số giữa trạng thái bình thường và bất thường
- Sự phức tạp, rắc rối khi xác định những trạng thái được phép học
Kỹ thuật Nội dung
Dynamic
Các thông tin thu được từ việc thực thi chương trình sẽ được
sử dụng để phát hiện mã độc.
Ở giai đoạn Detection, các detector thực hiện liên tục việc
đối chiếu giữa các trạng thái mới với các trạng thái đã học
được. Và giai đoạn Detection được triển khai trong suốt quá
trình chương trình được thực thi.
Static
Các đặc trưng về cấu trúc tệp tin của chương trình sẽ được
dùng để kiểm tra và xác định có phải là mã độc hay không.
Đặc điểm nổi bật của cách này là có thể phát hiện mã độc
nhưng không cho chương trình mã độc thực thi.
Hybrid
Sử dụng một môi trường giả lập có cấu trúc giống với máy
thật, có thể gọi đó là máy ảo để sử dụng phối hợp 2 kỹ thuật
phân tích trên mà không làm ảnh hưởng đến máy thật.
2.3. Các kỹ thuật phát hiện mã độc
2.3.1. Checksummers
Về cơ bản, Checksummers là kỹ thuật phát hiện đối tượng mã độc trên cơ sở
tính toàn vẹn của chương trình. Mỗi chương trình sau khi được xác định chắc chắn
là mã độc sẽ được sử dụng để tạo ra mẫu mã hash (MD5, SHA, CRC…) tương ứng
với loại mã độc đó. Do tính chất của mã hash nên một loại mã độc chỉ tương ứng với
một mã hash nhận dạng (Xác suất trùng lặp là rất thấp). Sau đó, cập nhật mẫu đó vào
cơ sở dữ liệu của chương trình Antivirus. Khi Antivirus quét tập tin để kiểm tra, nếu
trùng mã hash trong cơ sở dữ liệu mẫu, thì đó là mã độc. Ngược lại là không.
24
Hình 2.3.1: Tệp chứa mã độc được quét trên trang virustotal.com
Ưu điểm:
- Độ chính xác gần như tuyệt đối
Nhược điểm:
- Nhận dạng thiếu. Quá trình nhận dạng lâu nếu cơ sở dữ liệu mẫu lớn.
- Quá trình xây dựng cơ sở dữ liệu mẫu khó khăn, phức tạp. Mã độc có thể dễ
dàng vượt qua nếu nhận dạng bằng mã hash.
2.3.2. Fuzzy Hashing
Để cải tiến nhược điểm dựa vào mã hash của kỹ thuật Checksummers, các nhà
khoa học đã tìm ra một kỹ thuật khác có tên là Fuzzy Hashing. Kỹ thuật mới này về
cơ bản vẫn là nhận dạng chương trình mã độc qua mã hash nhưng đã được bổ sung
thêm các phân tích và tính toán để từ một mã hash của mã độc, có thể nhận ra các
mã hash “họ hàng”, nâng cao khả năng phát hiện chương trình mã độc.
Fuzzy hashing = Context Triggered Piecewise Hashing (CTPH)
= Piecewise hashing + Rolling hashing
25
Trong đó:
- Piecewise Hashing: chia nhỏ đoạn tin thành N khối và tính toán giá trị hash
cho từng khối tin.
- Rolling Hash: là một phương pháp tính giá trị hash cho mỗi khối tin một cách
nhanh chóng
Hình 2.3.2: Cách tính toán giá trị hash với mỗi khối 3 ký tự
Khi Rolling Hash tạo ra giá trị cụ thể cho từng vị trí, nó sẽ tính toán giá trị
hash mã hóa của từng khối đoan tin từ điểm bắt đó cho đến vị trí đã xác định. Tiếp
đó là tạo ra mã hash cho toàn bộ đoạn tin bằng cách ghép từng mã hash của từng khối
đoạn tin. Ngoài những đoạn tin giống nhau có mã hash giống nhau, còn có thể xác
định những đoạn tin tương tự nhau.
Hình 2.3.3: Mô tả sau khi tiến hành Rolling hash
Ưu điểm:
- Cải thiện tính bị động của kỹ thuật Checksummer sử dụng mã hash đơn thuần.
26
- Nâng cao khả năng phát hiện mã độc với cơ sở dữ liệu mẫu bị hạn chế
Nhược điểm:
- Việc xây dựng thuật toán và lựa chọn độ dài ký tự phù hợp là khó khăn.
- Có thể xảy ra cảnh bảo giả (cảnh báo sai).
2.3.3. Scan String
Scan string là cách đơn giản để phát hiện mã độc. Kỹ thuật này sử dụng một
chuỗi trích ngang (chuỗi bytes) là đặc trưng của tập tin mã độc và không tồn tại trong
các tập tin sạch. Các chuỗi này sẽ được cập nhật vào cơ sở dữ liệu mẫu dùng để nhận
dạng mã độc.
Hình 2.3.4: Một đoạn mã của virus Stoned khi được phân tích
Ví dụ với virus Stoned, dấu hiệu nhận dạng là 16 bytes opcode 0400 B801
020E 07BB 0002 33C9 8BD1 419C (đã được công bố trong tạp chí Virus Bulletin)
Ưu điểm:
- Nhận dạng chính xác
- Tốc độ nhận dạng nhanh hơn so với kỹ thuật Checksummers.
Nhược điểm:
- Quá trình xây dựng và cập nhật cơ sở dữ liệu phức tạp
- Nhận dạng bị động, không phát hiện được khi mã chương trình bị thay đổi.
27
2.3.4. Code Emulation
Code Emulation là một kỹ thuật phát hiện mã độc được đánh giá cao. Bằng
việc mô phỏng lại hệ thống CPU, hệ thống quản lý bộ nhớ, các chỉ thị máy ở cấp
thấp… giống như máy quét thực tế. Vì vậy, mã độc sẽ hoạt động trên máy ảo mà
không ảnh hưởng đến bộ xử lý thật.
Hình 2.3.5: Cấu trúc của thanh ghi và cờ CPU Intel 16bit được định nghĩa lại bằng
ngôn ngữ C
Hiện nay, kỹ thuật này được sử dụng kết hợp rộng rãi với các kỹ thuật phân
tích khác. Cùng với đó, kỹ thuật này đã trở thành một thành phần quan trọng trong
công nghệ Sandbox để phát hiện mã độc.
Ưu điểm:
- Mã độc hoạt động độc lập, không ảnh hưởng đến hệ thống máy thật
Nhược điểm:
- Mô phỏng lại các thông tin hệ thống CPU, bộ nhớ… là rất khó khăn
- Cập nhật và vận hành hệ thống mô phỏng yêu cầu tính kỹ thuật cao.
28
2.3.5. Static Heuristic Analysis
Static Heuristic analysis là kỹ thuật thuộc nhóm Anomaly-based detection. Kỹ
thuật này phân tích, tính toán những thông tin từ chương trình như: PE Header,
Section, các hàm API được Import… hay những dấu hiệu đáng nghi ngờ như: kích
thước của một số trường không chính xác, mã điều hướng, tổ hợp các Flag…
Hình 2.3.6: Kỹ thuật Heuristic nhận dạng một số virus thực tế
Một nổi bật của kỹ thuật này là ứng dụng trong việc sử dụng trí tuệ nhân tạo
trong việc phát hiện các loại mã độc. Việc thu thập các đặc trưng của mã độc
(feature), sau đó tính toán và đưa ra các ngưỡng lây nhiễm (threshold infected) để
làm căn cứ phát hiện mã độc.
Hình 2.3.7: Phân loại ngưỡng lây nhiễm ở mức đơn lớp.
29
Ưu điểm:
- Chủ động trong việc xây dựng cơ sở dữ liệu mẫu.
- Nâng cao khả năng nhận dạng mã độc (bao gồm cả những loại mã độc chưa
có trong cơ sở dữ liệu mẫu)
Nhược điểm:
- Khó khăn trong việc lựa chọn các đặc trưng để sử dụng cho việc phân loại
ngưỡng lây nhiễm
- Có thể xảy ra cảnh báo giả (cảnh báo sai).
2.3.6. Behavior Blocking
Behavior Blocking là kỹ thuật cho phép ngăn chặn các hành vi, các khối lệnh
bị nghi ngờ là mã độc trước khi chúng có cơ hội ảnh hưởng đến hệ thống. Các hành
vi bị giám sát bao gồm:
- Những nỗ lực mở, xem, sửa đổi hoặc xóa bỏ các tệp tin.
- Những nỗ lực fomat ổ đĩa hay vùng hoạt động không thể khôi phục khác.
- Sửa đổi các thiết lập của tệp tin thực thi và hệ thống như: thiết lập khởi động…
Hình 2.3.8: Một khối ngăn chặn hành vi lừa đảo trên DOS
30
Hệ thống phát hiện và ngăn chặn mã độc sử dụng kỹ thuật này được chia thành
2 loại là: hệ thống ngăn chặn dựa trên các chính sách và hệ thống ngăn chặn dựa trên
các giám định.
Ưu điểm:
- Có khả năng ngăn chặn sự ảnh hưởng của chương trình mã độc lên hệ thống
- Tùy theo năng lực phân tích để tùy chỉnh ảnh hưởng của mã độc
Nhược điểm:
- Yêu cầu người (hệ thống) phân tích phải có tính chuyên môn cao.
- Có thể xảy ra cảnh báo giả (cảnh báo sai).
31
NGHIÊN CỨU CÁC KỸ THUẬT VƯỢT QUA PHẦN MỀM
PHÒNG CHỐNG MÃ ĐỘC
3.1. Cấu trúc tệp tin thực thi trên Hệ điều hành Windows 32bit
Sự hiểu biết cơ bản về định dạng tệp tin thực thi là rất quan trọng cho quá trình
phân tích mã độc hại hoặc viết ra một chương trình virus lây nhiễm tệp tin PE.
PE File Format (Portable Executable File Format): là định dạng tệp tin của
Windows 32bit và Windows 64bit. Nhóm nghiên cứu sẽ tập trung tìm hiểu về tệp tin
PE trong Hệ điều hành Windows 32bit. Tất cả các tệp tin có thể thực thi được trên
Windows 32bit như: *.EXE, *.DLL (32 bit),*.COM,*.NET, *.CPL,… đều là định
dạng PE; ngoại trừ các tập tin VxDs và *.DLL (16 bit).
Cấu trúc của một PE Tệp tin:
Hình 3.1.1: Minh họa cấu trúc cơ bản của một PE Tệp tin
32
a. DOS MZ Header:
DOS MZ header (Hay DOS HEADER) là vùng bắt đầu của tệp tin PE, chiếm
giữ 64 bytes đầu tiên.
Hình 3.1.2: Một tệp tin PE được mở bằng công cụ FileInSight của McAfee
DOS Header là một cấu trúc được định nghĩa trong tệp tin windows.inc hoặc
winnt.h. DOS HEADER bao gồm 19 thành phần. Trong đó có 2 thành phần đáng chú
ý:
- e_magic: chứa ký tự
nhận biết DOS Header
hợp lệ (MZ). Mang giá
trị 2 bytes (WORD)
- e_lfanew: chứa địa chỉ
offset của PE Header
(điểm bắt đầu của PE
Header). Mang giá trị 4
bytes (DWORD)
33
b. DOS STUB:
DOS Stub chỉ là một chương trình DOS EXE nhỏ hiển thị một thông báo lỗi,
là phần để tương thích với Windows 16bit. Ví dụ như trong hình minh họa dưới đây,
thông báo sẽ hiện ra như sau: “This is program cannot be run in DOS mode”
Hình 3.1.3: Thành phần e_magic và e_flanew
: thành phần e_magic 2 bytes
: thành phần e_flanew 4 bytes
: DOS Stub
PE Header:
PE Header là thuật ngữ chung đại diễn cho một cấu trúc được đặt tên là
IMAGE_NT_HEADERS. IMAGE_NT_HEADERS có 3 thành phần và có cấu trúc
như sau:
struct IMAGE_NT_HEADERS {
Singature DWORD
FileHeader IMAGE_FILE_HEADER
OptionalHeaer IMAGE_OPTIONAL_HEADER32
};
PE Header gồm 248 bytes liền sau DOS STUB.
34
Hình 3.1.4: Hình ảnh PE header của tệp tin test.exe
Trong đó:
- Signature: dấu hiệu nhận biết định dạng tệp tin (4 bytes)
• (PE : 50 45 00 00 – 32 bits)
• (NE : 4E 45 00 00 – 16 bits)
• (LE : 4C 45 00 00 – trình điều khiển thiết bị ảo Window 3.x)
• (LX : 45 58 00 00 – tệp tin cho OS/2 2.0 )
- File Header: chứa thông tin về sơ đồ bố trí vật lý và những đặc tính của tệp tin
(20 bytes)
- Optional Header: chứa thông tin về sơ đồ logic bên trong của một tệp tin PE
(224 bytes)
File Header:
File Header được định nghĩa giống như hình minh họa dưới đây:
struct IMAGE_FILE_HEADER {
Machine WORD
NumberOfSections WORD
TimeDateStamp DWORD
PointerToSymbolTable DWORD
NumberOfSymbols DWORD
35
SizeOfOptionalHeader WORD
Characteristics WORD
};
Cấu trúc File Header
Trong cấu trúc File Header, một số thành phần cần quan tâm hơn cả đó là:
- Machine: giá trị xác định tệp tin PE này được biên dịch cho dòng máy nào
(dưới dạng mã trên Intel 32 bits)
- NumberOfSections: cho biết số Section của tệp tin PE. Thành phần này cần
thay đổi nếu muốn thêm hoặc xóa bất kỳ sections nào trong một tệp tin PE.
- Characteristics: là bit cờ, xác định định dạng tệp tin PE.
- Giá trị 0x0102 nếu là tệp tin *.EXE
- Giá trị 0x2102 nếu là tệp tin *.DLL
Optional Header:
Optional Header bao gồm 31 thành phần, chiếm 224 bytes và được định nghĩa
giống như hình minh họa dưới đây:
struct IMAGE_FILE_HEADER {
Magic WORD
MajorLinkerVersion BYTE
MinorLinkerVersion BYTE
SizeOfCode DWORD
SizeOfInitializeData DWORD
SizeOfUninitializedData DWORD
AddressOfEntryPoint DWORD
BaseOfCode DWORD
BaseOfData DWORD
ImageBase DWORD
SectionAlignment DWORD
FileAlignment DWORD
MajorOperatingSystemVersion WORD
ManorOperatingSystemVersion WORD
MajorImageVersion WORD
36
MinorImageVersion WORD
MajorSubsystemVersion WORD
ManorSubsystemVersion WORD
Win32VersionValue DWORD
SizeOfImage DWORD
SizeOfHeaders DWORD
CheckSum DWORD
Subsystem WORD
DllCharacteristics WORD
SizeOfStackReserve DWORD
SizeOfStackCommit DWORD
SizeOfHeapCommit DWORD
LoaderFlags DWORD
NumberOfRvaAndSizes DWORD
DataDirectory IMAGE_DATA_DIRECTORY
};
Trong đó, các thành phần được mô tả như sau:
- Magic (2 bytes): xác định là tệp tin 32 bit (0B 01) hay 64 bit (0B 20)
- AddressOfEntryPoint (4bytes): chứa địa chỉ ảo tương đối (RVA) của câu lệnh
đầu tiên sẽ được thực thi khi chương trình PE loader sẵn sàng để chạy tệp tin
PE (.text hoặc .code)
- ImageBase: địa chỉ nạp được ưu tiên cho tệp tin PE.
- Section Alignment: phần liên kết của các Section trong bộ nhớ
- Tệp tin Alignment: phần liên kết của các Section trong tệp tin
- SizeOfImage: toàn bộ kích thước của PE image trong bộ nhớ, là tổng của tất
cả các headers và sections được liên kết tới Section Alignment
- SizeOfHeaders: kích thước của tất cả các headers + section table.
- Data Directory: là một mảng gồm 16 phần tử, trong đó mỗi phần liên quan đến
một cấu trúc dữ liệu quan trọng trong PE tệp tin.
37
Hình 3.1.5: Vị trí các thành phần của PE Header trong tệp tin test.exe
Data Directory:
Data Directory là một mảng gồm 16 phần tử.
Hình 3.1.6: Cấu trúc Data Directory
Mỗi phần tử có kích thước 8 bytes và có liên quan với một cấu trúc quan trọng
trong tệp tin PE. Vì vậy, có thể dễ dàng thấy được Data Directory là 128 bytes cuối
cùng của Optional Header.
38
Hình 3.1.7: Vị trí của Data Directory trong Optional Header
Mỗi phần tử có cấu trúc gồm 2 thành phần là VirtualAddress và isize.
- VirtualAddress là một địa chỉ ảo tương đối của cấu trúc dữ liệu
- Isize bao gồm kích thước theo bytes của cấu trúc dữ liệu
struct IMAGE_DATA_DIRECTORY {
VirtualAddress DWORD
iSize DWORD
};
Và đây là hình ảnh khi sử dụng chương trình LordPE. Tệp tin ví dụ chứa các
thành phần có giá trị khác 0, và ngược lại, các thành phần có giá trị bằng 0 là không
được sử dụng
39
Hình 3.1.8: Các thành phần của Data Directory
Sections và Section Table:
Section Table nằm ở phần Header, là một mảng của những cấu trúc
IMAGE_SECTION_HEADER, và chứa thông tin về mỗi Section. Cấu trúc này được
định nghĩa trong tệp tin windows.inc như sau:
struct IMAGE_SECTION_HEADER {
Name1 BYTE
union Misc
PhysicalAddress DWORD
VirtualSize DWORD
Ends
VirtualAddress DWORD
SizeOfRawData DWORD
PointerToRawData DWORD
PointerToRelocations DWORD
PointerToLinenumbers DWORD
NumberOfRelocations WORD
NumberOfLinenumbers WORD
Characteristics DWORD
};
40
Dưới đây là một số thành phần quan trọng cần lưu ý, đó là:
- VirtualSize: là kích thước của section’s data được tính theo bytes. Kích thước
này có thể nhỏ hơn kích của section trên đĩa (SizeOfRawData) và sẽ là những
gì mà trình loader định rõ vị trí trong bộ nhớ cho section đó.
- VirtualAddress: hay gọi là RVA (Relative Virtual Address – địa chỉ ảo tương
đối) của section. Trình PE Loader sẽ phân tích và sử dụng giá trị trong trường
này khi Trình Loader ánh xạ section vào trong bộ nhớ.
- SizeOfRawData: kích thước của section’s data trong tệp tin trên đĩa, được làm
tròn lên bội số tiếp theo của sự liên kết tệp tin bởi trình biên dịch.
- PointToRawData: hay còn gọi là Raw Offset, là offset từ vị trí bắt đầu của tệp
tin cho tới phần section’s data. Nếu giá trị là 0, thì sections’s data không được
chứa trong tệp tin. Trình PE Loader sẽ sử dụng giá trị này để tìm kiếm phần
data trong section nằm ở đâu trong tệp tin.
- Characteristics: bao gồm các cờ, cho biết thuộc tính của section.
Ví dụ:
0x00000020: Section bao gồm đoạn mã. (.text)
0x00000040: Section bao gồm phần dữ liệu (.data, .rdata, .bss)
Sections chứa nội dung chính của tệp tin, bao gồm code, data, resources và
những thông tin khác của tệp tin thực thi. Section được sử dụng để làm đơn giản hóa
việc liên kết các process. Và cung cấp môt thứ tự chuẩn cho việc lưu trữ các hàm, dữ
liệu để Trình Loader thực thi một chương trình.
Một số section thông dụng, hay xuất hiện trong một tệp tin thực thi là:
- Executable Code Section, có tên là .text. Section này chứa tất cả các code
segment và điểm Entry Point (điểm bắt đầu của hàm main())
- Data Section, có những tên như: .data, .rdata hoặc .bss, trong đó:
• .bss: biểu diễn dữ liệu không được khởi tạo cho ứng dụng, bao gồm các
biến toàn cục không được gán giá trị khởi tạo bên ngoài hàm main()
• .rdata: biểu diễn dữ liệu chỉ đọc ra (read only), ví dụ như những chuỗi, các
hằng, và thông tin thư mục debug
41
• Tất cả những biến toàn cục được khởi tạo giá trị nằm bên ngoài hàm main()
được lưu trữ trong section .data.
- Resources Section, có tên là .rsrc. Section này chứa các thông tin resource cho
một module
- Export Data Section, có tên là .edata. Section này chứa Export Directory cho
một chương trình ứng dụng hoặc tệp tin .DLL. Khi biểu diễn, section này bao
gồm các thông tin về tên và địa chỉ của những hàm được export
- Import Data Section, có tên là .idata. Section này chứa những thông tin khác
nhau về những hàm được import bao gồm cả Import Directory và bảng Import
Address Table
- Debug Information Section, có tên là .debug. Section này chứa thông tin
Debug. Mỗi một thư mục sẽ liên quan tới thông tin Debug trong section .debug
- Base Relocations Section, có tên là .reloc. Thông tin trong section này cho
phép trình PE Loader chỉnh sửa lại những địa chỉ (những địa chỉ không trong
phạm vi không gian địa chỉ ảo do
Ở mức tối thiểu nhất thì một tệp tin PE sẽ có 2 sections: 1 cho đoạn mã (code)
và 1 cho phần dữ liệu (data). Một chương trình ứng dụng không cần thiết phải có tất
cả những sections này.
Import và Export là 2 cơ chế cho phép tiến trình liên kết trong tệp tin .Dll thực
thi các mô tả trước đó.
Import Sections:
Import Sections bao gồm thông tin về tất cả các hàm được import bởi tệp tin
thực thi từ các tệp tin .Dll. Linker sẽ tạo ra một danh sách tất cả các hàm được import
– import table – bằng tên của module hiện thời. Như vậy, import table bao gồm một
danh sách các hàm được gọi trong mỗi module. Và thông qua bảng của những con
trỏ trỏ tới địa chỉ hàm (Import Address Table – IAT), trình Windows Loader sẽ nạp
các module trong import table.
Thông tin về tất cả các hàm được import được lưu trữ trong một vài cấu trúc
dữ liệu, trong đó quan trọng nhất là thành phần Import Directory.
42
Import Directory:
Import Directory thực sự là một mảng của các cấu trúc
IMAGE_IMPORT_DESCRIPTOR. Mỗi cấu trúc là 20 bytes và chứa thông tin về
một Dll mà PE Tệp tin import các hàm vào.
struct IMAGE_IMPORT_DESCRIPTOR {
union
Characteristics DWORD
OriginalFirstThunk DWORD
ends
TimeDateStamp DWORD
ForwarderChain DWORD
Name1 DWORD
FirstThunk DWORD
};
- Thành phần đầu tiên là Characteristics (DWORD) hoặc OriginalFirstThunk
(DWORD). Bởi từ union ở trên nên chỉ nhận giá trị hoặc là Characteristics
hoặc OriginalFirstThunk. Thành phần này chứa số thứ tự của hàm được import
hoặc là một RVA tới một cấu trúc có tên IMAGE_IMPORT_BY_NAME.
struct IMAGE_IMPORT_BY_NAME {
Hint WORD
Name1 BYTE
};
Trong đó:
- Hint: chứa chỉ mục bên trong Export Address Table của tệp tin Dll các hàm
hiện có trong đó. Tên tương ứng với chỉ mục được dùng.
- Name1: bao gồm tên của hàm được import. Trên thực tế, trường này có kích
thước thay đổi phụ thuộc vào tên miêu tả.
- 2 thành phần tiếp theo là TimeDateStamp và ForwarderChain không quan
trọng nên sẽ không đề cập ở đây.
- Name1: chứa một con trỏ (RVA) tới chuỗi tên ACSII của tệp tin Dll.
43
- FirstThunk: chứa RVA của một mảng cấu trúc có tên
IMAGE_THUNK_DATA. Mỗi cấu trúc này tương ứng với một hàm được
import từ Dll. Đây là cấu trúc của IMAGE_THUNK_DATA:
struct IMAGE_THUNK_DATA32 {
union u1
ForwarderString DWORD
Function DWORD
Ordinal DWORD
AddressOfData DWORD
ends
};
Dưới đây là hình ảnh minh họa về Import Sections
Hình 3.1.9: Hình ảnh minh họa việc Import Sections
Điểm đáng lưu ý ở đây là việc: 2 trường OriginalFirstThunk và FirstThunk trỏ
tương ứng đến 2 bảng là IMPORT NAME TABLE (INT) và IMPORT ADDRESS
TABLE (IAT), tiếp đó 2 bảng này cùng chỉ vào cấu trúc
IMAGE_IMPORT_BY_NAME.
Đây chính là cách thức mà trình Windows Loader sử dụng để đánh dấu một
cách tạm thời bảng IAT khi đọc-ghi trong lúc giải quyết import các section.
44
Export Sections:
Để nạp các module, trình Windows Loader sẽ tìm các địa chỉ các hàm thực thi
thông qua các tệp tin .Dll. Các hàm có thể được export bởi một Dll theo 2 cách: “By
name” hoặc “By ordinal only”.
Nếu như một hàm được export bằng tên, địa chỉ của hàm trong tệp tin Dll sẽ
được lấy từ giá trị trả về của hàm GetProAddress. Hàm GetProAddress có thể làm
được điều này bởi vì các tên và địa chỉ của những hàm được export được sắp xếp
trong Export Directory.
Export Directory:
Export Directory được thể hiện qua một mảng cấu trúc có tên
IMAGE_EXPORT_DIRECTORY. Cấu trúc này có 11 thành phần được mô tả:
struct IMAGE_EXPORT_DIRECTORY {
Characteristics DWORD
TimeDateStamp DWORD
MajorVersion WORD
MinorVersion WORD
nName DWORD
nBase DWORD
NumberOfFuntions DWORD
NumberOfNames DWORD
AddressOfFuntions DWORD
AddressOfNames DWORD
AddressOfNameOrdinals DWORD
};
Một số trường quan trọng mà chúng ta cần chú ý là:
- nName: tên nội hàm (internal name) của module. Tên này luôn được giữ
nguyên, không bị thay đổi. Khi tên bị thay đổi bởi người sử dụng, trình Loader sẽ sử
dụng tên này.
- nBase: bắt đầu của số thứ tự hay số chỉ số. Trường này sử dụng để lấy những
index của hàm.
- NumberOfFuntions: tổng số các hàm được export bởi module.
45
- NumberOfNames: số lượng các hàm được export bằng tên. Giá trị này không
phải là số lượng của tất cả các hàm trong module. Nếu trường này có giá trị là 0 thì
có thể module export bằng cách thứ 2 (By ordinal only)
- AddressOfNames: một RVA trỏ tới một mảng các RVA của tên các hàm được
lưu trong module có tên Export Name Table (ENT)
- AddressOfNameOrdinals: một RVA trỏ tới một mảng 16bit chứa các ordinals
của các hàm có tên, mảng này có tên Export Ordinal Table (EOT)
Dưới đây là hình ảnh minh họa Export Section được gọi bởi một thư viện liên
kết động có tên Spy.Dll
Hình 3.1.10: Hình ảnh minh họa việc Export Sections
Ở đây, tên nội hàm là Spy.dll bao gồm 2 hàm đều được export bằng tên là:
HookProc và InitFunc. Tương ứng với mỗi con trỏ trong bảng ENT sẽ có một tên
hàm tương ứng và một địa chỉ của hàm đó.
Trong trường hợp này module export theo 2 cách “By name” và “By ordinal
only”, sẽ có một hàm không có tên mà chỉ được trỏ bởi một con trỏ trong bảng EOT,
và sẽ có một địa chỉ hàm ứng với hàm đó.
46
Hình 3.1.11: Trường hợp module export theo cả 2 cách
3.2. Các kỹ thuật vượt qua các phần mềm phòng chống mã độc
3.2.1. Kỹ thuật mã hóa
Mã hóa là một cách thức phù hợp và hiệu quả, vừa làm thay đổi dấu hiệu đặc
trưng của mã độc, vừa gây khó trong việc phân tích hoạt động của mã độc.
Mã hóa cơ bản: Sử dụng các phép toán XOR, AND, SUB với một khóa ngẫu
nhiên được tạo ra cho mỗi lần lây nhiễm, được lưu trữ trong dữ liệu của virus hoặc
trực tiếp trong các phương thức giải mã.
mov esi, offset enc_code_start ;bắt đầu mã hóa
mov edi, esi ;bắt đầu giải mã
mov ecx, (offset enc_code_end -offset enc_code_start) / 4
; kích thước dword
mov ebx, 6B3C728Ah ; khóa mã hóa
start:
lodsd ; nạp một dword vào eax
xor eax, ebx ; giải mã
stosd ; lưu lại
loop start
end:
jmp enc_code_start
47
Mã hóa dòng: Phương pháp tạo ra một khóa dòng (keystream) có cùng kích
thước với dữ liệu mã hóa. Có nghĩa là tạo ra một chuỗi giả ngẫu nhiên sử dụng một
hoặc một đảo ngược các thanh ghi. Cách thực hiện đơn giản là sao chép nhiều khóa
đầu vào. Đoạn mã có thể dễ dàng áp vào kỹ thuật này trong trường hợp sử dụng
một thanh ghi. Lfsr_init khởi tạo thanh ghi, lfsr_next thay đổi thanh ghi 32bits
thông qua đó tạo ra một khóa mới.
...
mov ebx, 6B3C728Ah
call lfsr_init ; khởi tạo thanh ghi từ khóa
start:
lodsd
call lfsr_next ; (ebx := 4) byte mới từ keystream
xor eax, ebx
...
Mã hóa với khóa ngẫu nhiên: Dữ liệu được mã hóa với một khóa ngẫu nhiên
nhưng khóa giải mã không được lưu trữ. Trên thực tế, khóa giải mã chỉ có thể phục
hồi khi thực hiện vét cạn hoặc sử dụng phương pháp phân tích mật mã. Kỹ thuật này
vô hiệu hóa phương pháp phân tích mã thông thường. Kích thước không gian khóa
cho phép điều khiển qua thời gian giải mã. Kỹ thuật này đã được giởi thiệu bởi
DarkMan vào năm 1999
Mã hóa dựa trên phép hoán vị: Các dữ liệu đầu vào được hoán vị. Phép hoán
vị có thể áp dụng trên quy mô toàn bộ dữ liệu hoặc từng khối dữ liệu, thậm chí là
từng byte dữ liệu.
Mã hóa phụ thuộc vào mã lệnh: Mã nhị phân được sử dụng làm khóa mã hóa,
hoặc kết hợp của đoạn mã và khóa ngẫu nhiên. Kỹ thuật này đảm bảo mã lệnh không
bị chỉnh sửa và chống lại việc phân tích virus. Trước khi giải mã, virus phải có được
khóa giải mã. Khóa thường được lưu trữ trong chương trình: trong hàm giải mã, trong
dữ liệu của virus hoặc đơn giản là liên quan đến chơng trình (ví như tên tập tin, kích
thước …). Khác với trường hợp của mã hóa khóa ngẫu nhiên là khóa tìm thấy bởi
phương pháp vét cạn. Kịch bản ở đây khóa không được lưu trữ trong mã lệnh nhưng
có thể suy ra từ môi trường. Kỹ thuật này gọi là sinh khóa môi trường. Sau đâu là
một số ví dụ:
48
- Khóa được lấy thông qua môi trường cục bộ. Ví dụ, khóa là mã số của ổ cứng,
sự kết hợp các giá trị ngẫu nhiên được lưu trữ trong đoạn code…
- Khóa phụ thuộc vào các yếu tố kích hoạt. Ví dụ, khóa phụ thuộc vào thời gian
hiện tại và giá trị là khoảng thời gian được định trước. Kết quả, virus bị vô hiệu hóa
chính nó trong thời gian nằm ngoài khoảng định trước.
- Khóa được lưu trữ trên một máy chủ web, một máy chủ mới …
Sử dụng hiệu quả nhất của kỹ thuật này trên virus Bradley. Nó sử dụng kỹ
thuật mã hóa, với khóa lấy từ môi trường. Với loại virus này thì những người viết có
thể hạn chế hoạt động của virus của họ về mặt địa lý và thời gian
3.2.2. Kỹ thuật chèn mã rác
Trong kỹ thuật này, những mã lệnh rác được thêm vào chương trình nhưng
không ảnh hưởng đến tính logic của chương trình. Những mã lệnh rác này không ảnh
hưởng đến kết quả của chương trình. Một số lệnh như: XCHG, NOP, “MOV ax, ax”,
“SUB ax 0” …, Những mã lệnh này tạo cho những biến thể khác nhau. Đôi khi những
khối mã lệnh này không bao giờ được gọi, thực thi. Kỹ thuật này tạo ra sự khó hiểu
những hoạt động logic của virus.
Mã lệnh gốc Khối mã lệnh sau khi chèn mã rác
Hex Opcodes Assembly
51 push ecx
50 push eax
5B pop ebx
8D 4B 38 lea ecx,[ebx + 38h]
50 push eax
E8 00000000 call 0h
5B pop ebx
Hex Opcodes Assembly
51 push ecx
90 nop
50 push eax
5B pop ebx
8D 4B 38 lea ecx,[ebx + 38h]
50 push eax
90 nop
49
83 C3 1C add ebx, 1Ch
FA cli
8B 2B mov ebp, [ebx]
5B pop ebx
E8 00000000 call 0h
5B pop ebx
83 C3 1C add ebx, 1Ch
FA cli
90 nop
8B 2B mov ebp, [ebx]
5B pop ebx
3.2.3. Kỹ thuật rẽ nhánh
Với kỹ thuật rẽ nhánh, chương trình được tạo ra với nhiều điểm kiểm tra ngẫu
nhiên bằng các lệnh nhảy có điều kiện (JNE, JNZ…). Thực chất các đoạn mã rẽ
nhánh này không ảnh hướng đến hoạt động chính của chương trình.
Hình 3.2.1: Trình tự hoạt động chương trình giữa có và không rẽ nhánh
Nhưng với số lượng điểm kiểm tra lớn hoặc lặp lại nhiều lần, kỹ thuật này rất
hữu ích trong việc phân tích hoạt động chương trình.
#include “stdafx.h”
int main(int argc, char* argv[])
{
__asm {
50
jne condition1
je condition2
condition1:
je Junk1
jne Real_code
Junk1:
_emit 0x0f
condition2:
jne Junk2
jne Real_code
Junk2:
_emit 0x0f
Real_code:
}
Getchar();
Return 0;
}
3.2.4. Sử dụng Stub để giải mã và thực thi trực tiếp trên bộ nhớ
Tệp tin nhị phân mới được tạo ra có hai phần, phần thứ nhất gọi là Stub, phần
này sẽ chịu trách nhiệm cho việc giải mã và thực thi mã độc trên bộ nhớ. Phần thứ
hai là phần Payload, phần này chính là mã độc đã được mã hóa, có rất nhiều giải
thuật có thể lựa chọn.
Hình 3.2.2: Thành phần của mã độc mới được tạo ra.
Sau khi Stub được thực thi, nó sẽ giải mã payload. Nó sẽ lấy dữ liệu trong
payload như là một mảng byte và thực thi trong một tiến trình mới được tạo ra. Bằng
cách này, mã độc xuất hiện trên bộ nhớ của máy tính. Nó có thể thực hiện trong điều
kiện không tồn tại trên ổ cứng, do đó việc phát hiện càng khó khăn hơn.
51
Kỹ thuật này thực hiện khó khăn nhất là quá trình xây dựng thuật toán mã hóa
để tạo ra Payload cho mã độc. Hơn nữa cũng cần phải chỉnh sửa để tạo ra các dấu
hiệu khác so với nguyên gốc.
- Thêm Junk code để chỉnh sửa luồng chạy.
- Thay đổi hoặc mã hóa chuỗi.
- Thay đổi tên biến.
- Thay đổi thứ tự vẻ bề ngoài của mã.
- Thêm hoặc đổi icon.
Và các phương pháp nâng cao hơn:
- Mã hóa toàn bộ chuỗi biến và kể cả payload cũng với thuật toán mã hóa dữ
liệu theo tiêu chuẩn.
- Làm rối toàn bộ hàm gọi API khả nghi.
- Khiến cho độ dài của tất cả các phần tử ở phía đuôi thay đổi, không thể dự
đoán được.
- Xóa toàn bộ những chuỗi không cần thiết và ẩn các nguồn có thể là dấu hiệu
nhận diện bởi Antivirus.
Cấu trúc của tệp tin mới giờ xuất hiện như sau:
Hình 3.2.3: Cấu trúc tệp tin mới được tạo ra.
52
Hiện tại, cấu trúc của tệp tin đã phức tạp hơn. Chúng ta sẽ sử dụng thuật toán
mã hóa khối đối xứng Serpent. Các phân cách sẽ được ngẫu nhiên và có độ dài khác
nhau.
Tên hàm API được sử dụng làm dấu hiệu nhận biết virus (khi có sự kết hợp
nhất định), bởi vì chúng ở dạng bản rõ. Vậy nên ta chắc chắn phải ẩn chúng để làm
rối tên hàm API hoặc sử dụng các API un-document.
3.2.5. Kỹ thuật PRIDE (Pseudo-Random Index Decryption)
Mục đích của kỹ thuật này bảo vệ virus trước phương pháp heuristic. Ngay cả
với việc thay đổi hướng thực hiện của thủ tục giải mã, nó theo các cơ chế phổ biến
sau đây:
- Data: là địa chỉ bộ đệm bên trong chứa dữ liệu của virus.
- Tuần tự đọc dữ liệu và tạo ra một bộ đệm mới chứa các dữ liệu được giải mã.
- Kiểm soát mã lệnh mới được giải mã.
Giai đoạn thứ 2 của kỹ thuật này trong quá trình đọc tuần tự hàng 1000byte
hoặc nhiều hơn trong bộ nhớ, nó sẽ đưa ra các cảnh báo nguy hiểm. Do đó kỹ thuật
PRIDE bao gồm việc giải mã một cách giả ngẫu nhiên và không theo thứ tự, byte 10
được giải mã, byte 25 được giải mã, byte 7 được giải mã cứ như vậy. Kiểu truy cập
vào bộ nhớ như thế sẽ giống với với truy cập bộ nhớ của một ứng dụng bình thường.
Đồng thời kỹ thuật này sẽ củng cố hơn tính đa hình của mã lệnh giải mã.
Sau đây là thuật toán sử dụng trong kỹ thuật PRIDE, size_of_data là kích thước
của dữ liệu được mã hóa. Đầu tiên thuật toán khởi tạo biến số:
pride_start = (size_of_data - 4) & random ();
pride_step = (size_of_data - 8) & random ();
pride_key = get_random_key ();
Sau đó nó sẽ khởi tạo thanh ghi sử dụng trong quá trình giải mã: CR, IR và
BR. CR là thanh ghi đếm và chứa chỉ mục tuần tự giải mã, IR là thanh ghi chỉ số và
chứa chỉ mục giả ngẫu nhiên giải mã, BR là thanh ghi đệm sử dụng lưu trữ tạm thời
dữ liệu mã hóa. Đoạn mã lệnh sau đây được viết vào đầu của đoạn giải mã.
53
MOV CR, pride_start
MOV IR, val ; val = (size_of_data - 4) & random()
MOV BR, val’ ; val’ = random()
Cuối cùng, khi phần thân của đoạn mã lệnh giải mã phải được tạo ra, thì áp
dụng thuật toán:
PUSH IR
XOR IR, CR
MOV BR, [IR + source]
XOR BR, key ; or ADD BR, +/- key
; or nothing (no decryption)
ADD IR, dest
MOV [IR], BR ; write the decrypted dword
POP IR
ADD CR, val ; CR += [4;7]
AND CR, val’ ; val’ = ((random() &
; ˜size_of_data) | (size_of_data-4)) & -4
; (-> CR := (CR % size_of_code) & FFFFFFFCh)
ADD IR, pride_step
AND IR, val’’ ; val’’ = ((random() &
; ˜size_of_data) | (size_of_data-1)) & -1
; (-> IR := IR % size_of_code)
CMP CR, pride_start
JNZ <?> ; jump at a random branch
Những con trỏ lệnh trước đó được cập nhập các thanh ghi CR và IR (ADD CR
VAL và ADD CR VAL’ cho thanh ghi CR) kết hợp với nhau. Với sự rõ ràng về yêu
cầu của con trỏ lệnh AND thực hiện trước những lệnh AND trước. Cũng như vậy
pride_start sẽ miêu tả thứ tự giải mã: khi bằng 0 thì sẽ thực hiện giải mã liên tục.
54
3.2.6. Các kỹ thuật chống phân tích mã độc
a. Anti-Debuger
Anti-Debuger là một kỹ thuật chống phân tích được sử dụng phổ biến trong
các phần mềm mã độc. Khi bị phân tích bởi một trình Debuger nào đó, chương trình
có sử dụng kỹ thuật này có thể phát hiện ra sự có mặt của trình Debuger, sau đó làm
thay đổi hướng thực thi của chương trình (rẽ sang hướng khác hoặc dừng hoạt
động…) gây cản trở quá trình phân tích.
Hiện nay, với sự phát triển của các chương trình Antivirus, các hacker luôn
luôn thay đổi và xây dựng các kỹ thuật mới để chiến thắng được các chương trình
Antivirus. Dưới đây là một số kỹ thuật Anti-Debuger đơn giản và phổ biến:
- Sử dụng các hàm API
- Kiểm tra cấu trúc
- Timing Check
- Ngắt
Sử dụng các hàm API
Hệ điều hành Windows cung cấp một số hàm API có chức năng xác định trình
Debuger. Các hàm API sẽ dò quét các dấu hiệu của trình Debuger khi hoạt động.
- Hàm IsDebuggerPresent
Đây là hàm API đơn giản nhất để phát hiện sự có mặt của một trình Debuger.
Hàm này tìm kiếm cấu trúc Process Environment Block (PEB). Kết quả trả về sẽ là
giá trị 0 nếu như chương trình chạy trong ngữ cảnh của một trình Debuger. Ngược
lại, kết quả trả về sẽ là một giá trị khác 0.
Cấu trúc hàm:
BOOL WINAPI IsDebuggerPresent(void);
- Hàm CheckRemoteDebuggerPresent
Hàm API này gần như giống với hàm IsDebuggerPresent. Hàm
IsDebuggerPresent và hàm CheckRemoteDebuggerPresent đều nhằm phát hiện sự
55
có mặt của một trình Debuger. Nhưng, hàm CheckRemoteDebuggerPresent có khả
năng thực hiện quá trình kiểm tra thông qua một tiến trình xử lý khác.
Cấu trúc hàm:
BOOL WINAPI CheckRemoteDebuggerPresent(
_In_ HANDLE hProcess,
_Inout_ PBOOL pbDebuggerPresent
);
- Hàm NtQueryInformationProcess
Đây là một hàm Native API trong NTdll.dll có chắc năng lấy thông tin về một
quá trình nhất định.
Cấu trúc hàm:
NTSTATUS WINAPI NtQueryInformationProcess(
_In_ HANDLE ProcessHandle,
_In_ PROCESSINFOCLASS ProcessInformationClass,
_Out_ PVOID ProcessInformation,
_In_ ULONG ProcessInformationLenghth,
_Out_opt_ PULONG ReturnLength
);
Kiểm tra cấu trúc
Khi một trình Debuger chạy sẽ tạo ra các vùng nhớ heap khác nhau. Những
thông tin mà hệ thống sử dụng để xác định một vị trí “không xác định” trong PEB
tại offset 0x68. Nếu giá trị ở vị trí này là 0x70 thì có nghĩa là một trình Debuger đang
hoạt động. Giá trị 0x70 là sự tổ hợp của các bit cờ.
Trong đó:
FLG_HEAP_ENABLE_TAIL_CHECK (0x10),
FLG_HEAP_ENABLE_FREE_CHECK (0x20)
FLG_HEAP_VALIDATE_PARAMETERS (0x40)
56
Timing Check
Timing Check là một trong những kỹ thuật phổ biến để phát hiện sự có mặt
của trình Debuger. Nguyên lý của kỹ thuật này là so sánh sự sai khác về độ trễ khi
có mặt và không có mặt của trình Debuger. Các ngoại lệ sẽ được xử lý rất nhanh nếu
như không có mặt của trình Debuger. Ngược lại, ngoại lệ sẽ xử lý chậm hơn khi có
mặt của trình Debuger do đòi hỏi sự can thiệp của con người.
Các thức kiểm tra phổ biến là sử dụng chỉ thị rdtsc (mã opcode: 0x0F31).
RDTSC
MOV time1, EAX
RDTSC
MOV time2, EAX
Ngắt
Bằng việc chèn các mã lệnh ngắt trong chương trình, trình Debuger sẽ gặp
phiền phức và có thể bị chuyển hướng nếu như xử dụng ngắt và xử lý ngoại lệ đồng
thời. Đây là một kỹ thuật cổ điển nhưng vẫn hiệu quả trong việc gây phiên toái và
khó khăn trong quá trình phân tích chương trình.
Int3
Ngắt Int3 có mã opcode là 0xCC. Trình Debuger sẽ hiểu mã lệnh 0xCC là một
điểm ngắt hoặc một bẫy ngắt. Vì vậy, trình Debuger sẽ dừng thực thi để tránh rơi vào
bẫy này. Thực chất, lúc này, trình Debuger đã thực sự rơi vào một cái bẫy, với ngắt
Int3, người lập trình mã độc có thể điều hướng chương trình thực thi hoặc làm nhiễu
quá trình phân tích của người phân tích hoặc chương trình Antivirus.
int CheckForCCBreakpoint()
{
int checkB = 1;
__asm{
call $+5
pop eax
mov ecx, 0x00000000
mov ebx, 0xDD
sub ebx, 0x11
57
loop1:
cmp byte ptr [eax + ecx], bl
jz nhan1
inc ecx
cmp ecx, 0x10
ja nhan2
jmp loop1
nhan1:
mov checkB, 0x0000
nhan2:
}
return checkB;
}
Int2D
Ngắt Int2D cũng là một loại ngắt tương tự Int3. Ngắt Int2D được sử dụng để
truy cập kernel debugger, và cũng có thể được sử dụng ở mức User mode.
Khi ngắt Int2D được gọi, hệ thống sẽ giữ lại 1 byte sau lệnh ngắt. Các chương
trình thực thi sẽ sử dụng chính điều này để chỉnh sửa nội dung bản thân
xor eax, eax
push offset l1
push d fs:[eax]
mov fs:[eax], esp
int 2dh
inc ecx
je being_debugged
…
l1: xor al, al
ret
58
b. Anti-Virtual Machine
Hiện nay, các phần mềm ảo hóa đã được áp dụng rất phổ biến trong việc phân
tích và phát hiện mã độc. Song song với đó, các kỹ thuật sử dụng trong các chương
trình mã độc cũng phát triển với xu hướng vượt qua (bypass) hay chống lại sự can
thiệp của các phần mềm ảo hóa.
Để thực hiện các công việc trên, mã độc luôn được các “hacker” gắn thêm các
môđun nhằm phát hiện (detect) sự có mặt của các phần mềm ảo hóa. Sau khi đã phát
hiện thành công, mã độc có thể sử dụng những thông tin đó vào việc điều hướng
chương trình, làm bẫy để đánh lạc hướng phân tích… hoặc chỉ đơn giản là dừng việc
thực thi chương trình.
Một số các phần mềm ảo hóa phổ biến hiện nay:
- Virtual Machine (VMware Workstation, Oracle VirtualBox, Microsoft
Virtual PC (trước đây là Connectix Virtual PC)
- Sandboxie
- Parallels Desktop
Các kỹ thuật phát hiện cơ bản:
- Timing Based
- Artifacts Based
Timing Based
Kỹ thuật này chủ yếu dựa vào sự sai khác về thời gian xử lý công việc giữa
máy ảo và thực tế.
Hình 3.2.4: Mô hình xử lý công việc đối với máy ảo
59
Kỹ thuật này tương đối khó khăn trong việc áp dụng bởi sự khác nhau về kiến
trúc máy tính, hệ điều hành, tốc độ xử lý… đối với từng loại hệ điều hành, từng dòng
chip xử lý… là khác nhau. Và cũng mất nhiều thời gian để có được con số căn cứ
phù hợp.
Artifaces Based
Kỹ thuật này dựa vào các đặc trưng về tiến trình, cổng kết nối… hay bất cứ
dấu hiệu vào về sự mô phỏng các thiết bị trong máy ảo.
Dù vậy, dựa các kỹ thuật hoặc phần mềm ảo hóa khác nhau cũng có những
đặc điểm khác biệt. Dưới đây là một số phương thức phát hiện Virtual Machine và
Sanboxie:
Phương pháp Virtual Machine Sanboxie
Các chỉ thị CPU (sidt, sgdt, sldt, str,
rdtsc, in…)
+ -
Tên người dùng/Máy tính - +
Các tiến trình đang chạy + +
Các dịch vụ đang chạy + +
Scan bộ nhớ và các module được nạp + +
Các driver thiết bị được nạp + +
Các giá trị thanh ghi + +
Tên đối tượng hệ thống (Thiết bị,
Driver, Sự kiện, Section, Cổng kết
nối…)
+ +
Các yêu cầu IOCTL + -
Thông tin phần cứng (Số serial ổ đĩa,
kích thước HDD, địa chỉ MAC cổng
Ethernet…)
+ -
Phát hiện việc Hook vào các hàm API - +
Ghi chú: “+”: Có ; “-”: Không
60
3.2.7. Kỹ thuật che giấu API
API cung cấp hầu hết các tính năng thông dụng cho tất cả các chương trình
chạy trên nền Window. Hầu hết các hàm API thường được chứa trong file DLL trong
thư mục hệ thống Window (thường là C:\\Windows\\System32\\)
Có 4 thành phần tạo nên Windows API:
- Các hàm (function): là thành phần chính của Windows API, chúng được chứa
trong các file DLL và có thể được truy xuất một các dễ dàng bởi các chương
trình trên nền Window.
- Các cấu trúc (structure): nhiều hàm API đòi hỏi một cấu trúc phải được truyền
cho chúng để có thể vận chuyển một lượng lớn thông tin mà không cần phải
dùng quá nhiều đối số. Các cấu trúc này được dùng trong các hàm API nhưng
phải tự định nghĩa.
- Các hằng được đặt tên (named constant): cũng như cấu trúc, các hằng phải
được định nghĩa rõ ràng trong chương trình.
- Các hàm callback (callback function): về mặt khái niệm, các hàm callback
ngược với các hàm API. Một hàm callback được định nghĩa hoàn toàn trong
chương trình. Sau đó hàm này sẽ được một hàm API khác gọi khi nó thực thi
một tác vụ nào đó. Các hàm callback cung cấp một cách thức để chương trình
có thể can thiệp trực tiếp vào một tác vụ nào đó.
Các mã độc hều hết sử dụng các API trong Windows để thao tác với hệ thống
và thực thi theo các chức năng được thiết kế. Chính vì vậy, các hàm API nguy hiểm
sẽ luôn được các AV chú ý. Hơn thế nữa, việc biến đổi hay làm rối mã của một mã
độc nhằm trốn tránh các AV không chỉ phụ thuộc vào kỹ thuật che giấu, mà hầu hết
phụ thuộc vào chính bản thân mã độc được thiết kế. Một mã độc có thời gian “sống”
lâu dài mà không bị phát hiện phải tránh được sự nghi ngờ của người dùng và các
AV trên hệ thống.
Kỹ thuật này nhằm che giấu các API được sử dụng trong quá trình lập trình.
Ví dụ dưới đây sử dụng hàm LoadLibraryA và GetProcAddress để thực thi hàm
“MessageBoxA” từ “user32.dll”.
#include <windows.h>
#include <iostream>
using namespace std;
void HidenAPI()
{
char* szMessage = "Hiden API";
char* szCaption = "Hello!";
HMODULE hModule = LoadLibraryA("user32.dll");
61
FARPROCfFuncProc = GetProcAddress(hModule, “MessageBoxA");
((int(WINAPI*)(HWND, LPCSTR, LPCSTR, UINT))fFuncProc)(0,
szMessage, szCaption, 0 );
}
int main()
{
HidenAPI();
}
Hàm MessageBoxA sẽ được thực thi mà không cần phải gọi tới API
MessageBoxA().
Hình 3.2.5: Thực thi hàm MessageBoxA mà không cần gọi API.
Trong bảng Import Directory không tìm thấy “MessageBoxA” trong thư viện
“user32.dll”.
Hình 3.2.6:Bảng Import Directory không có thư viện user32.dll.
62
Trong ví dụ trên, có thể tối ưu hóa hơn bằng cách sử dụng một hàm mã hóa
chuỗi MessageBoxA và giải mã khi sử dụng chuỗi này trong khi thực thi, để làm rối
mã trong quá trình phân tích.
3.2.8. Kỹ thuât sử dụng chữ ký số
a. Khái niệm và vai trò và ứng dụng của chữ ký số
Chữ ký điện tử (tiếng anh: electronic signature) là thông tin đi kèm theo dữ
liệu (văn bản, hình ảnh, video...) nhằm mục đích xác định người chủ của dữ liệu đó.
Chữ ký Số được sử dụng trong các giao dịch Số. Xuất phát từ thực tế, chữ ký Số
cũng cần đảm bảo các chức năng: xác định được người chủ của một dữ liệu nào đó,
văn bản, ảnh, video... dữ liệu đó có bị thay đổi hay không.
Chữ ký số (Digital signature) là một dạng chữ ký điện tử (là tập con của chữ
ký điện tử) được tạo ra bằng sự biến đổi một thông điệp dữ liệu sử dụng hệ thống
mật mã hoá khoá công khai, theo đó người có thông điệp dữ liệu ban đầu và khoá
công khai của người ký có thể xác định được một cách chính xác.
Chữ ký số dùng kỹ thuật mã hóa khóa công khai và khóa riêng (public key/
private keycryptography). Khóa công khai (public key) được gửi đến bất cứ người
nào cần nó. Nhưng khóa riêng (private key) thì chỉ có người mã hóa nắm giữ.
Hình 3.2.7: Sơ đồ xác thực sử dụng Chữ ký số.
63
Chữ ký số dùng cho các văn bản số, cho biết toàn bộ văn bản đã được ký bởi
người ký. Và người khác có thể xác minh điều này. Chữ ký số tương tự như chữ ký
thông thường, đảm bảo nội dung tài liệu là đáng tin cậy, chính xác, không hề thay
đổi trên đường truyền và cho biết người tạo ra tài liệu là ai. Tuy nhiên, chữ ký số
khác chữ ký thường, vì nó tuỳ thuộc vào văn bản. Chữ ký số sẽ thay đổi theo văn bản
còn chữ ký thường thì không hề thay đổi. Chữ ký số được sử dụng để cung cấp chứng
thực chủ sở hữu, tính toàn vẹn dữ liệu và chống chối bỏ nguồn gốc trong rất nhiều
các lĩnh vực.
Giải pháp dùng chữ ký số là tối ưu vì nó có hiệu lực pháp luật, do đó không
cần in ấn tài liệu mà vẫn có thể xác nhận được tài liệu, đảm bảo tính toàn vẹn và
không chối bỏ. Chữ ký số được phát hành bởi bên thứ ba là cơ quan chứng thực có
thẩm quyền cấp phát, thu hồi, quản lý chứng chỉ số cho các thực thể thực hiện các
giao dịch an toàn (Certificate Authority hoặc CA) nên đảm bảo tính khách quan. Như
vậy, quá trình tạo chữ ký số, xác nhận các yêu cầu pháp lý, bao gồm xác thực người
ký, xác thực tin nhắn, là thành công và hiệu quả. Chính vì những ưu điểm trên, chữ
ký số được dùng trong nhiều ứng dụng: đảm ảo an ninh truyền thông, ngân hàng trực
tuyến, thương mại điện tử, đảm bảo an ninh cho thư điện tử…
b. Định dạng của tệp tin thực thi được ký
Một tệp tin thực thi đã được ký là một định dạng tiêu chuẩn của tệp tin PE trên
Windows. Sở dĩ, các tệp tin thực thi được các nhà phát hành ký chữ ký điện tử của
họ lên trên sản phầm phần mềm nhằm xác thực tệp tin không bị sửa đổi hoặc giả mạo
khi được sử dụng bởi người dùng. Hơn nữa, để tránh các trường hợp dương tính giả,
thì các phần mềm sẽ được ký chữ ký số của họ. Do các Antivirus khi gặp những tệp
tin được ký chữ ký số sẽ bỏ qua, không quét cũng như không đưa vào các môi trường
sandbox để kiểm tra hành vi. Hơn nữa, những phần mềm nhiều khi cũng có các hành
vi tương tự như mã độc, các phần mềm này phải được ký bởi nhà phát hành để tránh
các AV nhận dạng là mã độc.
Dữ liệu được tổ chức như trong định dạng tệp tin thực thi. Các phần đầu của
tệp tin thực thi sẽ luôn chứa những thông tin quan trọng về tệp tin thực thi (được gọi
tắt là header, luôn có trong tệp tin). Phần đầu tệp tin này sẽ định nghĩa một số trường
dữ liệu mà chứa các mã thực thi. Một trong số đó là
IMAGE_DIRECTORY_ENTRY_SECURITY được sử dụng để lưu trữ các mã băm
của tệp tin, một mục đủ lớn để chứa chữ ký điện tử, ghi chữ ký tại vị trí đó trên tệp
tin.
64
Quá trình ký như sau:
- Tính mã băm của tệp tin, bỏ qua checksum và mục
IMAGE_DIRECTORY_ENTRY_SECURITY.
- Tạo chữ ký và thêm nó vào tệp tin.
- Ghi vào vị trí chữ ký vào kích thước (Thêm vào bội số của 16 bytes), vào
mục IMAGE_DIRECTORY_ENTRY_SECURITY. Vị trí chữ ký là phần
cuối cùng của tệp tin, vì nó đơn giản là chứa dữ liệu trên đó.
- Cập nhật các tệp tin checksum.
- Ghi tệp dữ liệu và đóng tệp tin
Hình 3.2.8: Chữ ký số trên tệp tin cài đặt phần mềm BKAV.
Mã độc cũng có thể sử dụng kỹ thuật này để vượt qua các phần mềm phòng
chống mã độc và lợi dụng sự tin tưởng của người dùng để tấn công lừa đảo, làm cho
phần mềm độc hại trông đáng tin hơn. Ngoại trừ việc các mã độc được ký bởi các
65
chữ ký hợp lệ do chính người thiết kế mã độc mua từ các nhà cung cấp chữ ký số
hoặn ăn cắp thì việc tạo chữ ký và ký lên mã độc khá dễ dàng nên ngày càng nhiều
mã độc sử dụng kỹ thuật này.
Hình 3.2.9: Mã độc giả mạo chữ ký số giả.
3.2.9. Khai thác lỗ hổng trên Hệ điều hành
Những mã độc sử dụng lỗ hổng trên hệ điều hành thường khó phát hiện hơn
so với những mã độc thông thường, những loại mã độc này có thời gian hoạt động
ngầm rất lâu trước khi chúng bị phát hiện bởi những chuyên gia phân tích mã độc.
Ví dụ như Stuxnet một loại mã độc có thể được phát triển bởi chỉnh phủ Mỹ
sử dụng để tấn công vào hệ thống máy làm giàu Uranium của Iran. Được phát hiện
bởi các chuyên gia. Với những phiên bản đầu tiên, có thể hoạt động từ năm 2005.
66
Làm rối loạn vòng quay của các máy ly tâm, gây ảnh hướng tới hệ thống. Quá trình
lây nhiễm và phá huỷ của Stuxnet được miêu tả trong hình dưới đây:
Hình 3.2.10: Sự lây lan của Stuxnet.
Stuxnet lợi dụng lỗ hổng trên hệ điều hành Windows để tiến hành lây nhiễm
từ máy tính này sang máy tính khác. Stuxnet được lập trình để có thể bí mật lây từ
máy Windows này sang máy Windows khác. Ngay cả khi máy không được kết nối
Internet thì Stuxnet vẫn có thể tự sao chép mình thông qua các ổ đĩa USB. Chính vì
đặc biệt tính này mà các chuyên gia bảo mật khi đó đã lo lắng rằng Stuxnet sẽ nhanh
chóng lây lan ra thế giới bên ngoài.
Khi các file LNK này được chép vào ổ USB, lúc cắm sang máy khác, Windows
Explorer sẽ tự quét nội dung chứa trên ổ nhờ tập tin autorun.inf và điều này đã tạo
điều kiện cho mã độc được kích hoạt. Khi chạy lên, nó sẽ lặng lẽ cài vào máy tính
một file lớn hơn, sau đó tự chia nhỏ rồi ẩn vào nhiều nơi khác nhau. Mã độc này đã
dùng chứng thực số (digital certificate) lấy từ hai hãng sản xuất Đài Loan nổi tiếng
là Realtek và JMicro để làm cho hệ thống bảo mật tin rằng Stuxnet chỉ là một phần
vô hại. Nguy hiểm hơn, cách thức giả mạo này cực kì nguy hiểm và đây là lần đầu
tiên người ta thấy nó.
67
Stuxnet không chỉ khai thác 1 mà đến 4 lỗ hổng zero day trong Windows. “Nó
không chỉ là con số gây chấn động mà mỗi một lỗ hỗng đều bổ sung một cách hoàn
hảo và đẹp mắt cho các lỗ hổng còn lại”. Ngoài lỗ hổng nằm trong tập tin LNK và
Windows Explorer đã nói đến ở trên, Stuxnet còn tận dụng thêm lỗ hổng khi các máy
tính chia sẻ máy in trong cùng một mạng. Hai lỗi còn lại liên quan đến quyền thực
thi trong hệ thống. Stuxnet được thiết kế để có được quyền ở cấp hệ thống, tức là một
trong những quyền cao nhất, ngay cả khi máy tính đã được thiết lập một cách kĩ càng.
3.3. Chương trình và thử nghiệm
Từ những nội dung đã trình bày ở trên. Nhóm nghiên cứu đã xây dựng và thử
nghiệm những chương trình sau:
- Chương trình demo kỹ thuật Anti-Debug và Anti-Virtual Machine (cụ thể là
Máy ảo VMware Workstation)
Kỹ thuật Anti-Debug
Hình 3.3.1: Khi chạy trực tiếp chương trình
Hình 3.3.2: Khi chạy chương trình thông qua Visual Studio 2012
68
Kỹ thuật Anti-Virtual Machine (cụ thể là Máy ảo VMware Workstation)
Hình 3.3.3: Khi chạy chương trình ở máy thật
Hình 3.3.4: Khi chạy chương trình trong máy ảo VMware Workstation 11
- Mã độc siêu đa hình sử dụng các kỹ thuật được trình bày ở trên với Payload là
một chương trình khai thác lỗ hổng trên Hệ điều hành Windows (CVE-2014-
4113)
- Các chương trình trên có sử dụng một chữ ký số giả để ký vào trong chương
trình bị nhiễm.
Quá trình lây nhiễm vào các tệp tin
Hình 3.3.5: Lây nhiễm vào các tệp tin trong ổ đĩa E.
69
Khi chạy một tệp tin bị lây nhiễm, sẽ hiện lên một MessegaBox cảnh báo.
Sau đó, một tiến trình con sẽ được gọi để thực thi payload chính, payload này là
một mã độc khai thác lỗ hổng leo thang đặc quyền trên Windows, nếu thực hiện
thành công, tiến trình mới sẽ được thực thi dưới quyền SYSTEM, trong khi tệp tin
bị nhiễm vẫn thực thi bình thường.
Hình 3.3.6: Thực thi chương trình bị nhiễm.
Hình 3.3.7: Tiến trình con được thực thi với quyền SYSTEM
70
Hình 3.3.8: Kích thước tệp tin thay đổi sau khi bị nhiễm
Kết quả Scan trên được thực hiện tại địa chỉ https://www.virustotal.com/
Hình 3.3.9: Kết quả Scan Online.
71
Hash (sha256):
f36df13fe486d7a6ad60eaf1680d5accc984f355504730077d14b72c595fd009
Mã độc sau khi được ký với chữ ký số giả mạo và kiểm tra lại có kết quả sau:
Hình 3.3.10: Kết quả Scan sau khi ký chữ ký số.
72
KẾT LUẬN
Sau một thời gian nghiên cứu, tìm hiểu và thực hiện đề tài, nhóm nghiên cứu
đã hoàn thành đúng tiến độ và đã đạt được một số kết quả nhất định.
Đề tài đã nghiên cứu được các kiến thức về mã độc, phân loại và các cách thức
lây lan của mã độc; kiến thức về các công cụ sinh mã độc tự động. Trong quá trình
nghiên cứu, nhóm cũng đã tìm hiểu được một số kỹ thuật phát hiện mã độc của các
phần mềm phòng chống mã độc nhằm lựa chọn và xây dựng những kỹ thuật vượt
qua các phần mềm phòng chống mã độc một cách phù hợp và đạt hiệu quả cao.
Tuy nhiên, trong quá trình thực hiện đề tài cũng gặp nhiều khó khăn. Đó là
việc tìm hiểu các kỹ thuật phát hiện mã độc của các phần mềm phòng chống mã độc
không được công bố rộng rãi, các kỹ thuật vượt qua các phần mềm phòng chống mã
độc được công bố công khai thì thường đã cũ và dễ bị phát hiện. Chính vì vậy, nội
dung của nhóm đề tài tập trung vào vận dụng có sửa đổi các kỹ thuật vượt qua các
phần mềm độc hại đã biết và sử dụng thêm các kỹ thuật mới được công bố trên thế
giới để nâng cao hiệu quả chương trình. Trong thời gian tới, nhóm nghiên cứu sẽ thu
thập, tìm hiểu thêm các kỹ thuật mới để nâng cao hiệu quả chương trình cũng như
mở rộng khả năng ứng dụng của đề tài trên các hệ điều hành mới hiện nay.
Để hoàn thành đề tài, ngoài sự cố gắng và nỗ lực của các thành viên trong
nhóm là sự giúp đỡ, tận tình chỉ bảo của thầy giáo 3// PGS.TS. Nguyễn Hiếu
Minh, thầy giáo 3/ KS. Nguyễn Văn Cường và các thầy giáo, cô giáo trong Bộ
môn An ninh Mạng. Chúng em xin chân thành cảm ơn các thầy, các cô đã giúp
đỡ chúng em trong quá trình thực hiện đề tài.
73
TÀI LIỆU THAM KHẢO
[1] Aditya P. Mathur and Nwokedi Idika, "A Survey of Malware Detection
Techniques"
[2] Joshua Tully, "Introduction into Windows Anti-Debugging", 9/2008
[3] Joshua Tully, "An Anti-Reverse Engineering Guide", 11/2008
[4] Mark Vincent Yason, "The Art of Unpacking"
[5] Michael Sikorski and Andrew Honig, "Praise for Practical Malware Analysis"
[6] Moritz Jodeit, "Exploiting CVE-2014-4113 on Windows 8.1"
[7] N. Rin, "VMDE - Virtual Machines Detection Enhanced"
[8] Peter Szor, "The Art of Computer Virus Research and Defense"
[9] Philippe Beaucamps, "Advanced Metamorphic Techniques in Computer
Viruses"
[10] Richard Ford, "The future of virus detection"
[11] Ronnie Johndas, "Analysis of CVE-2014-4113"
[12] http://www.ducasec.com/an-ninh-mang-the-gioi-nhin-lai-2014-va-du-doan-
2015/
[13] http://itsecuritylab.eu/index.php/2010/09/03/writing-crypter-bypassing-
antivirus-how-to-for-beginners/