用VBS讀寫二進制文件的另一種方法分享

字號:


    雖然我沒有把那個程序解密出來(如果哪位真正的高手會,麻煩指點一下),但是從中領(lǐng)悟出了用VBS讀寫二進制文件的另一種方法,即Microsoft.XMLDOM+ADODB.Stream。這個方法的效率比原來那個高得多,而且似乎沒有文件大小限制
    之前寫的那篇給出的方法雖然不錯,但是當(dāng)文件過大時(其實很小,也就幾M),對應(yīng)的數(shù)組也會很大,然后會出現(xiàn)運行時錯誤,提示內(nèi)存耗盡,為此我郁悶了好久。
    最近在博客的流量記錄中發(fā)現(xiàn)百度關(guān)鍵字“一些很惡作劇的vbs程序”(看來現(xiàn)在的年輕人很喜歡玩這口),于是打開久違的百度搜索了一下,發(fā)現(xiàn)出現(xiàn)在第三。出現(xiàn)在第二的是百度HI,上面也是一個惡作劇程序,而且還是加密的。我嘗試著解密,卻發(fā)現(xiàn)這個加密似乎比前幾天解密的那個病毒更變態(tài),未果。
    雖然我沒有把那個程序解密出來(如果哪位真正的高手會,麻煩指點一下),但是從中領(lǐng)悟出了用VBS讀寫二進制文件的另一種方法,即Microsoft.XMLDOM+ADODB.Stream。這個方法的效率比原來那個高得多,而且似乎沒有文件大小限制。
    代碼如下:
    Function ReadBinary(FileName)
    Const adTypeBinary = 1
    Dim stream, xmldom, node
    Set xmldom = CreateObject("Microsoft.XMLDOM")
    Set node = xmldom.CreateElement("binary")
    node.DataType = "bin.hex"
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = adTypeBinary
    stream.Open
    stream.LoadFromFile FileName
    node.NodeTypedValue = stream.Read
    stream.Close
    Set stream = Nothing
    ReadBinary = node.Text
    Set node = Nothing
    Set xmldom = Nothing
    End Function
    函數(shù)的參數(shù)是要讀取的文件路徑,返回值是包含二進制文件的十六進制值的字符串。
    代碼如下:
    Sub WriteBinary(FileName, Buf)
    Const adTypeBinary = 1
    Const adSaveCreateOverWrite = 2
    Dim stream, xmldom, node
    Set xmldom = CreateObject("Microsoft.XMLDOM")
    Set node = xmldom.CreateElement("binary")
    node.DataType = "bin.hex"
    node.Text = Buf
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = adTypeBinary
    stream.Open
    stream.write node.NodeTypedValue
    stream.saveToFile FileName, adSaveCreateOverWrite
    stream.Close
    Set stream = Nothing
    Set node = Nothing
    Set xmldom = Nothing
    End Sub
    第一個參數(shù)是要讀入的文件路徑,第二個參數(shù)是包含二進制文件的十六進制值的字符串。至于如何獲得二進制文件的十六進制值,那方法就很多了,最簡單的方法當(dāng)然就是用fso對象將ReadBinary函數(shù)的返回值寫到文本文件中去,然后Ctrl+C,Ctrl+V。其實用十六進制工具也很簡單。
    其他的就不多說了,看不懂的多看看MSDN參考文檔。寫了一個示例程序,里面包含了天空之城音樂的所有數(shù)據(jù),雙擊后在同一文件夾生成天空之城的MP3文件并播放。