Normalize là quá trình cuối cùng trước khi dùng MD5 hash để chuyển đổi
các strand thành vector. Dây là quá trình tái đặt tên các các biến đã được sinh
ra bởi Vex-IR. Chúng tôi tiến hành thực hiện một quá trình gọi là "linear scan
renaming" (tạm dịch là tái đặt tên theo quét tuyến tính). Cụ thể, chúng tôi
duyệt qua mã nhị phân và theo đõi sự xuất hiện của các biến. Khi chúng ta gặp một biến mới, chúng ta đặt tên cho nó theo thứ tự xuất hiện (Hình 3.5).
t13 = CmpEQ64(0x4010,0x4010) t1 = CmpEQ64(0x4010,0x4010) t12 = 1Uto64(t13) t2 = 1Uto64(t1)
t14 = 64to1(t12) 13 = 64to1(t2)
Hình 3.5: Normalize
Việc tái đặt tên các biến theo thứ tự xuất hiện mang lại các lợi ích quan
trọng:
e Don giản hóa mã: Các tên biến ngắn gọn và tuân thủ theo thứ tự
xuất hiện giúp đơn giản hóa mã nhị phân. Khi đặt tên biến theo thứ
tự xuất hiện, chúng ta có một cấu trúc rõ ràng và dễ hiểu hơn, làm
cho mã trở nên dé đọc và xử lý hơn.
e Tăng tính nhất quán: Công việc tái đặt tên biến theo thứ tự xuất hiện đảm bảo tính nhất quán trong cách đặt tên biến trong mã. Mỗi biến
sẽ có một tên duy nhất và khác biệt, giúp tránh nhầm lẫn và xung đột tên biến.
e Hỗ trợ quá trình phân tích: Khi chúng ta tái đặt tên biến theo thứ tự xuất hiện, việc phân tích và hiểu mã nhị phân trở nên dễ dàng hơn. Các biến đặt tên theo thứ tự xuất hiện trong đoạn mã, giúp ta nhìn thấy sự liên quan và tương tác giữa chúng. Diều này hỗ trợ quá trình phân tích và trích xuất ngữ nghĩa.
Nếu không có quá trình này, tên các biến sẽ xuất hiện một các không có trật
tự trên Vex-IR, khiến cho việc xác định ngữ nghĩa cho 2 chức năng tương tự nhau gặp khó khăn, và giảm hiệu suất của phương pháp.
Cả 2 công việc tối ưu hóa trên là một phần rất quan trọng trong phương pháp bytes2vec của chúng tôi. Sau khi áp dụng các công việc này, những phần
dư thừa không phù hợp của Vex-IR sinh ra sẽ bị loại bỏ, từ đó giúp dé dàng trích xuất ngữ nghĩa hơn và tăng hiệu quả của phương pháp.
3.2.3. Lựa chon m6 hành học máu
Từ những tìm hiểu của mình, chúng tôi thấy rằng xử lý hình ảnh bằng học sâu CNN đã mang lại hiệu qua cao trong nhiều nghiên cứu. Do đó, trong nghiên cứu này, chúng tôi cũng áp dụng kiến trúc CNN vào việc phát hiện sự tương
đồng trong mã nhị phân. Đồng thời để nâng cao hiệu quả tốt nhất chúng tôi còn kết hợp CNN với GRU - một biến thể của RNN.
Mô hình học sâu của chúng tôi sử dụng một số lớp và kỹ thuật từ lĩnh vực
xử lý hình ảnh. Đặc biệt, chúng tôi sử dụng các lớp Conv2D để trích xuất các đặc trưng từ các vector đầu vào và lớp MaxPooling2D để giảm kích thước của các đặc trưng này. Bằng cách áp dụng các lớp này, chúng tôi có thể tận dụng các thông tin quan trọng và mối quan hệ không gian.
Dé làm cho dit liệu đầu vào phù hợp với mô hinhf, chúng tôi đã sử dụng lớp Reshape để chuyển đổi đầu vào từ 2 vector thành một định dạng có kích thước
(2, 512, 1). Điều này cho phép mô hình xem xét mã nhị phân như là các hình
ảnh với hai kênh và kích thước 512x1. Sau đó, lớp Conv2D với 16 bộ lọc và kích
thước kernel (1, 2) được áp dụng để trích xuất các đặc trưng của dữ liệu. Lớp MaxPooling2D sau đó được sử dụng để giảm kích thước của đặc trưng trích
xuất. Ở đây chúng tôi thêm 1 lớp Dropout 0.2 để tránh overfitting.
Tiếp theo, mô hình áp dụng lớp Conv2D khác với 8 bộ lọc và kích thước kernel
(1, 2) để tiếp tục trích xuất đặc trưng. Lại một lần nữa, lớp MaxPooling2D và Dropout 0.2 được sử dụng để giảm kích thước.
Một lớp Flatten được sử dụng để làm phẳng dữ liệu, chuẩn bị cho việc đưa
vào các lớp Fully Connected. Đồng thời, lớp RNN-GRU có nhiệm vụ nhận đầu vào là dữ liệu tuần tự có kích thước (2, 512) và thực hiện việc xử lý dựa trên nguyên tắc của mạng GRU.Đầu ra của lớp GRU và đầu ra của lớp Flatten được kết hợp thông qua lớp Concatenate, tạo thành một vectơ đặc trưng kết hợp
Cuối cùng vector đặc trưng này được dua qua 2 lớp Fully Connected với lần
lượt 64 đơn vị và 2 đơn vị để đưa ra dự đoán xác suất đầu ra. Giữa 2 lớp này chúng tôi cũng thêm 1 lớp Dropout 0.5 lần nữa để tránh việc overfitting.
Để đễ dàng hơn cho việc hiểu mô hình, chúng tôi tóm tắc lại các lớp trong
hình 3.6.
input_1 input: | [(None, 2, 512)]
| InputLayer | output: | [(None, 2, 512)]
reshape input: | (None, 2, 512)
(None, 2, 512, 1) Reshape | output:
conv2d | input: (None, 2, 512, 1) gru input: | (None, 2, 512)
Conv2D | output: | (None, 1, 510, 16) GRU | output: (None, 3)
MaxPooling2D | output: | (None, 1, 255, 16)
dropout | input: | (None, 1, 255, 16) |
(None, 1, 255, 16) Dropout
(None, 1, 255, 16) (None, 1, 253, 8)
max _pooling2d_1 MaxPooling2D
(None, 1, 253, 8) (None, 1, 126, 8)
dropout_1 (None, 1, 126, 8)
(None, 1, 126, 8) (None, 1008)
[(None, 1008), (None, 3)]
(None, 1011)
concatenate
Concatenate | output:
| dense | input: | (None, 1011) |
output: (None, 64) |
| Dense
dropout_2 | input: | (None, 64) Dropout | output: | (None, 64)
Dense | output: | (None, 2)