CHƯƠNG 2. CƠ SỞ LÝ THUYET
2.1. Các thành phần liên quan đến tập tin nhị phân
2.1.3. Biểu dé luồng điều khiển - Control flow graph
Control Flow Graph (CFG) là một biểu đồ đại diện cho cấu trúc điều khiển của một chương trình máy tính. Nó biểu thị các luồng thực thi của chương trình
từ các câu lệnh và điều kiện điều khiển. CFG được sử dung trong phân tích và kiểm tra mã nguồn để hiểu cấu trúc logic của chương trình.
Trong một CFG, các câu lệnh trong chương trình được biểu diễn dưới dạng
các nút (nodes), trong đó mỗi nút đại điện cho một câu lệnh hoặc một basic
block. Các nút được kết nối bởi các cạnh (edges), biểu thị các quan hệ luồng đi giữa các nút. Các cạnh có thể được đánh số hoặc gán các nhãn để đại diện cho điều kiện điều khiển (như "if", "else", "while",...).
Trong phát hiện sự tương đồng trong mã nhị phân, CFG được sử dụng để so sánh cấu trúc điều khiển của các chương trình khác nhau và xác định sự tương
đồng giữa chúng. Các phương pháp phát hiện sự tương đồng thường dựa trên việc so sánh các đặc trưng của CFG, quan hệ điều khiển và đường đi thực thi. Thông qua CFG, có thể xác định sự tương đồng giữa các chương trình nhị phân, phát hiện mã độc hoặc nhận diện các mẫu tấn công trong mã nhị phân. CFG cũng cung cấp một cách để phân tích và tối ưu hóa mã nhị phân, giúp tăng hiệu suất và đảm bảo khả năng bảo mật của các chương trình.
* Program
x=z-2;
y=2*z;
if(©) {
x=xt1;
y=ytl,
}
else {
x=x-l;
yay
}
LỆ Psa21
Hình 2.3: Ví dụ vé một đoạn chương trình uới CFG tương ứng
2.1.4. Strand
Nghiên cứu này của chúng tôi, sử dụng khái niệm về các Strand, một đơn vị
cơ bản được giới thiệu trong [1], đây là khái niệm có vai trò quan trọng trong phương pháp trích xuất và phân tích mã nhị phân này. Strand là một tập hợp các câu lệnh liên quan nhau mà khi kết hợp lại, chúng sẽ tạo thành một chuỗi
hoàn chỉnh thực hiện một nhiệm vụ nào đó trong chương trình.
Mỗi Strand trong chương trình có nhiệm vụ tính toán giá trị của một biến
nhất định. Bằng cách xem xét các Strand riêng biệt, chúng tôi có thể nắm bắt được các phụ thuộc dữ liệu và luồng điều khiển cụ thể liên quan đến biến đó. Điều này cho phép chúng tôi hiểu rõ hơn về cách các biến được sử dụng và thay
đổi trong chương trình.
Với việc ấp dụng khái niệm về Strand vào nghiên cứu, chúng tôi hy vọng xây dung một phương pháp trích xuất thông minh và mạnh mẽ, cho phép chúng tôi khám phá và nắm bắt tốt hơn về cấu trúc và chức năng của các chương trình
mã nhị phan.
2.1.5. Decompiler
Một decompiler là một công cu phần mềm có khả năng chuyển đổi mã máy (bytes code) thành mã nguồn có cấu trúc cao hơn, chẳng hạn như mã assembly. Việc sử dung decompiler có thể giúp phân tích và nằm bắt rõ hơn về chức năng
và logic của một chương trình đã được biên dịch. Hiện nay có rất nhìu decompiler
khác nhau như: IDA, Ghidra, Radare2, RetDec,...
Thong thường các decompiler có thể có các công dụng như sau:
e Trích xuất chức năng: Decompiler cho phép chuyển đổi mã máy không cấu trúc thành dạng mã có cấu trúc ( thường là assembly), giúp dễ dàng hiểu và phân tích các chức năng trong mã nhị phân.
e Tìm lỗi và sửa chữa: Decompiler hữu ích trong việc phát hiện và sửa
chữa các chương trình bị hỏng hoặc lỗi. Bằng cách chuyển đổi mã máy thành mã nguồn có cấu trúc, người phát triển có thể hiểu rõ hơn về
lỗi. Hơn nữa decompiler cho phép sửa chửa các bytes code trực tiếp lên chương trình nên sẽ dễ dàng sửa lỗi.
e Phân tích mã độc: Decompiler có thể dùng để phân tích mã độc với
khả năng để phát hiện và loại bỏ các phần tử gây hại trong chương
trình.
e Tương tác với phần mềm: Thông thường các decompiler hiện đại cũng cho phép việc gỡ lỗi trực tiếp chương trình.
2.1.5.1. IDA
Ỏ nghiên cứu này, chúng tôi cần sử dụng decompiler để trích xuất các địa chi
của các chức năng trong tập tin nhị phan, từ đó trích xuất ra các bytes code
của các chức năng đó.
Để phục vụ cho yêu cầu này, chúng tôi quyết định chọn IDA để thực hiện, ngoài là công cu decompiler quen thuộc thi IDA có các ưu điểm:
e Khả năng hỗ trợ nhiều kiến trúc: IDA hỗ trợ nhiều kiến trúc xử lý
khác nhau, cho phép phân tích mã nhị phân trên các nền tảng khác nhau như x86, ARM, MIPS và nhiều hơn nữa. Diều này đảm bảo rằng chúng tôi có thể phan tích và trích xuất thông tin từ các tập tin nhị
phân đa dạng.
e Dễ sứ dung: IDA có giao diện đồ hoa thân thiện và dé sử dụng, giúp chúng tôi dễ dàng tìm hiểu và thao tác với công cụ. Các tính năng
và chức năng được tổ chức một cách rõ ràng, cho phép chúng tôi dễ
đàng thao tác và điều hướng trong quá trình phân tích mã nhị phân.
e Tính linh hoạt và mở rộng: IDA cung cấp các khả năng mở rộng và plugin, cho phép chúng tôi tùy chỉnh và mở rộng khả năng của công
cụ để phù hợp với nhu cầu cụ thể của chúng tôi. Đặc biệt IDA còn cung cấp bộ API với tập hợp các hàm cho phép chúng tôi tương tác với IDA từ các chương trình bên ngoài. Bằng cách sử dụng IDA API,
chúng tôi có thể tự động hóa các tác vụ phân tích và trích xuất cho
công cụ của mình.
e Hỗ trợ phân tích động: Ngoài việc phân tích tĩnh, IDA cũng cung cấp
khả năng phân tích động. Diều này cho phép chúng tôi xem các giá trị biến, theo đõi luồng điều khiển, và thậm chí thực hiện gỡ rối trong
quá trình phân tích mã nhị phãn.
e Cộng đồng và tài liệu phong phú: IDA có một cộng đồng người dùng lớn, cung cấp sự hỗ trợ và tài liệu phong phú. Diều này giúp chúng tôi dé dàng xử lí khi gặp van dé.
2.1.5.2. IDA Python API
IDA Python API là một thành phan quan trong trong hệ thống IDA, nó cung
cấp một giao diện lập trình cho phép tương tác và mở rộng IDA bằng ngôn ngữ
Python. Với IDA Python API, chúng tôi có khả năng tự động hóa các tác vụ
phân tích các tập tin nhị phân trong nghiên cứu của mình.
Một số điểm nổi bật về IDA Python API:
e Truy cập thông tin trong tập tin nhị phân: IDA Python API cho phép
chúng tôi cập và trích xuất thông tin về các thành phần trong tập tin nhị phân như các chức năng, basie block, địa chỉ,.. bằng cách sử dụng các hàm như get_ func_ name(), get_ func_ offset(), get_operand_ value get_ segm_ start()....
e Khả năng tự động hóa : Với IDA Python API, chúng tôi có thể các tác
vụ phân tích tập tin nhị phân một cách tự động thông qua sử dụng
các hàm như analyze_ area(), auto_ wait(), wait_ for sync()
e Tích hợp với các công cụ khác: Bằng cách sử dụng các giao thức và
hàm liên kết IDA Python API có thể tích hợp IDA với các công cụ khác . Điều này rất giúp ích cho chúng tôi trong việc xây dựng công
cụ hoàn chỉnh trong phương phấp này.