原始出處:http://www.cnblogs.com/Charltsing/p/EncryptVBACode.html
VBA代碼加密是個老生常談的問題,自從本人的VBA Dumper發布之后,在Office層面上做任何加密都已經失去了意義。所以,很多人開始轉戰VB封裝或者升級到VSTO,Delphi等其他語言。但是,對於廣大的VBAer來說,重新學一門語言帶來的麻煩要遠遠超過開發VBA程序所帶來的收益。所以,是否能有一種辦法在不改變VBA代碼的情況下,將VBA代碼脫離office進行加密呢?
考慮到office支持COM插件,那么是否能夠通過外接插件完成VBA代碼文件的動態解密,實時插入,實時運行,完畢刪除這一系列保護代碼的動作呢。這樣,VBA代碼不會與office文件存在一處,就可以有充分的手段對VBA明文代碼進行加密了。
本人在去年開發了VBA智能排版插件Smart Indenter for VBE,那么我就利用這個插件,完成了上述功能。
使用方法很簡單:
參考下面的代碼調用加密的VBA代碼文件即可,支持Sub和Function,默認支持五個參數,支持不定參數。
'密文Function測試 Public Sub SampleEncryptVBA() Dim oAdd As Object, obj As Variant Dim modulename$, vbafilefullpath$, ret '建立VBA動態調用 On Error Resume Next Set oAdd = GetObject(, "SmartIndenterVBE.Connect") If Err <> 0 Then MsgBox "請按Alt-F11進入一次VBE之后再運行宏!" End End If Set obj = oAdd.Instance Call obj.SetExcelApp(Application) '要運行的代碼文件 vbafilefullpath = ThisWorkbook.Path & Application.PathSeparator & "Encryptedemo.txt" 'RunVBAFunction是運行VBA函數,參數:文件名,文件密鑰,文件編碼,函數名,函數參數1,函數參數2,函數參數3...(超過五個請使用不定參數) ret = obj.RunVBAFunction(vbafilefullpath, "abc", True, "ReturnRangeValue", Range("A1")) MsgBox ret End Sub
功能說明:
1、 此功能只是VBA加密的一個思路,供大家參考。VBA代碼要正確編寫,確保不能因為各種錯誤情況或彈窗輸出中斷代碼(最簡單的辦法是加上On Error Resume Next和取消MsgBox及各種窗體)。
2、 不建議將全部的vba代碼都采用動態生成,推薦在部分核心功能上使用。
3、 此功能並非永遠不能破解,但它的優點在於將vba代碼的加密層面從office轉移到了外部,這給保護代碼提供了極多的可行性。
演示說明:
在下面演示里面,可以看到運行了VBA過程,VBA代碼由插件動態生成到Excel里面,然后調用運行,運行完畢刪除模塊以達到保護代碼的效果。這種加密方式的好處是不需要改動VBA代碼,當然也就不需要學什么新的語言了。適合專注VBA應用開發的童鞋。
演示文件下載,未安裝Smart Indenter for VBE插件的的請先下載並安裝。
CrackMe測試,請在2.71版插件下測試,不要用老版本。
技術交流請聯系QQ:564955427