这个设计思路是小凡经过“千辛万苦、苦口婆心”的解释,我才明白的 ,觉得真的很不错!我总结了一下,写下来
首先在程序里面预置一个放 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 就发生会变化,那么它们就不会相等。达到修改任意一字节都能检测出来!
|