phungvinhquang
Thành viên mới
- Tham gia
- 12/3/07
- Bài viết
- 38
- Được thích
- 12
* Mình có ý định viết một Macro để diệt virus StartUp. Minh đã viết được vài đoạn về cơ bản là xong, nhưng nó không hoạt động theo ý mình. Mình post lên để xin ý kiến và nhờ mọi người giúp mình hoàn thiện.
* Mô tả sơ qua cách hoạt động của macro StartUp:
- Khi người dung mở một file nhiễm virus này thì nó sẽ sinh 1 file tên là StartUp.xls chứa trong folder “C:\Documents and Settings\Administrator\Application Data\Microsoft\Excel\XLSTART”. Trong file này có module tên startup. Khi đó máy bị nhiễm virus startup
- Sau khi người dung mở một file excel lên thì file se bị đính module tên startup
* Phương án xử lý của mình như sau:
- Tao một file excel cũng có tên startup.xls chép vào đường dẫn nêu trên (để virus không thể chép file lên đó được
- Trong file cũng có một module tên là Del_StartUp làm công việc sau: khi phát hiện 1 file excel được mở, nó sẽ kiểm tra xem file này có chứa module StartUp không (dấu hiệu để nhận diện file bị lây nhiểm). Nếu có module này thì xóa nó, nếu không thì thôi
* Dưới đây là code: (mình có cóp nhặt mốt số đoạn code tham khảo trên diễn đàn, nhưng không nhớ tên – Xin lỗi mọi người nha)
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘Hàm chính
Sub Autpen()
Dim SheetOpened_name As String
On Error Resume Next
If ActiveWorkbook.Name = "StartUp" Then
ActiveWindow.Visible = False
End If
If Not TrustAccess_chked Then
MsgBox "Hay truy cap menu Tools > Macro > Security > Trusted Puplisher " & _
"va click vao dong [Trusted access to Visual Basic Projec]. " & _
"Sau do chay lai macro nay"
Exit Sub
End If
SheetOpened_name = ActiveWorkbook.Name
If found_StartUp_Mod(SheetOpened_name) Then
Del_Module "StartUp", SheetOpened_name
End If
End Sub
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘hàm này kiểm tra xem workbook mới mở có chứa module StartUp không
Function found_StartUp_Mod(SheetOpened_name As String) As Boolean
found_StartUp_Mod = Workbooks(SheetOpened_name).Sheets(1).Name = "StartUp"
End Function
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘hàm này xóa module StartUp
Sub Del_Module(Module_name As String, Workbook_name As String)
Dim vbCom As Object
MsgBox "Xoa Module " & Module_name & " trong workbook " & ActiveWorkbook.Name
Set vbCom = Application.VBE.ActiveVBProject.VBComponents
vbCom.Remove VBComponent:=vbCom.Item(Module_name)
End Sub
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘Hàm này kiểm tra xem [Trusted access to Visual Basic Project] có được check chưa
‘nếu chưa check thì trả về false và ngược lại
Function TrustAccess_chked() As Boolean
Dim VBC As Object
TrustAccess_chked = True
Application.DisplayAlerts = False
On Error GoTo Err
Set VBC = ActiveWorkbook.VBProject.VBComponents.Item(1)
On Error GoTo 0
Application.DisplayAlerts = True
Exit Function
Err: TrustAccess_chked = Not VBC Is Nothing
End Function
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
2/. Chú ý trong hàm Del_module, dòng lệnh Application.VBE.ActiveVBProject.VBComponents
Như vậy dòng lệnh này chỉ thực hiện với Project hiện hành (chính là Project của mình) mà không tác động đến các file nhiễm.
Vậy làm sao tác động đến Project không hiện hành?
Mình đã thử đặt module của minh là StartUp thì nó bị xóa, nhưng file nhiểm thì bình an vô sự.
3/. Mình tạo ra một file “chuột bạch” bằng cách chép module StartUp của virus vào thì code của minh không phát hiện. Ly do là thế này, các bạn lưu ý hàm found_StartUp_Mod có đoạn Workbooks(SheetOpened_name).Sheets(1).Name, nếu là file nhiễm bệnh thì biểu thức này trả về tên module (luc này excel xem module StartUp như 1 sheet). Nhưng đối với “chuột bạch” thì excel không xem module StartUp mới gắn thêm vào như 1 sheet nên không lấy được tên module ra để so sánh
Tại sao?
- chuotbach_COTHE.xls có module StartUp (không còn khả năng lây nhiểm) CÓ THỂ bị StartUp.xls gỡ module
- chuotbach_KHONGTHE.xls có module StartUp (không còn khả năng lây nhiểm) KHÔNG THỂ bị StartUp.xls gỡ module
- chương trình của mình chưa hoàn thiện nên để test tính chất 2 file …COTHE và …KHONGTHE nhằm làm rõ vướng mắc 3, mình có viết them sub test_tinhtrang_chuotbach
Sub test_tinhtrang_chuotbach()
Dim count_sht As Integer
count_sht = ActiveWorkbook.Sheets.Count
MsgBox ActiveWorkbook.Name
MsgBox count_sht
For i = 1 To count_sht
MsgBox ActiveWorkbook.Sheets(i).Name
Next i
End Sub
Khi chay code trên thi kết quả sẽ khac nhau mặc dù nhìn 2 file giống nhau
* Mô tả sơ qua cách hoạt động của macro StartUp:
- Khi người dung mở một file nhiễm virus này thì nó sẽ sinh 1 file tên là StartUp.xls chứa trong folder “C:\Documents and Settings\Administrator\Application Data\Microsoft\Excel\XLSTART”. Trong file này có module tên startup. Khi đó máy bị nhiễm virus startup
- Sau khi người dung mở một file excel lên thì file se bị đính module tên startup
* Phương án xử lý của mình như sau:
- Tao một file excel cũng có tên startup.xls chép vào đường dẫn nêu trên (để virus không thể chép file lên đó được
- Trong file cũng có một module tên là Del_StartUp làm công việc sau: khi phát hiện 1 file excel được mở, nó sẽ kiểm tra xem file này có chứa module StartUp không (dấu hiệu để nhận diện file bị lây nhiểm). Nếu có module này thì xóa nó, nếu không thì thôi
* Dưới đây là code: (mình có cóp nhặt mốt số đoạn code tham khảo trên diễn đàn, nhưng không nhớ tên – Xin lỗi mọi người nha)
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘Hàm chính
Sub Autpen()
Dim SheetOpened_name As String
On Error Resume Next
If ActiveWorkbook.Name = "StartUp" Then
ActiveWindow.Visible = False
End If
If Not TrustAccess_chked Then
MsgBox "Hay truy cap menu Tools > Macro > Security > Trusted Puplisher " & _
"va click vao dong [Trusted access to Visual Basic Projec]. " & _
"Sau do chay lai macro nay"
Exit Sub
End If
SheetOpened_name = ActiveWorkbook.Name
If found_StartUp_Mod(SheetOpened_name) Then
Del_Module "StartUp", SheetOpened_name
End If
End Sub
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘hàm này kiểm tra xem workbook mới mở có chứa module StartUp không
Function found_StartUp_Mod(SheetOpened_name As String) As Boolean
found_StartUp_Mod = Workbooks(SheetOpened_name).Sheets(1).Name = "StartUp"
End Function
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘hàm này xóa module StartUp
Sub Del_Module(Module_name As String, Workbook_name As String)
Dim vbCom As Object
MsgBox "Xoa Module " & Module_name & " trong workbook " & ActiveWorkbook.Name
Set vbCom = Application.VBE.ActiveVBProject.VBComponents
vbCom.Remove VBComponent:=vbCom.Item(Module_name)
End Sub
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘Hàm này kiểm tra xem [Trusted access to Visual Basic Project] có được check chưa
‘nếu chưa check thì trả về false và ngược lại
Function TrustAccess_chked() As Boolean
Dim VBC As Object
TrustAccess_chked = True
Application.DisplayAlerts = False
On Error GoTo Err
Set VBC = ActiveWorkbook.VBProject.VBComponents.Item(1)
On Error GoTo 0
Application.DisplayAlerts = True
Exit Function
Err: TrustAccess_chked = Not VBC Is Nothing
End Function
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
- Vướng mắc:
2/. Chú ý trong hàm Del_module, dòng lệnh Application.VBE.ActiveVBProject.VBComponents
Như vậy dòng lệnh này chỉ thực hiện với Project hiện hành (chính là Project của mình) mà không tác động đến các file nhiễm.
Vậy làm sao tác động đến Project không hiện hành?
Mình đã thử đặt module của minh là StartUp thì nó bị xóa, nhưng file nhiểm thì bình an vô sự.
3/. Mình tạo ra một file “chuột bạch” bằng cách chép module StartUp của virus vào thì code của minh không phát hiện. Ly do là thế này, các bạn lưu ý hàm found_StartUp_Mod có đoạn Workbooks(SheetOpened_name).Sheets(1).Name, nếu là file nhiễm bệnh thì biểu thức này trả về tên module (luc này excel xem module StartUp như 1 sheet). Nhưng đối với “chuột bạch” thì excel không xem module StartUp mới gắn thêm vào như 1 sheet nên không lấy được tên module ra để so sánh
Tại sao?
- File đính kèm:
- chuotbach_COTHE.xls có module StartUp (không còn khả năng lây nhiểm) CÓ THỂ bị StartUp.xls gỡ module
- chuotbach_KHONGTHE.xls có module StartUp (không còn khả năng lây nhiểm) KHÔNG THỂ bị StartUp.xls gỡ module
- chương trình của mình chưa hoàn thiện nên để test tính chất 2 file …COTHE và …KHONGTHE nhằm làm rõ vướng mắc 3, mình có viết them sub test_tinhtrang_chuotbach
Sub test_tinhtrang_chuotbach()
Dim count_sht As Integer
count_sht = ActiveWorkbook.Sheets.Count
MsgBox ActiveWorkbook.Name
MsgBox count_sht
For i = 1 To count_sht
MsgBox ActiveWorkbook.Sheets(i).Name
Next i
End Sub
Khi chay code trên thi kết quả sẽ khac nhau mặc dù nhìn 2 file giống nhau
- Mong mọi người tham khảo và cho mình ý kiến. Rất cảm ơn