标题: 程序自校验设计思路 [打印本页]
作者: liuyuxi 时间: 2015-1-11 00:30
标题: 程序自校验设计思路
这个设计思路是小凡经过“千辛万苦、苦口婆心”的解释,我才明白的 ,觉得真的很不错!我总结了一下,写下来
首先在程序里面预置一个放 MD5 的数组变量 初始化为 16 个 A
编译好后,把那个程序 逻辑上分为三份 :
第一份为 那 16 个 A 前面的数据
第二份为 那 16 个 A
第三份为 16 个 A 后面 的数据
用 MD5 计算 第一份 和 第三份的 md5 使其相加 再进行一次 md5 加密 得到 一个新的L md5 值
将这个新的L md5 写入到第二份中 ~~ 也就是填充那 16 个 A ,供程序自判断
在程序执行前 我们先将 md5 (第一份 md5 + 第二份 md5 ) = 新的L md5 用 C32 修改 那 16 个 A 为真正的L md5
程序执行流程:
1, 根据 16 个 A ( md5 )计算第一份的偏移地址
16 个 A ( md5 )为第二份偏移地址( 16 个字节) // 这份数据最后由我们外部修改为真正的Lmd5
3, 根据 16 个 A ( md5 )计算第三份的便宜地址
4, 读取 第一份数据 计算其 Amd5
5, 读取第三分数据 计算其 Cmd5
6, 将第一份 Amd5 与 第三份 Cmd5 相加 后再次进行 MD5 加密 得到新的 Lmd5
7, 读取第二份数据
8, 将 Lmd5 与 第二份数据进行比较 相等则程序完整未被修改 不相等则认为程序被修改过
这样分的好处就是,我们从外部只修改第二份数据 md5 因为我们并没有计算这份数据的 MD5 所以,它怎么修改 都不会影响到 第一、三份的加密后的 Lmd5 当然,因为我们事先并不知道Lmd5 是多少,所以预置的在第二份数据中的 md5 可以随便写,只是为了方便用 C32 定位和程序自身定位,然后我们将计算 得到的 Lmd5 用 C32 写入覆盖到第二份数据中(也就是那十六个A) 这样,就能和程序自己计算的Lmd5 与第二份数据相等。程序任意字节被修改, Lmd5 就发生会变化,那么它们就不会相等。达到修改任意一字节都能检测出来!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |