查看: 78|回复: 0

[转载图文] C/C++ 通过CRC32算法实现反破解

[复制链接]
发表于 2020-6-15 20:52:20 | 显示全部楼层 |阅读模式
  我们可以通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32值就会发生变化,一旦发生变化,程序就废了,绕过的方式则是,1.动态打补丁,2.找到crc32算法位置将跳转nop掉,3.直接手动计算出crc32并覆盖到原始程序的crc算法位置。
对文件的CRC32检测  PE头,前面有非常多的无效空间,可以供我们使用,crc32地址应该反写。

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解
  另一种通过使用 MapFileAndCheckSum 实现的反破解,先来修改一下C++编译器配置,使其能够支持
  C/C++ -> 常规 -> 调试信息格式 --> 程序数据库

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解
  连接器 -> 常规 -> 启用增量链接 -> 否

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解
  连接器-> 高级 ->设置校验和 ->是

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解
  主程序检测程序如下。

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解
对磁盘的CRC32检测  对磁盘完整性检测只能防止文件被修改,但无法防止内存补丁,下面的代码将可以检测内存变化,如果内存被打补丁,则会退出执行。
  原理是,定位到.text节首地址,然后计算该节的CRC32值,并存入全局变量,然后开一个线程进行循环检测,一旦发生变化,则立即让程序报废。部分代码片段。

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解
  上方代码是保护了整个程序,在实际应用中,有时我们只需要保护其中一个片段代码就好,这样可以提高效率,所有我们对上面代码稍作修改即可实现针对特定片段的内存校验.

C/C++ 通过CRC32算法实现反破解

C/C++ 通过CRC32算法实现反破解


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046
微信公众号
快速回复 返回顶部 返回列表