c. Đưa ra dạng nhị phân của 2 tệp trên.
3.2.4. Tệp AIS_DOS2.PAS:
Input:
− Tệp dữ liệu KDD 99 chỉ chứa các cuộc tấn công DOS (KDD_DOS.INP)
− Thuộc tính, số các giá trị khác nhau, số bit cần dùng, dãy nhị phân tương ứng với giá trị khác nhau trong thuộc tính. (Bin_Dos.out)
Output: Tệp KDD chỉ chứa cuộc tấn công DOS đã ở dạng nhị phân (binary.out) Chương trình thực hiện: KDD_DOS.INP:http://www.mediafire.com/?undefined Bin_Dos.out:http://www.mediafire.com/?i16z71hbslybuty Kết quả: binary.out: http://www.mediafire.com/?undefined 3.2.5. Tệp AIS_DOS3.PAS Input:
− Tệp dữ liệu KDD 99 đã đánh dấu các cuộc tấn công DOS (Test1.inp)
− Thuộc tính, số các giá trị khác nhau, số bit cần dùng, dãy nhị phân tương ứng với giá trị khác nhau trong thuộc tính. (Bin_Dos.out)
Output: Tệp dữ liệu KDD đã có cấu trúc. (test2.out) Chương trình thực hiện:
Test1.inp:http://www.mediafire.com/?e1w4rjprhu2xrpk
Bin_Dos.out:http://www.mediafire.com/?i16z71hbslybuty
Kết quả:
test2.out: http://www.mediafire.com/?mk8q6gviicl7sdq
3.3. Sinh tập bộ dò Aself từ tệp nhị phân chỉ chứa tấn công DOS
Tư tưởng: Ta sử dụng bảng A kiểu boolean có n hàng và m cột với: n = 2r và m = L – r + 1
Trong đó:
− A[i, j] = 1: đoạn bit từ bit j đến bit thứ j + r – 1 có giá trị là i trong hệ cơ số 10. − A[i, j] = 0: trong trường hợp ngược lại.
Bảng A được xây dựng bằng cách đọc lần lượt các đoạn r bit liên tiếp của chuỗi self rồi tính giá trị thập phân của đoạn bit đó và điền A[i, j] tương ứng có giá trị bằng 1.
Ví dụ:
Với các chuỗi self sau:
01011 11001 01010 10110 00101 Ta có L = 5 và chọn r = 3. Vì vậy: Số dòng của bảng A: n = 2r = 23 = 8 Số cột của bảng A: m = L - r + 1 = 5 - 3 + 1 = 3 Ta xây dựng được bảng A như sau:
1 2 3 0 0 0 0 1 1 0 1 2 1 1 1 3 0 1 1 4 0 1 0 5 1 1 1 6 1 0 1 7 0 0 0 Xét chuỗi 1: s1 = 01011
− Với j = 1: ta có đoạn bit 010 (010)2 = (2)10 Vậy A[2, 1] = 1 − Với j = 2: ta có đoạn bit 101
(101)2 = (5)10 Vậy A[5, 2] = 1 − Với j = 3: ta có đoạn bit 011
(011)2 = (3)10 Vậy A[3, 3] = 1 Xét chuỗi 2: s2 = 11001
− Với j = 1: ta được đoạn bit 110 (110)2 = (6)10 Vậy A[6, 1] = 1 − Với j = 2: ta được đoạn bit 100
(100)2 = (4)10 Vậy A[4, 2] = 1 − Với j = 3: ta có đoạn bit 001
(001)2 = (1)10 Vậy A[1, 3] = 1 Xét chuỗi 3: s3 = 01010
− Với j = 1: ta có đoạn bit 010 (010)2 = (2)10
Ta thấy rằng A[2, 1] đã nhận giá trị là 1, do vậy đoạn bit 010 ở vị trí thứ 1 đã trùng với đoạn bit ở vị trí thứ 1 của một chuỗi trước đó. Vậy nên ta đã loại được các bit giống nhau.
− Với j = 2: ta được đoạn bit 101 (101)2 = (5)10
Ta thấy rằng A[5, 1] đã nhận giá trị là 1, do vậy đoạn bit 010 ở vị trí thứ 2 đã trùng với đoạn bit ở vị trí thứ 2 của một chuỗi trước đó. Vậy nên ta đã loại được các bit giống nhau.
− Với j = 3: ta được đoạn bit 010 (010)2 = (2)10 Vậy A[2, 3] = 1
Thực hiện tương tự với hai chuỗi còn lại ta sẽ thu được kết quả là bảng A ở trên.
Nhận xét:
Kích thước của bảng A phụ thuộc vào độ dài lớn của l và r. Với các ứng dụng thực tế thì hoàn toàn có thể lưu A ở bộ nhớ trong [2].
Các chuỗi bit có đoạn r bit tương ứng giống nhau sẽ tự động được loại bỏ vì ta chỉ cần biết đoạn bit đó nằm ở vị trí nào và có giá trị trong hệ 10 là bao nhiêu, ta lưu những đoạn trùng lặp nên tối ưu về bộ nhớ.
Vì A là bảng 2 chiều, được lưu trữ trên bộ nhớ trong nên việc truy cập đến phần tử A[i,j] chỉ mất thời gian là O(1). Dù dữ liệu bảo vệ có thay đổi, rất lớn đi nữa thì ta vẫn chỉ cần một bảng A kích thước cố định 2r dòng, (L - r + 1) cột.
Chương trình KDD_DOS với nút lệnh Aself thực hiện chức năng tạo bộ dò sử dụng bảng băm với ý tưởng như trên (R=10, L = 167):
Private Sub makedetec() Dim i, j, k As Long Dim str As String
Open "C:\AIS_GridComputing\binary.out" For Input As #1 For i = 1 To Rows Line Input #1, str For j = 1 To L - R + 1 k = BtoD(str, j) Aself(k, j) = 1 Next Next Close #1 End Sub
Public Function BtoD(ByVal s As String, ByVal k As Integer) As Long Dim i As Integer Dim s1 As String * 1 Dim m As Long m = 0 For i = k To (R - 1 + k) m = m * 2 s1 = Mid(s, i, 1) If (s1 = "1") Then m = m + 1 End If Next BtoD = m End Function
Dim i, j As Long For i = 0 To R2 - 1 For j = 1 To L - R + 1 Aself(i, j) = 0 Next Next makedetec For i = 0 To R2 - 1 For j = 1 To L - R + 1
Txt1 = Txt1 & Aself(i, j) & " " Next
Txt1 = Txt1 & Chr(13) & Chr(10) Next
MsgBox "Bang A gom " & R2 & " dong va " & L - R + 1 & " cot", vbOKOnly, "Aself"
End Sub
Sau khi thực hiện nút lệnh Aself, trên màn hình xuất hiện bảng thông báo: “Bảng A với R =10, L = 167 gồm 1024 dòng và 158 cột”. Bảng A được lưu lại để thực hiện chương trình tiếp theo là kiểm tra xem số bản ghi chứa tấn công DOS trong tệp KDD có cấu trúc.
Hình 3.1 Giao diện chương trình khi thực hiện nút lệnh Aself
3.4. Kiểm tra kết quả
Theo như chương trình chúng ta thực hiện tại mục 3.1 thì đã có thể biết là có bao nhiêu cuộc tấn công DOS dựa vào thuộc tính số 41, tuy nhiên để kiểm tra con số này đã thật sự chính xác hay chưa ta có thể áp dụng phương pháp dò sử dụng bảng băm đã tạo ra ở mục trên đối với tệp KDD đã được xử lí nhị phân và đánh dấu những cuộc tấn công DOS.
Chúng ta kiểm tra xem trong tệp KDD có cấu trúc: phát hiện được bao nhiêu bản ghi chứa tấn công DOS, bao nhiêu bản ghi chứa tấn công DOS mà không phát hiện được, bao nhiêu bản ghi không chứa tấn công DOS mà phát hiện nhầm là DOS. Chương trình KDD_DOS được thực hiện bằng nút lệnh Test sử dụng kết quả nút
lệnh Aself vừa được thực hiện tại mục 3.3: Private Sub cmdTest_Click()
Dim i, j, k As Long Dim d1, d2, d3 As Long Dim str As String
Dim markdos As Boolean
Open "C:\AIS_GridComputing\test2.out" For Input As #2 d1 = 0 'so dos ko dem duoc
d2 = 0 ' so ko phai dos dem la dos d3 = 0 'so dos dem duoc
i = 0 Do While i < 885479 markdos = False Line Input #2, str If Len(str) = 1 Then Line Input #2, str i = i + 1 markdos = True End If
If markdos = True Then For j = 1 To L - R + 1 k = BtoD(str, j) If Aself(k, j) = 0 Then d1 = d1 + 1 j = L End If Next If j < L Then d3 = d3 + 1 End If End If
If markdos = False Then For j = 1 To L - R + 1 k = BtoD(str, j) If Aself(k, j) = 0 Then j = L End If Next
If j < L Then d2 = d2 + 1 End If End If i = i + 1 Loop Close #2
'MsgBox "d3: d1: d2 " & Chr(13) & d3 & ":" & d1 & ":" & d2
MsgBox "Tan cong DOS phat hien duoc: " & Format(d3 / DOS * 100, "##0.0#") & " %" & " (" & d3 & " ban ghi) " & Chr(13) & "Tan cong DOS khong phat hien duoc: " & Format(d1 / DOS * 100, "##0.0#") & "%" & " (" & d1 & " ban ghi) " & Chr(13) & "So ban ghi khong chua tan cong DOS phat hien la DOS: " & d2 & " ban ghi", vbOKOnly, "KET QUA"
End Sub
Sau khi thực hiện nút lệnh Aself, ta nhấn nút lệnh Test để bắt đầu kiểm tra.
Hình 3.2. Giao diện chương trình khi thực hiện nút lệnh Test
Phần cài đặt chương trình KDD_DOS cho mục 3.3 và 3.4 có thể xem tại:
Với kết quả test như trên ta thấy tỉ lệ lỗi False Positive thực sự rất ấntượng là 6/4898431~1,2 x 10-6. Đây là tỉ lệ rất thấp mà chưa thấy phương