• Chủ Nhật, 23/11/2008 08:15 (GMT+7)

    Kiểm tra tính toàn vẹn của file

    Việc làm sao để ứng dụng của bạn chạy trơn tru không gặp lỗi là hết sức quan trọng, tuy nhiên thật phiền toái nếu trong quá trình lưu trữ, ứng dụng của bạn bị nhiễm virus hay bị thay đổi về cấu trúc file... Để đả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.

    Lê Nguyên Dũng
    Email:
    dungcoivb@gmail.com
     

    ID: A0810_130
    File đính kèm