73
1 MC LC DANH MC HÌNH NH ........................................................................................ 3 TVIT TT .......................................................................................................... 4 LI MĐẦU ........................................................................................................... 5 TNG QUAN VMÃ ĐỘC............................................................. 7 1.1. Gii thiu .................................................................................................. 7 1.1.1. Khái nim, phân loi và mục đích của mã độc ....................................... 7 1.1.2. Các thc lây nhiễm mã độc ..................................................................... 8 1.1.3. Các loại mã độc mi và dđoán xu hướng mã độc trong tương lai ....... 9 1.2. Các công csinh mã độc tđộng........................................................... 10 1.2.1. Hướng tiếp cn ...................................................................................... 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 TNG QUAN VPHN MM PHÒNG CHỐNG MÃ ĐỘC ...... 19 2.1. Gii thiu ................................................................................................ 19 2.2. Nguyên lý phát hiện mã độc ................................................................... 20 2.2.1. Phát hiện mã độc da vào du 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 kthut 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 CU CÁC KTHUẬT VƯỢT QUA PHN MM PHÒNG CHỐNG MÃ ĐỘC ................................................................................... 31 3.1. Cu trúc tp tin thc thi trên Hđiều hành Windows 32bit................... 31 3.2. Các kthuật vượt qua các phn mm phòng chống mã độc .................. 46

Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

Embed Size (px)

Citation preview

Page 1: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 2: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 3: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 4: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 5: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 6: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 7: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cá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.

Page 8: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 9: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 10: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 11: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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)

Page 12: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 13: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 14: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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:

Page 15: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 16: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 17: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 18: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 19: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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)

Page 20: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 21: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 22: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 23: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 24: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 25: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 26: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 27: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 28: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 29: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 30: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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).

Page 31: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 32: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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)

Page 33: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 34: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 35: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 36: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 37: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 38: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 39: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

};

Page 40: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 41: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 42: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 43: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 44: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 45: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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 đó.

Page 46: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 47: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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ụ:

Page 48: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 49: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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 {

Page 50: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 51: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 52: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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ã.

Page 53: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 54: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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ự

Page 55: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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)

Page 56: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 57: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 58: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 59: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cá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

Page 60: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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");

Page 61: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 62: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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ố.

Page 63: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 64: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 65: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 66: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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ó.

Page 67: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 68: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 69: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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

Page 70: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 71: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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ố.

Page 72: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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.

Page 73: Báo cáo NCKH: "Nghiên cứu một số kỹ thuật sinh mã độc tự động và Vượt qua phần mềm phòng chống mã độc" - Nội dung báo cáo

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/