ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 11980|回复: 15

[讨论] VBA代码保护方案讨论及总结

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-2-6 21:48 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:保护和加密编程
本帖最后由 wangjian6931 于 2013-2-12 21:47 编辑

大家好,好久没有到论坛上提问了,这次实在是在网上找不到更容易实现的保护代码的方案了。可能是我太较真了,就是想找到一个方法可以保护好自己写的代码,可是又不想封装到Dll里面那么费事。在这里想寻求大家的帮助,一起来讨论讨论到底怎样可以把代码更好的保护好。
我在网上也寻找了好多方案,在这里列出来与大伙先共享一下:
1.EXCEL作品封装实例(二)-更完美的封装方案
http://club.excelhome.net/forum.php?mod=viewthread&tid=25172
特点:
EXCEL内部的封装主要是去掉原来的菜单、工具,安装上自己的菜单及工具,尽量让人一眼看起来不象EXCEL的样子,例如可以去掉EXCEL的左上角图标,状态编辑栏、行号列标、工作表标签、滚动条,最好在第一页配上背景。总之应以让人看不出是EXCEL作为目的。二、外部封装制作启动图标、启动封面、用VB等工具来打开EXCEL作品,从而避开EXCEL的宏对话框,同时将VB代码编译成可执行文件。用QuickCHM制作EXCEL作品的帮助文件,并且能使其在EXCEL中被打开。最后使用Wise Installation System 将VB可执行文件、帮助文件、EXCEL作品打包成安装文件
这个方案我总想知道Excel文件本身放哪呀?放在明显的地方不怕被人破解呀?
2.EXCEL封装实例(三)-完善+完美的封装方案
http://club.excelhome.net/forum.php?mod=viewthread&tid=27119
特点:
附件没有下载到,我不知道这一方案的优点在哪里
3.VBA封装最佳方案实践
http://club.excelhome.net/thread-620436-1-1.html
特点:
创建主程序EXE,主要实现宿主程序加载和对账模块的加载,包含登录界面,登录界面,以及自动升级,我这里是写一个xla文档来加载对账模块(DLL)加载时自动完成自定义菜单,工具条的装载配置,加载后已完全看不到EXCEL的影子,xla是作为资源文件封装在EXE中,运行时自动释放,退出将自动删除,这个xla相当于完成EXCEL和DLL的一个接口功能,菜单和工具条均定义在后台数据库中来动态配置,只要程序运行,用户根本无法截或和进入VBA工程
方案是挺好的,能不能把封装代码跟我们分享分享呢?
4.Excel开发超人培训班开张(已加动画、还原数据库工具)
http://club.excelhome.net/thread-485100-1-1.html
特点:
这个帖子里的封装方案是用VB6做一个界面,然后把存在SQL Server数据库中的Excel文件读取到内存。主要代码在Dll文件及启动程序内。
这个方案挺好的,我个人挺喜欢,可是个人水平问题,我猜不出没有任何VBA代码的Excel文件的右击事件是如何调用的(代码放在VB主程序内?用VB主程序检测鼠标事件?)。
5.Dll封装代码
特点:
将自己的代码写成类文件,并用VB6将代码封装到Dll里面。
这个就不找帖子示例了,一找一大把,用Dll封装的话代码的安全性应该是有的,难度也不是特别大。可是问题是,我们在写代码的时候可能经常性的对代码作微调,来回封装很是麻烦。我想达到的目的是,VBA代码直接还是放在Excel文件里,然后想办法把Excel文件本身藏起来。
下面我利用前人已有的方案考虑了一个新的方案:
6.VB6做启动程序+Excel界面及主程序代码+数据库存放Excel文件
粗看这个方案跟第一、第三、第四方案都差不多:用VB6做启动文件,避开是否启用宏的提示;Excel文件存在数据库中,一般人不太容易找到原文件,可是找到了就麻烦了;某天访问论坛看到虎版的二进制读写文件的示例,突然想到是否可以把Excel文件存成数值型的数据,然后再搞乱顺序及再加一些干扰数据,最后再把它还原回来。我试了一下文件小的还可以,可是文件一大的话速度就慢了,可能是我的代码问题吧,希望哪位大大可以把速度优化了并将代码与大伙分享一下。附虎版的二进制读写文件的代码示例,实在不好意思,原贴我找不到了。
  1. Sub 从EXCEL提取数据生成文件()
  2.     Dim arr() As Byte, ar, a&, X&, Y%, j&
  3.     a = Range("iv1").End(xlToLeft).Column
  4.     ar = Range(Cells(1, 1), Cells(65536, a))
  5.     For Y = 1 To a
  6.         For X = 1 To 65536
  7.             If ar(X, Y) <> "" Then
  8.                 j = j + 1
  9.                 ReDim Preserve arr(1 To j)
  10.                 arr(j) = ar(X, Y)
  11.             End If
  12.         Next X
  13.     Next Y
  14.     Open ThisWorkbook.Path & "\a.wav" For Binary As #1
  15.     Put #1, , arr
  16.     Close #1
  17.     MsgBox "当前目录下已经生成了文件a.wav"
  18. End Sub

  19. Sub 文件的数据保存到EXCEL中()
  20.     Dim arr() As Byte, X&, i&, j%, ar(), H&
  21.     Cells.ClearContents
  22.     Open ThisWorkbook.Path & "\a.wav" For Binary As #1
  23.     H = LOF(1)
  24.     ReDim arr(1 To H)
  25.     Get #1, , arr
  26.     Close #1
  27.     j = 1
  28.     ReDim ar(1 To 65536, 1 To j)
  29.     Close #1
  30.     For X = 1 To H
  31.         i = i + 1
  32.         If i > 65536 Then
  33.             j = j + 1
  34.             i = 1
  35.             ReDim Preserve ar(1 To 65536, 1 To j)
  36.         End If
  37.         ar(i, j) = arr(X)
  38.     Next X
  39.     [a1].Resize(65536, j) = ar
  40. End Sub
复制代码
先附上用AutoIT V3做的启动程序代码
  1. $cn =ObjCreate("ADODB.Connection")
  2. $cn.Open ("Driver={SQL Server};Server=WS03-20121214YC;uid=stock_login;pwd=jianwang6931;database=stock")
  3. $rs =ObjCreate("ADODB.Recordset")
  4. $RS.ActiveConnection = $cn ; 设定RS 是 conn 的集合 重要的部份
  5.   $rs.Open(" Select * from file_name ")
  6.    
  7. $mstream =ObjCreate("ADODB.Stream")
  8.   $mstream.Type =1
  9.   $mstream.Open
  10.   $mstream.Write($rs.Fields("file_itself").Value)
  11.   $mstream.SaveToFile ("c:\publogo.xls", 2)
  12.   $rs.Close
  13.   $cn.Close

  14. Local $oExcel = ObjCreate("Excel.Application")
  15. $oExcel.Workbooks.Open ("c:\publogo.xls")
  16. $oExcel.visible=True
复制代码
VB中的代码
[code=vb]Sub SaveToDB()
'将硬盘中的数据保存到数据库当中
Dim iStm As ADODB.Stream
Dim RS As ADODB.Recordset
Dim StrSqls As String
Set iStm = New ADODB.Stream
With iStm
    .Type = adTypeBinary
    .Open
    .LoadFromFile (Application.GetOpenFilename("Text Files (*.xls), *.xls"))
End With
Set conn = CreateObject("ADODB.CONNECTION")
conn.Open conn_SqlServer
Set RS = CreateObject("ADODB.Recordset")
StrSqls = "select * from file_name "
RS.Open StrSqls, conn, 3, 3
RS.AddNew
RS!file_itself = iStm.Read
RS.Update
RS.Close
iStm.Close
End Sub
Sub SaveToFile()
'将数据库的二进制文件保存到硬盘中并打开
Dim iStm As ADODB.Stream
Dim RS As ADODB.Recordset
Dim StrSqls As String, FilePath As String
Set conn = CreateObject("ADODB.CONNECTION")
conn.Open conn_SqlServer
Set RS = CreateObject("ADODB.Recordset")
StrSqls = "select * from file_name "
RS.Open StrSqls, conn, 3, 3
Set iStm = New ADODB.Stream
FilePath = Application.GetSaveAsFilename("Text Files (*.xls), *.xls")
With iStm
    .Mode = adModeReadWrite
    .Type = adTypeBinary
    .Open
    .Write (RS.Fields("file_itself"))
    .SaveToFile (FilePath)
End With
iStm.Close
RS.Close
Set Myexcel = CreateObject("Excel.Application")
Myexcel.Workbooks.Open (FilePath)
Myexcel.Visible = True
'在工作簿的Workbook_Open()事件中加入以下代码以达到删除原文件的目的
'ActiveWorkbook.ChangeFileAccess xlReadOnly
'Kill ActiveWorkbook.FullName

End Sub[/code]
以下为方案6做出来的效果,可是问题是代码处理大文件时,速度太慢让人无法接受,希望有高手能帮忙看看是否有优化的空间,在此附上图片及代码附件。
文件加密程序.png
读写文件.rar (35.06 KB, 下载次数: 84)

TA的精华主题

TA的得分主题

发表于 2013-2-6 22:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-6 22:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-7 08:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-7 21:40 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-12 21:59 | 显示全部楼层
怎么一直没人看呀,我还在想把这个帖子做成一个精华呢。自己先顶顶吧,让高手看到,也来帮帮忙。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-15 17:31 | 显示全部楼层
方案六解决方案案例测试
方案六已经写出了一个相对让人接受的小程序出来了,现在将Access版本先放出来给大家测试一下,看是否能够破解。Access的密码是"hong",如果大家能够破解的话希望大家把破解方法发上来一起分享一下。如果破解不了,过一段时间我看大家的热情,如果有希望看代码的我可以把代码贡献出来。

解压出来的两个文件要放在一起哟。
VB处理方案.7z (305.72 KB, 下载次数: 77)

TA的精华主题

TA的得分主题

发表于 2013-2-15 18:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-15 20:41 | 显示全部楼层
liucqa 发表于 2013-2-15 18:41
呵呵,越来越像广告贴了。

我原以为是讨论帖呢

是想讨论来着的,可是没有人来讨论呀!方案六我也是这两天调试了好久才调试好的。我真想大伙把自己的保护方案都拿到这里分享讨论一下,可惜我的帖子沉得太快了,几乎没有多少人感兴趣似的。
自己还郁闷呢。

TA的精华主题

TA的得分主题

发表于 2013-2-15 20:53 | 显示全部楼层
wangjian6931 发表于 2013-2-15 20:41
是想讨论来着的,可是没有人来讨论呀!方案六我也是这两天调试了好久才调试好的。我真想大伙把自己的保护 ...

只要能还原,别人就能复制,所以没啥意思的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-7-24 10:54 , Processed in 0.111088 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表