Để đảm bảo an toàn và tính toàn vẹn của ứng dụng, người ta đính kèm thêm các mã CRC (Cyclic Redundancy Check), MD (Message Digest) hay SHA (Secure Hash Algorithm).
Làm sao để chương trình khi thực thi tự kiểm tra tính toàn vẹn của nó? Bài viết này sẽ đưa ra hướng giải quyết khá đơn giản. Ở đây tôi sử dụng ngôn ngữ Visual Basic 6 để minh hoạ.
Như bạn biết, việc virus chèn thêm dữ liệu vào cuối file, hay sửa chữa cấu trúc file sẽ thay đổi mã MD của cả file đó.
Thao tác mấu chốt cũng là vấn đề làm sao lưu trữ được mã MD - ở đây tôi sử dụng mã MD5 - vào trong file mà khi thực thi, chúng ta có thể kiểm tra.
Chúng ta không thể đơn giản đưa mã MD5 đó trực tiếp vào trong mã lệnh, vì mã này của cả file chỉ biết được sau khi thực thi, đồng nghĩa với mỗi chuỗi bạn nhập vào biến lưu MD5 lại tạo một mã MD5 mới. Nên việc này là gần như không khả thi (thực ra vẫn có thể thực hiện tuy nhiên rất phức tạp).
Vì vậy, chúng ta sẽ sử dụng một cách thức khác, đó là lưu mã này vào cuối file, rồi chỉ lấy mã MD5 của chuỗi bắt đầu từ Byte đầu tiên của file đến một vị trí nhất định mà thôi, phần lưu trữ mã MD5 sẽ không được xét đến. Điều này làm quá trình kiểm tra mã MD5 trở nên chính xác.
Đây là hình vẽ của quá trình thay đổi cấu trúc file:
Khi ứng dụng làm việc, chúng ta kiểm tra mã MD5 trong lúc thực thi xem có khác biệt với mã MD5 lưu ở cuối file hay không để kiểm tra tính toàn vẹn.
Để thực hiện việc này, chúng ta cần tạo thêm một ứng dụng nhỏ để thực hiện việc chèn dữ liệu vào chương trình và viết thêm một đoạn mã để ứng dụng tự kiểm tra.
Bạn có thể tham khảo chương trình mẫu đi kèm bài viết (hoặc tải về tại http://dungnguyenle.googlepages.com/SourceMD5Check.zip). Ở đây tôi chỉ xin giới thiệu 2 đoạn code chính.
Code 1: Chèn dữ liệu
Private Sub cmdMD5_Click()
Const Chuoi = "DungCoi-VirusVN.com"
If TonTai(txtPath) = True Then
Dim BoDem As String
Dim BoDem1 As String
Open txtPath For Binary As #1
BoDem = Space(LOF(1))
`Đặt dữ liệu của file vào biến BoDem
 |
Get #1, , BoDem
Dim ViTri As Double
ViTri = InStr(1, BoDem, Chuoi, vbBinaryCompare)
If ViTri = 0 Then
`Bien BoDem1 lưu dữ liệu file mới
BoDem1 = BoDem & Chuoi & MD5String(BoDem)
`Đặt dữ liệu mới vào file
Put #1, 1, BoDem1
MsgBox "Da hoan thanh"
Else
MsgBox "Du lieu da duoc ghi truoc day roi"
End If
Close #1
Else
MsgBox "File khong ton tai"
End If
End Sub
Private Function TonTai(filename) As Boolean
'Kiem tra tinh ton tai cua file
On Error GoTo ErrorHandler
TonTai = (Dir(filename) <> "")
Exit Function
ErrorHandler:
TonTai = False
End Function
Code 2: Kiểm tra
Private Sub Form_Load()
Const Chuoi = "DungCoi-VirusVN.com"
`Xác định đường dẫn
Dim PathMe As String
If Len(App.Path) <> 3 Then
PathMe = App.Path + "\" + App.EXEName + ".exe"
Else
PathMe = App.Path + App.EXEName + ".exe"
End If
`Đưa toàn bộ dữ lieu của file vào biến BoDem
Dim BoDem As String
Open PathMe For Binary As #1
BoDem = Space(LOF(1))
Get #1, , BoDem
Close #1
‘Lấy vị trí của Chuoi trong file
Dim ViTri As Double
ViTri = InStr(1, BoDem, Chuoi, vbBinaryCompare)
‘Nếu không tìm thây Chuoi trong file
If ViTri = 0 Then GoTo Sai
‘Kích thước file khác với kích thước file gốc + Độ dài chuoi + 32 byte của mã MD5
If Len(BoDem) <> ViTri + Len(Chuoi) + 31 Then GoTo Sai
‘Lấy mã MD5 từ cuối file
Dim MaMD5 As String
MaMD5 = Mid(BoDem, ViTri + Len(Chuoi), 32)
‘Tạo mã MD5 từ dữ liệu của file ban đầu (Phần file gốc)
Dim MaMD5Me As String
Dim strTmp As String
strTmp = Left(BoDem, ViTri - 1)
MaMD5Me = MD5String(strTmp)
If MaMD5 <> MaMD5Me Then
GoTo Sai
Else
MsgBox "Chuong trinh hop le", vbInformation, "Okie"
End If
Exit Sub
Sai:
MsgBox "Ma kiem tra chuong trinh bi sai, chuong trinh co the da bi nhiem virus hoac bi thay doi cau truc. Chuong trinh se tu ket thuc", vbCritical, "Bao dong"
End
End Sub
Bạn thực hiện các thao tác sau:
Bước 1: Biên dịch project có đoạn Code 2
Bước 2: Thực thi project có đoạn Code 1, nhập đường dẫn ứng dụng vừa được biên dịch vào TextBox rồi bấm chọn Ghi du lieu.
Sau đó ứng dụng khi thực thi sẽ tự nhận biết có bị nhiễm virus hay bất kỳ thao tác nào làm thay đổi file hay không.
Nguồn: PCWorld
3Cdotcom “Nhà cung cấp dịch vụ Hosting trực tiếp" www.hosting.net.vn