本帖最后由 aqwvwv 于 2017-9-16 00:13 编辑
程序实现效验自身MD5,纯核心库实现
程序运行的时候如何效验自身是否有被非法篡改,效验的方法有很多种,今天给大家开源一种效验MD5的办法
第一步:
首先,我们得在发布的软件里面先写几段代码,获取自身软件的MD5值
将下面代码放在启动窗口创建完毕下,然后编译源码,源码编译出来后,我们尝试打开看下,是不是效验失败了?软件打不开
[/align ][align=left ].版本 2 窗口程序集名 | 保 留 | 保 留 | 备 注 | 窗口程序集_启动窗口 | | | | 如果真 (文件效验 () = 假)信息框 (“文件被非法修改,无法运行”, #错误图标, “错误”, )结束 ()变量名 | 类 型 | 静态 | 数组 | 备 注 | 局_运行目录 | 文本型 | | | 局_执行文件名 | 文本型 | | | 局_字节集 | 字节集 | | | 局_MD5 | 文本型 | | | 原始MD5 | 文本型 | | |
局_运行目录 = 取运行目录 ()局_执行文件名 = 取执行文件名 ()局_字节集 = 读入文件 (局_运行目录 + “\” + 局_执行文件名 )原始MD5 = 到文本 (取字节集右边 (局_字节集, 32 )) 局_字节集 = 取字节集左边 (局_字节集, 取字节集长度 (局_字节集 ) - 32 )局_MD5 = 取数据摘要 (局_字节集 )如果真 (局_MD5 = 原始MD5 )返回 (真)返回 (假)[/align ][align=left ]
.版本 2
.支持库 dp1
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.如果真 (文件效验 () = 假)
信息框 (“文件被非法修改,无法运行”, #错误图标, “错误”, )
结束 ()
.如果真结束
.子程序 文件效验, 逻辑型, , 效验成功返回真,失败返回假,返回假表示改文件必然不是原始文件
.局部变量 局_运行目录, 文本型
.局部变量 局_执行文件名, 文本型
.局部变量 局_字节集, 字节集
.局部变量 局_MD5, 文本型
.局部变量 原始MD5, 文本型
局_运行目录 = 取运行目录 ()
局_执行文件名 = 取执行文件名 ()
局_字节集 = 读入文件 (局_运行目录 + “\” + 局_执行文件名)
原始MD5 = 到文本 (取字节集右边 (局_字节集, 32))
局_字节集 = 取字节集左边 (局_字节集, 取字节集长度 (局_字节集) - 32)
局_MD5 = 取数据摘要 (局_字节集)
.如果真 (局_MD5 = 原始MD5)
返回 (真)
.如果真结束
返回 (假)
上面的代码原理是,读入自身字节集,然后通过 取数据摘要()得到自身MD5值
这个MD5值的长度 它都是固定的32位,其中尾部32个字节数据,是我储存的软件MD5
这条数据得在软件编译出来后写出。
第二步:
要想打开上面编译的软件,并效验成功,我们需要打造一个专门给软件尾部写入MD5的工具,它的界面如下
窗口程序集名 | 保 留 | 保 留 | 备 注 | 窗口程序集_启动窗口 | | | | 变量名 | 类 型 | 数组 | 备 注 | MD5 | 文本型 | |
编辑框1.内容 = 接收到的文件路径 拖放对象1. 注册拖放控件 (取窗口句柄 ()) 变量名 | 类 型 | 静态 | 数组 | 备 注 | 字节集 | 字节集 | | | 文件号 | 整数型 | | | 如果真 (文件是否存在 (编辑框1.内容 )) 文件号 = 打开文件 (编辑框1.内容, , , , )字节集 = 读入字节集 (文件号, 取文件长度 (文件号 )) MD5 = 取数据摘要 (字节集 )移到文件尾 (文件号 )写出字节集 (文件号, 到字节集 (MD5 )) 关闭文件 (文件号 )编辑框2.内容 = “MD5:” + MD5 信息框 (“写出成功”, 0, , )置剪辑板文本 ( #常量1 )信息框 (“复制成功”, 0, , )变量名 | 类 型 | 静态 | 数组 | 备 注 | 局_运行目录 | 文本型 | | | 局_执行文件名 | 文本型 | | | 局_字节集 | 字节集 | | | 局_MD5 | 文本型 | | | 原始MD5 | 文本型 | | |
局_运行目录 = 取运行目录 ()局_执行文件名 = 取执行文件名 ()局_字节集 = 读入文件 (局_运行目录 + “\” + 局_执行文件名 )原始MD5 = 到文本 (取字节集右边 (局_字节集, 32 )) 局_字节集 = 取字节集左边 (局_字节集, 取字节集长度 (局_字节集 ) - 32 )局_MD5 = 取数据摘要 (局_字节集 )如果真 (局_MD5 = 原始MD5 )返回 (真)返回 (假)
我们将刚才编译好的软件,拖入文件效验工具中,点击按钮【开始写入】
提示,写入成功就可以了,这时候我们再打开之前编译的软件,看看这时候是否能正常效验成功,正常打开?
感觉是不是特别简单,也很方便?
这样我们就能通过该办法得知我们的程序是否有被篡改,给软件留下暗桩,保护劳动成果
建议MD5信息通过加密算法进行储存,储存的位置也可以自定义,当文件效验()失败的时候,软件不要去提示什么文件被非法篡改等信息,发现后直接执行关闭代码就可以了,或者故意来个数组错误,内存溢出等代码,应该很简单吧?
这样能很大程度上防止破J的朋友通过文明,关键提示信息等定位到暗桩在那里,如果要在多个位置调用,尽量不要重复的调用一个子程序,应该随机多创建多个独立子程序,分别调用
建议不要直接在启动窗口创建完毕下去判断
推荐在以下几个位置进行效验:
1.功能执行代码中
2.软件常用功能事件中
等这类位置进行判断,要不影响软件正常运行效率即可
注:本文方法心得仅供易友学习参考,重要软件请谨慎套用 源码中出现需要模块的,搜索下 大文件_打开文件() 将大文件_ 去掉就可以了
|