# Reversing Malware

## 1. Static Analysis

Phân tích tĩnh là một trong những bước cơ bản trong quá trình phân tích malware và là một kỹ thuật dùng để kiểm tra malware mà không cần thực thi nó. Quá trình này bao gồm việc phân tích cấu trúc tệp, nội dung và các hành vi của malware. Phân tích tĩnh đóng vai trò quan trọng trong việc phát hiện và phân loại malware, đồng thời thường là bước đầu tiên trong quy trình phân tích malware.

### 1.1. Compiling

**"Biên dịch"** là quá trình chuyển đổi mã nguồn phần mềm thành ngôn ngữ máy mà máy tính có thể hiểu được. Quá trình này được thực hiện bằng một công cụ đặc biệt gọi là **trình biên dịch (compiler)**. Việc biên dịch thường đề cập đến quá trình chuyển đổi mã từ một ngôn ngữ lập trình bậc cao sang ngôn ngữ bậc thấp hơn hoặc trực tiếp thành mã máy.

Quá trình biên dịch thường bao gồm các giai đoạn sau:

* **Phân tích từ vựng (Lexical Analysis):** Trình biên dịch đọc mã nguồn và chuyển đổi nó thành các token có ý nghĩa. Giai đoạn này đảm bảo rằng mã nguồn được đọc đúng cú pháp.
* **Phân tích cú pháp (Syntax Analysis):** Các token được tổ chức theo các quy tắc của ngôn ngữ lập trình, tạo thành một cây cấu trúc (thường gọi là **cây cú pháp (a syntax tree)**).
* **Phân tích ngữ nghĩa (Semantic Analysis):** Trình biên dịch kiểm tra ý nghĩa của các biểu thức trong cây cấu trúc và thực hiện các bước như kiểm tra kiểu dữ liệu để loại bỏ lỗi logic trong chương trình.
* **Tối ưu hóa (Optimization):** Trình biên dịch thực hiện các tối ưu hóa để làm cho mã hiệu quả hơn, giúp chương trình chạy nhanh hơn hoặc sử dụng ít tài nguyên hơn.
* **Sinh mã (Code Generation):** Trình biên dịch chuyển đổi cây cấu trúc tối ưu thành ngôn ngữ máy đích, tạo ra tệp thực thi hoặc tệp ngôn ngữ trung gian.

Sau giai đoạn sinh mã, mã nguồn không còn có thể đọc được bởi con người nữa.

**Lợi ích của quá trình biên dịch:**

* **Hiệu suất (Performance):** Chương trình biên dịch có hiệu suất cao hơn vì chúng chạy trực tiếp dưới dạng mã máy.
* **Bảo mật (Security):** Mã biên dịch giúp che giấu cách thức hoạt động của phần mềm, bảo vệ quyền sở hữu trí tuệ của nhà phát triển và cả những kẻ phát triển malware.
* **Tính độc lập (Independence):** Trình biên dịch có thể tạo ra tệp thực thi hoạt động trên các nền tảng khác nhau.

### 1.2. Debugging

Gỡ lỗi là quá trình xác định và sửa lỗi trong phần mềm. Trong quá trình này, lập trình viên thực thi mã từng bước và theo dõi trạng thái của ứng dụng để phát hiện và khắc phục lỗi.

**Các công cụ và kỹ thuật trong quá trình gỡ lỗi:**

* **Theo dõi luồng mã (Monitoring Code Flow):** Công cụ gỡ lỗi giúp lập trình viên theo dõi từng bước thực thi của chương trình để phát hiện các hành vi bất thường.
* **Quản lý biến và bộ nhớ (Variables and Memory Management):** Quan sát biến và vùng nhớ trong thời gian thực giúp tìm ra nguồn gốc của lỗi và vấn đề hiệu suất.
* **Điểm dừng và điểm theo dõi (Breakpoints and Watchpoints):** Cho phép dừng chương trình tại một dòng mã cụ thể để kiểm tra trạng thái của nó.

**Các kỹ thuật malware sử dụng để tránh bị gỡ lỗi:**

* **Phát hiện trình gỡ lỗi (Detection of Debuggers):** Malware có thể kiểm tra xem có công cụ gỡ lỗi nào đang hoạt động trên hệ thống hay không.
* **Làm rối mã (Obfuscation):** Biến đổi mã để gây khó khăn trong việc hiểu cách nó hoạt động.
* **Đặt độ trễ thời gian và bom logic (Time Delays and Logic Bombs):** Kích hoạt hành vi độc hại sau một khoảng thời gian hoặc một sự kiện nhất định.
* **Ảo hóa (Virtualization):** Một số malware sử dụng kỹ thuật ảo hóa để ngăn chặn việc phân tích trực tiếp mã của chúng.

### 1.3. Packing

Packing là một phương pháp nén và mã hóa tệp thực thi nhằm giảm kích thước tệp, cải thiện thời gian tải hoặc tăng cường bảo mật. Phương pháp này không chỉ được sử dụng trong phần mềm hợp pháp mà còn được kẻ tấn công lợi dụng để che giấu malware.

**Các chức năng của Packing:**

* **Giảm kích thước tệp (Reducing File Size):** Giúp phần mềm tốn ít dung lượng hơn khi lưu trữ hoặc phân phối.
* **Cải thiện thời gian tải (Improving Load Time):** Nén tệp có thể giúp chương trình tải nhanh hơn từ đĩa.
* **Bảo mật và bảo vệ (Security and Protection):** Packing mã hóa và nén phần mềm, làm cho việc phân tích ngược trở nên khó khăn hơn.

**Các phương pháp packing phổ biến:**

* **UPX:** Một công cụ phổ biến, mã nguồn mở, thường bị kẻ tấn công sử dụng.
* **The Enigma Protector:** Được thiết kế để bảo vệ phần mềm hợp pháp nhưng cũng bị sử dụng để che giấu malware.
* **MPRESS:** Giảm kích thước tệp và cải thiện thời gian tải, thường được malware sử dụng.
* **Exe Packer 2.300:** Công cụ dễ sử dụng để nén và giải nén tệp thực thi.
* **Themida:** Bảo vệ ứng dụng Windows khỏi bị can thiệp, nhưng cũng có thể được sử dụng để mã hóa malware.
* **VMProtect:** Mã hóa tệp thực thi mà không cần giải mã khi chạy, hoạt động trên mã ảo hóa.

Mặc dù packing có lợi ích đối với phần mềm hợp pháp, nhưng nó cũng là một công cụ quan trọng của kẻ tấn công để **che giấu mã độc**. Các packer giúp malware:

* **Tránh bị phát hiện bởi phần mềm diệt virus.**
* **Làm phức tạp quá trình phân tích.**
* **Làm chậm các công cụ kiểm tra mã độc.**

### 1.4. Packing Methods

Các packer thực thi nén phần mềm và thường thêm một quy trình giải nén để khôi phục trạng thái ban đầu trong thời gian chạy. Các quy trình nén và mã hóa này ảnh hưởng trực tiếp đến nội dung và chức năng của tệp đã được đóng gói và thường yêu cầu một công cụ giải nén thực thi để phục hồi.

Để tránh bị phát hiện bởi các công cụ phân tích tĩnh, các packer được sử dụng bởi những kẻ phát triển phần mềm độc hại cố gắng che giấu việc sử dụng nén, mã hóa và các quy trình giải nén theo nhiều cách khác nhau.

Đây là một cuộc chiến không ngừng: khi các nhà phát triển công nghệ bảo mật phát triển các phương pháp mới để phát hiện các kỹ thuật né tránh bảo mật, những kẻ phát triển phần mềm độc hại cũng liên tục cải tiến chiến lược tấn công của mình. Tình trạng này có khả năng sẽ tiếp diễn trong một thời gian dài.

Ví dụ, ảnh chụp màn hình sau đây hiển thị kết quả của lệnh `"strings"` trên tệp `"putty.exe"` trong hệ thống Linux. Lệnh `"strings"` trích xuất các chuỗi ký tự có thể đọc được bởi con người từ một tệp thực thi và đóng vai trò như một công cụ phân tích tĩnh nhanh.

<figure><img src="/files/vO9bEQXNoIGTdkT7M89x" alt=""><figcaption></figcaption></figure>

Ảnh chụp màn hình tiếp theo hiển thị cùng một tệp `"putty.exe"` sau khi đã được nhúng một payload và đóng gói bằng công cụ Shellter, cùng với kết quả của lệnh `"strings"`:

<figure><img src="/files/WYPCRPamyGnzpxjXBXFh" alt=""><figcaption></figcaption></figure>

#### Một số packer phổ biến hiện nay

* **UPX**: Thường được các nhà phát triển phần mềm độc hại sử dụng do tính chất mã nguồn mở và linh hoạt của nó.
* **The Enigma Protector**: Được thiết kế để bảo vệ phần mềm hợp pháp, nhưng cũng được sử dụng để làm cho việc phân tích phần mềm độc hại trở nên khó khăn hơn.
* **MPRESS**: Giúp giảm kích thước tệp và tăng tốc độ tải, điều này khiến nó trở thành một packer hấp dẫn đối với các nhà phát triển phần mềm độc hại.
* **Exe Packer 2.300**: Dễ sử dụng để đóng gói và giải nén tệp, do đó rất phổ biến.
* **ExeStealth**: Tích hợp các khả năng mã hóa để ngăn chặn việc phát hiện và phân tích phần mềm độc hại.
* **Morphine**: Được biết đến với bộ nạp PE độc đáo và khả năng tạo bộ giải mã riêng biệt cho từng mẫu phần mềm độc hại.
* **Themida**: Được thiết kế để bảo vệ ứng dụng Windows khỏi bị can thiệp, nhưng cũng có thể được sử dụng để mã hóa phần mềm độc hại.
* **MEW**: Sử dụng thuật toán LZMA để nén các tệp phần mềm độc hại có kích thước nhỏ.
* **FSG**: Được sử dụng để nén cả tệp nhỏ và lớn, nhưng tương đối dễ giải nén.
* **PESpin**: Nhắm mục tiêu vào mã Windows để ngăn chặn việc chỉnh sửa hoặc phân phối trái phép.
* **Andromeda**: Vừa là một botnet vừa là một packer, làm tăng nhu cầu phân tích ngược.
* **VMProtect**: Có thể mã hóa nhiều loại tệp mà không cần giải mã khi thực thi bằng cách sử dụng mã hóa trên nền tảng ảo hóa.
* **Obsidium**: Có thể mã hóa, nén và ẩn mã cho các ứng dụng Windows 32-bit và 64-bit.

Mặc dù tất cả các công cụ trên có những đặc điểm riêng biệt, nhưng logic và mục đích cơ bản của chúng vẫn giống nhau: làm cho mã đảo ngược trở nên khó hiểu nhất có thể.

## 2. Analyzing File Structure

Bước đầu tiên trong phân tích tĩnh là kiểm tra cấu trúc tệp của phần mềm độc hại. Các đặc điểm cơ bản như phần mở rộng tệp, kích thước và chữ ký tệp giúp xác định loại tệp. Các tệp hoặc mã độc ẩn trong phần mềm độc hại cũng được xem xét ở giai đoạn này.

Sau khi biên dịch, các tệp được gọi là tệp thực thi ("executable"). Có nhiều loại tệp thực thi khác nhau, và cấu trúc của chúng thay đổi tùy theo hệ điều hành.

### 2.1. Executable Files

* **Định dạng PE (Portable Executable)**: Được thiết kế cho hệ điều hành Windows và thường được sử dụng trong các tệp thực thi (.exe), thư viện liên kết động (.dll) và các tệp hệ thống khác (.sys).
* **Định dạng ELF (Executable and Linkable Format)**: Được sử dụng chủ yếu trong các hệ điều hành Unix và Unix-like (Linux, Solaris, FreeBSD, v.v.). ELF cung cấp một định dạng tiêu chuẩn cho nhiều loại tệp khác nhau, như tệp thực thi, tệp đối tượng, thư viện chia sẻ và mô-đun kernel. Định dạng ELF đã thay thế các định dạng cũ hơn như 'a.out' và 'COFF' và trở thành tiêu chuẩn trên hầu hết các hệ thống Unix hiện đại.

**Xác định loại tệp thực thi**

Cách dễ nhất để xác định loại tệp thực thi là sử dụng lệnh <mark style="color:red;">`file`</mark> trong Linux:

```bash
file putty.exe
```

```bash
file /usr/bin/ssh
```

<figure><img src="/files/EaANyrz4FHgGWtP9z36t" alt=""><figcaption></figcaption></figure>

Đầu ra của lệnh trên cho thấy rằng tệp '`putty.exe`' thuộc loại '`PE32+ executable (GUI) x86-64, for MS Windows`'. Chi tiết của đầu ra này được giải thích dưới đây:

* Định dạng tệp "`PE32+`" là một phiên bản mở rộng của định dạng tệp Portable Executable (PE) và thường được sử dụng trên các hệ thống 64-bit. Định dạng tệp PE32 (còn được gọi đơn giản là PE) được thiết kế cho các hệ thống 32-bit. PE32+ được tối ưu hóa cho bộ nhớ và bộ xử lý 64-bit, có nghĩa là tệp có thể sử dụng không gian địa chỉ lớn hơn và tận dụng các bộ xử lý 64-bit.
* "`Executable (GUI)`" chỉ ra rằng tệp là một tệp thực thi và chứa giao diện người dùng đồ họa (GUI). Nói cách khác, tệp này được sử dụng để khởi chạy một ứng dụng có chứa các thành phần đồ họa và thường hỗ trợ tương tác người dùng.
* "`X86-64`" chỉ ra kiến trúc bộ xử lý mà tệp được biên dịch cho nó. x86-64 (hoặc AMD64) là một kiến trúc vi xử lý 64-bit được phát triển bởi Intel và AMD. Kiến trúc này là một phiên bản mở rộng của kiến trúc x86 32-bit trước đó và cung cấp các tính năng như khả năng định địa chỉ bộ nhớ lớn hơn (về mặt lý thuyết lên đến 16 exabyte) và nhiều thanh ghi đa năng hơn.
* "`for MS Windows`" chỉ ra rằng tệp được tạo cho hệ điều hành Microsoft Windows. Điều này có nghĩa là tệp được tạo bằng cách sử dụng các API, thư viện và các thành phần hệ thống cụ thể của Windows và chỉ có thể được thực thi trong môi trường Windows.

Đầu ra lệnh "<mark style="color:red;">`file`</mark>" khác trong cùng một hình ảnh cho thấy thông tin của một tệp thực thi được tạo cho các hệ thống Linux. Tệp này là tệp "`ssh`" nằm trong thư mục "`/usr/bin`" của hệ điều hành. Đầu ra đầy đủ của lệnh file như sau:

Đầu ra: "<mark style="color:red;">`ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, /lib64/ld-linux-x86-64.so.2 interpreter, BuildID[sha1]=9bcea942ddf1634a6501be2acdc960e05f4a1203, for GNU/Linux 3.2.0, stripped`</mark>".

Mô tả thông tin trong đầu ra lệnh này như sau:

* `ELF 64-bit LSB`: ELF (Executable and Linkable Format) chỉ ra rằng tệp ở định dạng được sử dụng bởi Unix và các hệ điều hành giống Unix. "64-bit" biểu thị rằng tệp được tạo cho bộ xử lý 64-bit, trong khi "LSB" (Least Significant Byte) cho thấy thứ tự byte là "little-endian".
* `pie executable`: PIE (Position Independent Executable) chỉ ra rằng tệp thực thi có mã độc lập vị trí có thể được đặt ngẫu nhiên trong bộ nhớ (tương thích với ASLR, Address Space Layout Randomization). Đây là một tính năng bảo mật quan trọng vì nó làm cho việc dự đoán địa chỉ bộ nhớ của ứng dụng trở nên khó khăn hơn.
* `x86-64`: Điều này cho thấy rằng tệp được biên dịch để chạy trên kiến trúc x86-64, tương thích với bộ xử lý Intel và AMD 64-bit hiện đại.
* `version 1 (SYSV)`: Cho biết phiên bản nào của định dạng tệp ELF và tiêu chuẩn gọi hệ thống (SYSV - System V) đang được sử dụng.
* `dynamically linked`: Điều này chỉ ra rằng tệp được liên kết động và các thư viện cần thiết sẽ được tải khi chạy.
* `interpreter /lib64/ld-linux-x86-64.so.2`: Tệp này sử dụng tệp thực thi "`/lib64/ld-linux-x86-64.so.2`" làm trình liên kết động, cần thiết để tải và thực thi các tệp ELF.
* `BuildID[sha1]=9bcea942ddf1634a6501be2acdc960e05f4a1203`: Đây là mã định danh băm SHA-1 duy nhất của tệp, tạo điều kiện theo dõi một bản dựng cụ thể.
* `for GNU/Linux 3.2.0`: Cho biết rằng tệp tương thích với kernel GNU/Linux phiên bản 3.2.0.
* `stripped`: Điều này chỉ ra rằng bảng ký hiệu và thông tin gỡ lỗi đã bị xóa khỏi tệp. Các tệp stripped có kích thước nhỏ hơn và chứa ít thông tin hơn về cấu trúc bên trong của chúng, làm cho việc đảo ngược kỹ thuật trở nên khó khăn hơn.

Như đã thấy, mỗi nền tảng có cấu trúc riêng và mỗi cấu trúc có các tham số duy nhất của nó.

### 2.2. PE File Structure

Trong phần này, chúng ta đã tìm thấy một số chi tiết của tệp bằng lệnh "<mark style="color:red;">`file`</mark>". Một tệp PE có các phần duy nhất. Biết những điều này là quan trọng để đảo ngược kỹ thuật. Dưới đây là các phần của tệp PE và mô tả của chúng:

* `DOS Header`: Tất cả các tệp PE bắt đầu với một tiêu đề DOS MZ đơn giản để tương thích ngược với các hệ thống DOS cũ. Điều này bao gồm một chữ ký cụ thể xác định tệp là tệp PE.
* `PE Header`: Đánh dấu sự bắt đầu của tệp PE thực tế và chứa thông tin cơ bản về tệp. Ví dụ: loại máy và số lượng phần được bao gồm trong khu vực này.
* `Section Headers`: Chứa thông tin về các phần trong tệp. Mỗi tiêu đề phần bao gồm các chi tiết như kích thước, vị trí và quyền truy cập của phần.
* `Sections`: Các phần khác nhau như code, data và resources chứa mã thực thi, dữ liệu và tài nguyên của tệp. Các phần này là nội dung sẽ được sử dụng khi chạy.
* `Import Table`: Bảng này cho biết các hàm nào mà tệp PE sử dụng từ các tệp khác. Nó thường bao gồm các lệnh gọi hệ thống hoặc các hàm thư viện khác.
* `Export Table`: Liệt kê các hàm và các ký hiệu khác được xuất bởi tệp. Điều này chỉ ra các hàm có thể được sử dụng bởi các chương trình hoặc thư viện khác.
* `Resource Section`: Chứa các thành phần giao diện người dùng như biểu tượng, menu và hộp thoại cho ứng dụng.

Các tệp PE có thể được phân tích bằng bất kỳ chương trình "<mark style="color:red;">`hex editor`</mark>" nào, nhưng đây là một phương pháp tẻ nhạt và tốn thời gian. Thay vào đó, việc sử dụng các công cụ có thể phân tích các tệp PE là một cách tiếp cận thích hợp hơn nhiều. Có rất nhiều công cụ có sẵn trên thị trường, cả thương mại và mã nguồn mở. Không thể bao gồm từng công cụ và cách sử dụng của nó trong khóa học này. Ta có thể sử dụng Manalyze vì nó là phần mềm mã nguồn mở.

## 3. Important DLLs and Functions for Windows

Những kẻ tấn công liên tục phát triển các kỹ thuật của họ và khám phá ra các phương pháp mới. Tuy nhiên, mặc dù có nhiều loại tấn công khác nhau, các DLL và các hàm được sử dụng cho một số hoạt động nhất định thường vẫn giống nhau. Do đó, điều quan trọng là phải hiểu các kỹ thuật tấn công được tin tặc mạng sử dụng trong quá khứ và hiện tại để dự đoán các phương pháp tấn công trong tương lai. Danh sách sau đây cung cấp một cái nhìn tổng quan về các DLL và hàm vốn có trong hệ điều hành Windows được sử dụng thường xuyên nhất:

* ADVAPI32.dll
* KERNEL32.dll
* USER32.dll
* WININET.dll và WS2\_32.dll

### 3.1. ADVAPI32.dll

* "<mark style="color:red;">`RegCreateKeyEx`</mark>", "<mark style="color:red;">`RegOpenKeyEx`</mark>", "<mark style="color:red;">`RegSetValueEx`</mark>" và "<mark style="color:red;">`RegDeleteKey`</mark>": Các hàm thao tác các khóa registry. Phần mềm độc hại thường sử dụng các khóa registry để đảm bảo sự tồn tại dai dẳng hoặc thay đổi cài đặt hệ thống.
* "<mark style="color:red;">`OpenSCManager`</mark>", "<mark style="color:red;">`CreateService`</mark>", "<mark style="color:red;">`StartService`</mark>": Các hàm tương tác với các dịch vụ. Phần mềm độc hại có thể tự thêm vào như một dịch vụ cho hệ thống hoặc sửa đổi các dịch vụ hiện có.

### 3.2. KERNEL32.dll

* "<mark style="color:red;">`CreateProcess`</mark>", "<mark style="color:red;">`TerminateProcess`</mark>": Các hàm được sử dụng để quản lý tiến trình. Phần mềm độc hại có thể cố gắng khởi động hoặc chấm dứt các tiến trình khác.
* "<mark style="color:red;">`WriteFile`</mark>", "<mark style="color:red;">`ReadFile`</mark>": Các hàm để đọc và ghi tệp. Chúng có thể được sử dụng để đánh cắp dữ liệu hoặc làm hỏng dữ liệu.
* "<mark style="color:red;">`VirtualAlloc`</mark>", "<mark style="color:red;">`VirtualProtect`</mark>": Các hàm liên quan đến quản lý bộ nhớ. Phần mềm độc hại có thể thay đổi cài đặt bộ nhớ của các tiến trình đang chạy để thực thi mã độc hại.

### 3.3. **USER32.dll**

* "<mark style="color:red;">`SetWindowsHookEx`</mark>", "<mark style="color:red;">`SendMessage`</mark>": Các hàm được sử dụng để giám sát đầu vào của người dùng hoặc can thiệp vào các ứng dụng khác.
* "<mark style="color:red;">`EnumWindows`</mark>", "<mark style="color:red;">`GetWindowText`</mark>": Các hàm được sử dụng để liệt kê các cửa sổ đang mở và truy xuất tiêu đề cửa sổ.

### 3.4. WININET.dll and WS2\_32.dll

* "<mark style="color:red;">`InternetOpen`</mark>", "<mark style="color:red;">`InternetConnect`</mark>", "<mark style="color:red;">`HttpSendRequest`</mark>": Các hàm để gửi và nhận dữ liệu qua mạng. Phần mềm độc hại thường sử dụng các hàm này để giao tiếp với các máy chủ điều khiển và chỉ huy (C\&C).
* "<mark style="color:red;">`socket`</mark>", "<mark style="color:red;">`connect`</mark>", "<mark style="color:red;">`send`</mark>", "<mark style="color:red;">`recv`</mark>": Các hàm cho các hoạt động mạng cấp thấp. Chúng có thể được sử dụng để tạo lưu lượng mạng hoặc đánh cắp dữ liệu.

## 4. ELF Files

**Executable and Linkable Format (ELF)** là một định dạng tệp được sử dụng rộng rãi trong các hệ điều hành Unix và Unix-like, bao gồm Linux, Solaris, FreeBSD và các hệ thống khác. Định dạng ELF cung cấp một tiêu chuẩn chung cho nhiều loại tệp, bao gồm tệp thực thi, tệp đối tượng, thư viện chia sẻ và mô-đun nhân hệ điều hành. Nó đã thay thế các định dạng cũ như `a.out` và `COFF`, trở thành định dạng mặc định trong hầu hết các hệ thống Unix hiện đại.

Một tệp ELF được cấu trúc từ nhiều thành phần khác nhau, mỗi thành phần có một mục đích cụ thể.

### 4.1. ELF Structure

* **Header (Tiêu đề tệp)**: Xác định loại tệp (tệp thực thi, thư viện chia sẻ hoặc tệp đối tượng), kiến trúc bộ xử lý và các thuộc tính chung khác của tệp.
* **Bảng tiêu đề chương trình (Program Header Table)**: Mô tả các thuộc tính và vị trí của các phân đoạn thực thi hoặc có thể tải được. Hệ điều hành sử dụng bảng này để tải tệp vào bộ nhớ.
* **Bảng tiêu đề phần (Section Header Table)**: Định nghĩa thuộc tính và vị trí của các phần trong tệp. Mỗi phần chứa dữ liệu cụ thể như mã lệnh, dữ liệu hoặc bảng ký hiệu.
* **Các phần (Sections)**: Gồm nhiều phân đoạn khác nhau tạo nên nội dung của tệp ELF, bao gồm:
  * **`.text`**: Chứa mã thực thi dưới dạng mã máy.
  * **`.data`**: Chứa các biến toàn cục và tĩnh đã được khởi tạo.
  * **`.bss`**: Dùng cho các biến toàn cục và tĩnh chưa được khởi tạo.
  * **`.rodata`**: Chứa dữ liệu chỉ đọc (ví dụ: chuỗi hằng số).
  * **`.symtab`**: Bảng ký hiệu chứa thông tin về các thành phần được đặt tên trong chương trình, được tạo bởi trình biên dịch và trình liên kết.
  * **`.strtab`**: Chứa dữ liệu chuỗi, chẳng hạn như symbol names.
  * **Phần động (Dynamic Section)**: Chứa thông tin liên kết động, mô tả cách chương trình tương tác với các thư viện khác trong thời gian chạy.

Định dạng tệp ELF được sử dụng rộng rãi do tính linh hoạt và khả năng tương thích trên nhiều hệ thống khác nhau, giúp nó trở thành lựa chọn lý tưởng trong nhiều bối cảnh. Ngoài ra, ELF còn hỗ trợ nhiều kiến trúc bộ xử lý, cho phép sử dụng trên nhiều nền tảng khác nhau. Định dạng này cũng cung cấp các tính năng quan trọng mà hệ điều hành hiện đại yêu cầu, bao gồm liên kết động, tính mô-đun cao và quản lý bộ nhớ hiệu quả.

### 4.2. Readelf

Để phân tích tệp ELF, lệnh <mark style="color:red;">`readelf`</mark> có thể được sử dụng. Đây là công cụ thường được cài đặt sẵn trên hầu hết các bản phân phối Linux:

```bash
readelf -a /usr/bin/ssh
```

<figure><img src="/files/WN4VHSE8LjQh3gRYwhmA" alt=""><figcaption></figcaption></figure>

### 4.3. Strings

Lệnh <mark style="color:red;">`strings`</mark> trên Unix và các hệ điều hành tương tự Unix giúp người dùng xem các chuỗi ký tự có thể đọc được trong một tệp cụ thể. Công cụ này thường được dùng để trích xuất thông tin văn bản từ các tệp nhị phân hoặc không phải tệp văn bản. Nó xác định văn bản có thể đọc được trong các tệp nhị phân, hỗ trợ quá trình gỡ lỗi và kỹ thuật dịch ngược (reverse engineering).

Các nhà phân tích an ninh mạng sử dụng lệnh <mark style="color:red;">`strings`</mark> để xác định các lệnh ẩn, URL hoặc thông tin quan trọng khác trong tệp đáng ngờ. Những dữ liệu này có thể giúp hiểu rõ hơn về chức năng và giao thức giao tiếp của phần mềm độc hại.

Ví dụ, trong một biến thể của **WannaCry**, một URL có thể xuất hiện trong đầu ra của lệnh <mark style="color:red;">`strings`</mark>:

🚨 **Cảnh báo**: Quá trình phân tích phải được thực hiện trong môi trường thử nghiệm cách ly hoàn toàn. Không nên quên rằng tệp này có thể liên quan đến phần mềm độc hại thực sự.

<figure><img src="/files/cy3KBDqkXURjEY24LQ7g" alt=""><figcaption></figcaption></figure>

## 5. Dynamic Analysis

Phân tích động đề cập đến việc kiểm tra phần mềm hoặc chương trình máy tính khi nó đang chạy. Mục tiêu là quan sát trực tiếp và hiểu hành vi của chương trình, từ đó phát hiện các lỗi, lỗ hổng bảo mật, vấn đề hiệu suất hoặc chức năng độc hại.

**Phân tích động được sử dụng để làm gì?**

* **Phân tích thời gian thực:** Phân tích động kiểm tra cách một chương trình phản hồi với các đầu vào khác nhau trong thời gian thực, giúp xác định các lỗi khi chạy và hành vi mà phân tích tĩnh không thể phát hiện.
* **Phát hiện phần mềm độc hại:** Phân tích động có thể nhận diện các hoạt động độc hại bằng cách quan sát hành vi của phần mềm độc hại, tài nguyên hệ thống mà nó truy cập, kết nối mạng mà nó sử dụng và các tệp mà nó cố gắng thay đổi.
* **Đánh giá hiệu suất:** Kiểm tra hiệu suất ứng dụng thông qua các chỉ số như mức sử dụng bộ nhớ, tải CPU và thời gian phản hồi – điều này rất quan trọng để tối ưu hóa ứng dụng.
* **Kiểm tra tích hợp:** Kiểm tra cách phần mềm tương tác với các hệ thống và API khác, giúp xác định lỗi tích hợp và các vấn đề không tương thích.

#### **Các kỹ thuật né tránh phân tích động của phần mềm độc hại**

Phần mềm độc hại thường sử dụng nhiều kỹ thuật để tránh bị phát hiện trong quá trình phân tích động, bao gồm:

* **Phát hiện trình gỡ lỗi:** Phần mềm độc hại có thể kiểm tra xem trình gỡ lỗi có đang chạy hay không. Nếu phát hiện có trình gỡ lỗi, nó có thể dừng hoạt động độc hại hoặc ẩn hành vi nguy hiểm.
* **Phát hiện máy ảo:** Nhiều phần mềm độc hại sẽ thu thập thông tin phần cứng của hệ thống để kiểm tra xem nó có đang chạy trong môi trường máy ảo không. Ví dụ, nếu phát hiện hệ thống có 1GB RAM và CPU lõi đơn, nó có thể kết luận rằng đang chạy trong máy ảo và từ chối thực thi.
* **Time Delay Tactics (Chiến thuật trì hoãn):** Một số phần mềm độc hại có thể tạm dừng hoặc trì hoãn hành động của nó trong một khoảng thời gian nhất định nhằm gây khó khăn cho quá trình phân tích.
* **Obfuscation and Polymorphism (Làm rối và đa hình):** Phần mềm độc hại có thể làm rối mã nguồn hoặc thay đổi mã của nó một cách thường xuyên (đa hình) để làm phức tạp quá trình phân tích.
* **Anti-Debugging Techniques (Kỹ thuật chống gỡ lỗi):** Một số phần mềm độc hại có thể theo dõi sự thay đổi trong hệ điều hành để xác định sự hiện diện của trình gỡ lỗi.
* **Variable Analysis (Phân tích biến số):** Phần mềm độc hại có thể phân tích hệ thống để xác minh mục tiêu của nó, ví dụ như kiểm tra địa chỉ IP để xác định vị trí, kiểm tra múi giờ, kiểm tra xem hệ thống có thuộc miền cụ thể không, hoặc kiểm tra dung lượng CPU và RAM. Nếu không tìm thấy điều kiện phù hợp, phần mềm độc hại có thể từ chối thực thi.

Những kỹ thuật này làm cho việc phát hiện phần mềm độc hại trở nên phức tạp hơn, yêu cầu các chuyên gia bảo mật phải liên tục phát triển các phương pháp phân tích mới.

### 5.1. Dynamic Analysis Tools

Bản chất của phân tích động đòi hỏi các công cụ đặc biệt dành riêng cho hệ điều hành đang được phân tích. Ví dụ: phân tích động một ứng dụng được phát triển cho hệ điều hành Windows đòi hỏi một môi trường có hệ điều hành Windows.

Trong loại phân tích này, ứng dụng được kiểm tra trên một hệ thống đang chạy và gần như tất cả các quy trình được thực hiện thủ công. Một trong những công cụ có thể được sử dụng cho phân tích này là <mark style="color:red;">`SysInternals`</mark>, được Microsoft cung cấp miễn phí.

Các Công Cụ SysInternals bao gồm một bộ phần mềm được phát triển bởi Microsoft, bao gồm các công cụ giám sát, quản lý và thu thập thông tin mạnh mẽ khác nhau cho hệ điều hành Windows. Các công cụ này được sử dụng bởi các quản trị viên hệ thống, nhà phát triển và chuyên gia CNTT để theo dõi hiệu suất hệ thống, chẩn đoán các sự cố tiềm ẩn và thu thập thông tin chi tiết về bảo mật hệ thống.

Bộ Sysinternals ban đầu được phát triển bởi Sysinternals, một công ty được thành lập vào năm 1996 bởi Mark Russinovich và Bryce Cogswell. Sau khi Microsoft mua lại Sysinternals vào năm 2006, họ tiếp tục cung cấp và cải tiến các công cụ này miễn phí.

Bộ Sysinternals bao gồm một số lượng lớn các công cụ. Danh sách đầy đủ các công cụ này có thể được tìm thấy tại:

Bộ Sysinternals: <https://learn.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite>

#### Process Monitor (ProcMon.exe)

ProcMon theo dõi các sự kiện hệ thống như hệ thống tệp, registry và hoạt động mạng trong hệ điều hành Windows theo thời gian thực và ghi lại chúng một cách chi tiết. Nó đặc biệt hữu ích nếu bạn muốn ghi lại và theo dõi chi tiết các hoạt động của các ứng dụng cụ thể. Mặt khác, có một số ứng dụng chạy và tắt chỉ trong vài giây. Rất khó để theo dõi những gì các ứng dụng này đang làm trong khi chúng đang chạy bằng các công cụ tiêu chuẩn. Đây là nơi công cụ ProcMon trở nên hữu ích.

Hãy xem nó hoạt động như thế nào với một ví dụ. Tệp '`wildfire-test-pe-file.exe`', cũng được sử dụng trong bài học phân tích tĩnh, là một tệp thực thi chạy trong một thời gian rất ngắn. Để theo dõi những gì ứng dụng này làm, trước tiên hãy chạy ứng dụng '<mark style="color:red;">`ProcMon64.exe`</mark>' trong thư mục SysInternals với quyền quản trị viên:

<figure><img src="/files/5RdcI7EaKIYnlqbldPcR" alt=""><figcaption></figcaption></figure>

Để xem các hoạt động của ứng dụng, một bộ lọc phải được thêm vào tệp '`wildfire-test-pe-file.exe`'. Để làm điều này, hãy theo đường dẫn '**`Filter -> Filter`**' từ menu trên cùng hoặc sử dụng phím tắt **`CTRL+L`**:

<figure><img src="/files/OoF1UOT2EhnW3WyGI92c" alt=""><figcaption></figcaption></figure>

Trong cửa sổ xuất hiện, chọn '**`Image Path`**' (1) làm Cột, chọn '**`contains`**' (2) làm Quan hệ, nhập '**`wildfire`**' (3) làm Giá trị và nhấp vào nút '**`Add`**' (4):

<figure><img src="/files/gC833WmYtoAdFeAwg1dw" alt=""><figcaption></figcaption></figure>

Nhấp vào nút **`Apply`** để áp dụng bộ lọc. Sau đó, nhấp vào nút **`Capture`** trong menu trên cùng hoặc nhấn **`CTRL+E`** để bắt đầu chụp.

<figure><img src="/files/ix8jPwf8kAcWeoKjmnX9" alt=""><figcaption></figcaption></figure>

Bây giờ các cài đặt cần thiết đã được thực hiện cho công cụ ProcMon, tệp thực thi đã sẵn sàng để chạy. Nhấp đúp hoặc nhấp chuột phải vào '`wildfire-test-pe-file.exe`' và chọn '**`Open`**'. Sau khi chạy tệp thực thi, ProcMon sẽ hiển thị đầu ra sau:

<figure><img src="/files/6ZMzn4zkEiFmfK6buSr5" alt=""><figcaption></figcaption></figure>

Như trong hình trên, các thao tác được thực hiện bởi ứng dụng được hiển thị trên màn hình ProcMon.

Bạn có thể nhấp chuột phải vào bất kỳ dòng nào và chọn khu vực cần làm nổi bật từ menu Highlight nếu bạn muốn làm nổi bật các thao tác cụ thể.

<figure><img src="/files/GbuYK5jDQUSMa8bpoJMD" alt=""><figcaption></figcaption></figure>

Trong ví dụ này, tất cả các thao tác "**`LoadImage`**" đã được tự động làm nổi bật vì thao tác này được thực hiện trên một hàng có giá trị trong trường "**`Operation`**" là "**`LoadImage`**". Bằng cách này, bạn có thể xem tất cả các thao tác '**`LoadImage`**' trong nháy mắt.

Nhấp chuột phải vào bất kỳ hàng nào và chọn '**`Properties`**' từ menu bật lên sẽ mở cửa sổ '**`Event Properties`**'. Tab '**`Stack`**' trong cửa sổ này cung cấp một số thông tin có giá trị:

<figure><img src="/files/8qOQLuMzdpGWe9pA4vhM" alt=""><figcaption></figcaption></figure>

Các trường tab stack trong hình trên được mô tả như sau:

* Các khung được đánh dấu bằng chữ '**K**' cho biết rằng hàm được gọi từ mã chế độ kernel của hệ điều hành. Chế độ Kernel cung cấp quyền truy cập trực tiếp vào tài nguyên phần cứng và là cấp thấp nhất của hệ điều hành.
* Các khung được đánh dấu bằng chữ '**U**' cho biết các lệnh gọi hàm từ mã chế độ người dùng. Chế độ người dùng ít đặc quyền hơn chế độ kernel và là chế độ mà các ứng dụng chạy. Mã chế độ người dùng có quyền truy cập hạn chế vào tài nguyên hệ thống và hệ điều hành thường chạy các ứng dụng chế độ người dùng trong một môi trường biệt lập để bảo toàn tài nguyên hệ thống.
* Cột “**`Location`**” hiển thị hàm đang được gọi từ cột “**`Module`**”, cùng với phần bù của hàm. Phần bù cho biết khoảng cách tính bằng byte từ địa chỉ bắt đầu của mô-đun đến điểm bắt đầu của hàm. Ví dụ: “ZwSetValueKey + 0x14” trỏ đến 20 byte sau địa chỉ bắt đầu của hàm “ZwSetValueKey” (“0x14” là một biểu thức thập lục phân, với giá trị thập phân là 20).
* Cột '**`Address`**' hiển thị địa chỉ bộ nhớ của hàm được gọi. Đây là vị trí bộ nhớ thực tế được hệ điều hành cấp phát trong quá trình thực thi.
* Cột '**`Path`**' hiển thị đường dẫn từ đó mô-đun đã tải, và thông tin này rất quan trọng cho mục đích phân tích. Đặc biệt nếu các DLL hệ thống được tải từ một đường dẫn bên ngoài các thư mục hệ thống, thì đây là một phát hiện đáng để điều tra.

#### Process Explorer (ProcExp.exe)

Process Explorer tương tự như Windows Task Manager, nhưng cung cấp nhiều thông tin hơn. Nó thường được sử dụng bởi người dùng kỹ thuật và quản trị viên hệ thống.

Process Explorer hiển thị thông tin chi tiết về từng tiến trình, chẳng hạn như mức sử dụng bộ nhớ, tải CPU, đường dẫn đầy đủ của tệp đã thực thi, các xử lý tệp đang mở và các DLL đã cài đặt. Nó hiển thị các tiến trình và các tiến trình con của chúng trong một cấu trúc phân cấp, cho phép bạn hiểu một tiến trình liên quan đến các tiến trình khác như thế nào và những tiến trình nào được khởi tạo bởi những tiến trình nào. Ngoài ra, các mối quan hệ và giao tiếp giữa các tiến trình đang chạy được hiển thị chi tiết, giúp chúng dễ hiểu hơn. Nó cho bạn thấy tài nguyên hệ thống nào đang được sử dụng bởi tiến trình nào, với các biểu đồ theo thời gian thực về mức sử dụng CPU và bộ nhớ.

Các loại tiến trình khác nhau được hiển thị bằng các màu khác nhau trên màn hình Process Explorer; ví dụ: các tiến trình hệ thống có màu xanh lam và các tiến trình nền có màu tím. Điều này làm cho việc phân biệt các tiến trình nhanh hơn và dễ dàng hơn.

Từ menu nhấp chuột phải cho mỗi tiến trình, bạn có thể tắt tiến trình, xem các thuộc tính chi tiết của nó và thậm chí lấy một kết xuất bộ nhớ đầy đủ của tiến trình.

Tài khoản người dùng mà các tiến trình đang chạy và các thông tin liên quan đến bảo mật khác có thể được xem thông qua Process Explorer.

Nếu ứng dụng được chạy với quyền quản trị viên, thông tin về các tiến trình như sau:

<figure><img src="/files/5s1LI0Y0GE7MD6V7uIJF" alt=""><figcaption></figcaption></figure>

Nhấp chuột phải vào bất kỳ tiến trình nào và chọn '**`Properties`**' sẽ mở ra một cửa sổ với thông tin chi tiết về tiến trình.

Tab '**`Image`**' trong cửa sổ này hiển thị chi tiết của ứng dụng đang chạy:

<figure><img src="/files/1JtR8qXy1z4IWjHP2Fp0" alt=""><figcaption></figcaption></figure>

Sử dụng nút '**`Submit`**' trong trường **`VirusTotal`** trên tab này, băm của ứng dụng có thể được tìm kiếm trên VirusTotal. Khi quá trình này được tìm kiếm, kết quả là '0/77'. Không ai trong số 77 nhà cung cấp đánh dấu tiến trình này là độc hại.

Dữ liệu hiệu suất và đồ thị có thể được xem trong các tab '**`Performance`**', '**`Performance Graph`**', '**`Disk and Network`**' và '**`GPU Graph`**'.

'**`Threads`**' là tab được sử dụng phổ biến nhất. Tương tự như công cụ ProcMon, tab này hiển thị các mô-đun mà các luồng được sử dụng bởi ứng dụng đang sử dụng, các hàm của các mô-đun này mà chúng đang sử dụng và địa chỉ bộ nhớ của chúng.

<figure><img src="/files/JVP5j1lwm3nVx9nNuGXN" alt=""><figcaption></figcaption></figure>

Tất cả hoạt động TCP/IP của tiến trình có thể được theo dõi trong thời gian thực bằng tab TCP/IP:

<figure><img src="/files/JHTpD0t1Lp6A2aWPqHtq" alt=""><figcaption></figcaption></figure>

Tab này đặc biệt hữu ích để theo dõi quyền truy cập ứng dụng độc hại vào các máy chủ C\&C và lưu lượng mạng.

Tab “**`Strings`**” là một trong những tab có thông tin quan trọng. Nó liệt kê các chuỗi có thể đọc được (có thể in được) được trích xuất từ cả hình ảnh đĩa và hình ảnh bộ nhớ (đang chạy) của tiến trình đã chọn:

<figure><img src="/files/wCeapYSQmjS54I2aGgJK" alt=""><figcaption></figcaption></figure>

Đầu ra tương tự như đầu ra lệnh <mark style="color:red;">`strings`</mark> được mô tả trong bài học phân tích tĩnh có thể được nhìn thấy trong tab **`strings`** của công cụ này.

#### TCPView

Công cụ `TCPView` cho phép bạn theo dõi các kết nối TCP (IPv4, IPv6) và UDP (UDPv4, UDPv6) trên máy tính mục tiêu trong thời gian thực. Nó trở nên hữu ích nếu bạn cần hiểu ứng dụng nào giao tiếp với điểm cuối nào:

<figure><img src="/files/v5XIdNQ0eWO5wCf13htX" alt=""><figcaption></figcaption></figure>

Công cụ này có giao diện người dùng rất đơn giản và một số loại lưu lượng mạng nhất định có thể được lọc thông qua các biểu tượng trong menu trên cùng. Tùy chọn '**`Options -> Resolve Address`**' có thể được sử dụng để thực hiện phân giải DNS của địa chỉ IP.

Hoạt động mạng của ứng dụng có thể được xem thông qua `Process Explorer` và hoạt động mạng của hệ điều hành có thể được xem thông qua công cụ `TCPView`.

## 6. Code Analysis

Một trong những chủ đề cần được biết đến khi nói đến phần mềm độc hại là phân tích mã nguồn. Ngày nay, mã nguồn từ github hoặc những nơi tương tự được thêm vào nhiều dự án và đôi khi chúng không được xem xét đầy đủ.

Phần mềm độc hại có thể được chuyển sang các hệ thống thông qua mã phần mềm không được kiểm soát. Do đó, cách tiếp cận đúng đắn là kiểm tra các ứng dụng mà bạn sở hữu mã nguồn.

Đồng thời, phần mềm được mã hóa không chính xác, chứ không phải độc hại, có thể gây ra hoạt động độc hại.

Phân tích mã nguồn là quá trình phân tích mã nguồn của phần mềm. Thông thường, các vấn đề tiềm ẩn như lỗ hổng bảo mật, lỗi hoặc không tương thích được xác định thông qua phân tích này. Có hai cách chính để thực hiện phân tích mã nguồn:

* Phân tích mã tĩnh
* Phân tích mã động

### 6.1. Static Code Analysis

Phương pháp phân tích này phân tích mã nguồn mà không cần chạy phần mềm. Các công cụ và kỹ thuật được sử dụng để quét mã phần mềm để tìm lỗi, lỗ hổng và các vấn đề chất lượng khác trước khi mã được thực thi. Phân tích mã tĩnh có hiệu quả trong việc tìm kiếm các vấn đề sớm vì nó có thể được áp dụng sớm trong quá trình phát triển.

#### Syntax Check

* Mục đích của kiểm tra này là xác minh rằng mã tuân thủ các quy tắc cú pháp của ngôn ngữ.
* Nó thường được thực hiện bởi trình biên dịch hoặc trình thông dịch. Cú pháp sai hoặc thiếu là nguyên nhân gây ra lỗi biên dịch. Các công cụ kiểm tra mô phỏng quy trình này và phát hiện lỗi.

#### Semantic Analysis

* Mục đích của phân tích này là kiểm tra các quy tắc ngữ nghĩa, chẳng hạn như định nghĩa của các biến, không tương thích loại, v.v.
* Các phương pháp phân tích kiểm tra xem việc sử dụng biến, lệnh gọi hàm và các đoạn mã khác có được sử dụng thích hợp hay không.

#### Control Flow Analysis

* Mục tiêu là phân tích luồng và logic của mã để phát hiện mã chết (mã không bao giờ được thực thi) hoặc các vòng lặp vô hạn.
* Các lỗi tiềm ẩn được phát hiện bằng cách xác định các đường dẫn và trạng thái thực thi khác nhau của mã.

#### Data Flow Analysis

* Mục đích của phân tích luồng dữ liệu là xác minh rằng các biến được sử dụng thích hợp sau khi chúng được xác định.
* Nó kiểm tra xem các giá trị được gán cho các biến có được sử dụng thích hợp hay không và chúng có được khởi tạo trước khi được sử dụng hay không.

#### Metric-based Analysis

* Nó nhằm mục đích đo lường độ phức tạp và khả năng đọc của mã.
* Các số liệu khác nhau như Độ phức tạp Cyclomatic, Số dòng mã (LOC), các số liệu Halstead được sử dụng để đánh giá độ phức tạp của mã.

#### Modeling

* Mô hình hóa nhằm mục đích biểu diễn mã bằng các mô hình cấp cao và phát hiện các lỗi tiềm ẩn thông qua các mô hình này.
* Nó trừu tượng hóa mã bằng cách sử dụng các ngôn ngữ mô hình hóa khác nhau và thực hiện phân tích trên các trừu tượng này.

#### Rule-based Analysis

* Đó là quá trình xem xét mã dựa trên các bộ quy tắc được xác định trước.
* Nó thường được sử dụng để phát hiện các lỗ hổng như SQL injection, cross-site scripting (XSS).

### 6.2. Static Code Analysis Tools

Có rất nhiều ngôn ngữ lập trình và rất nhiều framework, lớn và nhỏ, cho các ngôn ngữ này. Do đó, không thể xử lý toàn bộ quy trình phân tích mã nguồn bằng một công cụ duy nhất. Các công cụ có sẵn trên thị trường cung cấp một loạt các hỗ trợ. "SonarQube", "Checkstyle", "FindBugs", "Coverity", "Fortify" là các công cụ phân tích mã tĩnh thương mại phổ biến.

Mặt khác, có nhiều công cụ cho các ngôn ngữ lập trình khác nhau. Một số công cụ bao gồm:

<table><thead><tr><th width="187">Tên Công Cụ</th><th>Ngôn Ngữ Hỗ Trợ</th><th>Tính Năng</th></tr></thead><tbody><tr><td>SonarQube</td><td>C, C++, Java, Python, JavaScript, C#, VB.NET, PHP, Go, Swift, Kotlin, Objective-C, Ruby, Haskell, Scala</td><td>Đo lường chất lượng mã, phát hiện lỗi và lỗ hổng, phát hiện trùng lặp, phân tích độ phức tạp của mã.</td></tr><tr><td>NDepend</td><td>C#, VB.NET</td><td>Phân tích sự phụ thuộc của mã, các số liệu và thống kê về mã, đánh giá chất lượng mã, phân tích kiến trúc.</td></tr><tr><td>CodePro Analytix</td><td>Java, C#, Visual Basic, C++</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã, phân tích tái sử dụng mã, phân tích độ phức tạp của mã.</td></tr><tr><td>Cppcheck</td><td>C/C++</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã, kiểm tra tuân thủ hướng dẫn phong cách (style guide).</td></tr><tr><td>PMD</td><td>Java, C#, Visual Basic, JavaScript, PHP, Python</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã, phân tích tái sử dụng mã, phân tích độ phức tạp của mã.</td></tr><tr><td>Coverity</td><td>C, C++, Java, Python</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã, phân tích tĩnh.</td></tr><tr><td>Klocwork</td><td>C, C++, Java, Ada, VHDL, Verilog</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã, phân tích tĩnh.</td></tr><tr><td>FindBugs</td><td>Java</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã.</td></tr><tr><td>Infer</td><td>C, C++</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã, phân tích tĩnh.</td></tr><tr><td>Lint</td><td>C, C++</td><td>Phát hiện lỗi và lỗ hổng, đo lường chất lượng mã, kiểm tra tuân thủ hướng dẫn phong cách (style guide).</td></tr></tbody></table>

### 6.3. Dynamic Code Analysis

Phân tích mã nguồn động đề cập đến phân tích được thực hiện tại thời gian chạy của một ứng dụng phần mềm để phát hiện các vấn đề tiềm ẩn bằng cách theo dõi hành vi của ứng dụng khi nó chạy. Loại phân tích này thường được sử dụng để kiểm tra ứng dụng, gỡ lỗi và đo lường hiệu suất. Dưới đây là một số kỹ thuật cơ bản được sử dụng và một số chi tiết liên quan đến việc phân tích mã động.

#### Test Automation

* Nó nhằm mục đích xác minh rằng phần mềm hoạt động đúng trong các tình huống khác nhau.
* Các trường hợp kiểm tra được chuẩn bị trước và các tình huống này được tự động chạy trên phần mềm. Kiểm tra xác minh rằng phần mềm tạo ra kết quả như mong đợi.

#### Debugging

* Nó phát hiện các lỗi thời gian chạy và tìm ra nguồn gốc của các vấn đề.
* Sử dụng các công cụ gỡ lỗi, các nhà phát triển có thể theo dõi hành vi thời gian chạy của ứng dụng từng bước và quan sát các giá trị của các biến. Điều này cho phép họ xác định nguyên nhân gây ra hành vi không mong muốn hoặc không mong muốn.

#### Profiling

* Đây là một kỹ thuật phân tích hiệu suất ứng dụng và xác định các nút thắt cổ chai.
* Các công cụ lập hồ sơ ghi lại những hàm nào của ứng dụng sử dụng bao nhiêu thời gian CPU và bộ nhớ để cải thiện hiệu suất.

#### Security Testing

* Các thử nghiệm được thiết kế để xác định các lỗ hổng trong ứng dụng.
* Kiểm tra xâm nhập và các kỹ thuật kiểm tra bảo mật khác kiểm tra xem bảo mật có thể bị vi phạm bằng cách dàn dựng các cuộc tấn công vào ứng dụng hay không. Các thử nghiệm này phát hiện các lỗ hổng bảo mật như XSS, SQL Injection.

#### Load Testing

* Nó được sử dụng để đo lường hiệu suất của ứng dụng dưới lưu lượng truy cập lớn hoặc dữ liệu.
* Các yêu cầu được đặt trên phần mềm vượt xa tải hoạt động bình thường và cách phần mềm phản hồi dưới tải này được theo dõi.

#### Dynamic Taint Analysis

* Phân tích ô nhiễm là việc theo dõi cách các đầu vào không an toàn được xử lý trong ứng dụng.
* Nó phân tích cách dữ liệu không an toàn (bị ô nhiễm) chảy qua và được xử lý bởi ứng dụng. Phương pháp này rất quan trọng để phát hiện các lỗ hổng bảo mật.

### 6.4. Dynamic Code Analysis Tools

<table><thead><tr><th width="168">Tên Công Cụ</th><th width="216">Ngôn Ngữ Hỗ Trợ</th><th>Tính Năng</th></tr></thead><tbody><tr><td>RattleSnake</td><td>Java, .NET, C++</td><td>Phát hiện rò rỉ bộ nhớ, lỗi tham chiếu con trỏ null và các lỗi liên quan đến bộ nhớ khác.</td></tr><tr><td>Valgrind</td><td>C, C++, Java, Python</td><td>Phát hiện rò rỉ bộ nhớ, lỗi hủy tham chiếu con trỏ null và các rò rỉ bộ nhớ khác, giám sát việc sử dụng bộ nhớ.</td></tr><tr><td>Sanitizer</td><td>C, C++</td><td>Phát hiện rò rỉ bộ nhớ, lỗi hủy tham chiếu con trỏ null và các rò rỉ bộ nhớ khác, giám sát việc sử dụng bộ nhớ.</td></tr><tr><td>Coverity Dynamic</td><td>C, C++, Java, Python</td><td>Phát hiện rò rỉ bộ nhớ, lỗi hủy tham chiếu con trỏ null và các rò rỉ bộ nhớ khác, giám sát việc sử dụng bộ nhớ.</td></tr><tr><td>Klocwork Dynamic</td><td>C, C++, Java, Ada, VHDL, Verilog</td><td>Phát hiện rò rỉ bộ nhớ, lỗi hủy tham chiếu con trỏ null và các rò rỉ bộ nhớ khác, giám sát việc sử dụng bộ nhớ.</td></tr><tr><td>Zephyr</td><td>Java</td><td>Phát hiện rò rỉ bộ nhớ, lỗi hủy tham chiếu con trỏ null và các rò rỉ bộ nhớ khác, giám sát việc sử dụng bộ nhớ.</td></tr><tr><td>JProbe</td><td>Java</td><td>Phát hiện các lỗi và lỗ hổng trong mã, tìm rò rỉ bộ nhớ và các lỗi liên quan đến bộ nhớ khác, đồng thời tối ưu hóa hiệu suất.</td></tr><tr><td>Intel VTune Amplifier</td><td>C, C++, Java, Python</td><td>Điều chỉnh hiệu suất, phân tích bộ nhớ, phân tích lập trình song song.</td></tr><tr><td>Perf</td><td>C, C++, Java, Python</td><td>Điều chỉnh hiệu suất, phân tích bộ nhớ.</td></tr></tbody></table>

**Kết luận**

Ngay cả phần mềm mà bạn phát triển và triển khai có thể hoạt động như phần mềm độc hại, ngay cả khi bạn không thiết kế nó để làm như vậy. Ví dụ: một lỗ hổng trong một ứng dụng mà bạn phát triển và chạy với quyền quản trị viên có thể trở thành một chức năng mà phần mềm độc hại sử dụng để nâng cao đặc quyền.

Phân tích mã tĩnh là kiểm tra mã nguồn mà không cần biên dịch hoặc chạy nó. Các công cụ được sử dụng trong quá trình này có thể xác định các lỗ hổng tiềm ẩn, các đoạn mã độc hại và các phương pháp mã hóa không phù hợp. Ví dụ: việc phát hiện các lỗ hổng phổ biến như tràn bộ đệm và SQL injection ngăn những kẻ tấn công sử dụng các lỗ hổng này để cài đặt phần mềm độc hại. Ngoài ra, phân tích mã chuyên sâu có thể phát hiện các chức năng độc hại hoặc cửa hậu.

Phân tích mã động được thực hiện tại thời gian chạy ứng dụng và giúp phát hiện hoạt động bất thường bằng cách theo dõi hành vi của phần mềm trực tiếp. Nó có thể theo dõi và phát hiện các hành vi phần mềm độc hại điển hình (ví dụ: lưu lượng mạng bất thường, thay đổi hệ thống tệp, thay đổi registry) hoặc phát hiện các lỗ hổng bảo mật có thể xảy ra tại thời gian chạy, chẳng hạn như hỏng dữ liệu thời gian chạy hoặc sửa đổi luồng thực thi.

Cả hai loại phân tích đều đóng một vai trò quan trọng trong việc ngăn chặn phần mềm độc hại. Phân tích mã tĩnh được sử dụng để bảo mật mã sớm trong quá trình phát triển, trong khi phân tích mã động được sử dụng để phát hiện các mối đe dọa bảo mật vẫn tồn tại sau khi phần mềm được phát hành hoặc trong quá trình sử dụng thực tế. Các loại phân tích này đóng vai trò là các phương pháp bổ sung để đảm bảo bảo mật phần mềm.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://viettaliii.gitbook.io/home/soc-and-dfir/dfir/reversing-malware.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
