当前位置:C++技术网 > 资讯 > [Win32] 如何检测本地文件被修改

[Win32] 如何检测本地文件被修改

更新时间:2017-02-26 00:54:44浏览次数:1+次

    在开发一个XX软件的时候,我的XX软件需要储存一些数据在本地硬盘中,这个数据存储的是XX软件的核心配置,不希望任何人对它进行修改(除了XX软件本身)。

    那么应该如何对检测本地是否被修改呢?

    我自己想了两个方法,但不完善。

    方法一:记录下文件的修改日期。

    方法一缺点:记录了 修改日期 的文件可能会被其他人修改。

    方法二:在核心配置数据的开头中添加标志位。

    方法二缺点:如果标志位没被修改,仅是中间的数据被改,这就糟糕了。


    最后我换了下思路,能不能把核心配置整个文件进行加密处理,只要中间发生任何修改,都将解密不成功,均视为文件被修改了。

    但是加密解密一直都是个问题,就是加密的话如何能做到像 .rar 的那种算法?

    论安全的话,解密的密码是保留在软件内的,有可能会被人反汇编,然后以查明文找到的风险。

    那么最好的处理方法是什么呢?

    最后感谢C++技术网的回答。


C++技术网会员解答:

    您好,感谢您对C++技术网的信任与支持。

    您的分析其实挺好,有3个方案,只是单一来看,还不够,漏洞比较多。其实你可以将你这个3个方案综合起来,这样也就加大了难度。在安全行业,没有绝对安全的系统。我们只要将我们的安全等级保持在一个难以突破的等级就可以了。所以,只要将这个安全系统复杂化之后,破解难度也就加大了。

    我们给您一个参考的实现方法,也是综合了你的方案,再加上补充和解释,供你参考。

第一步:

    利用文件修改时间。我们将配置文件的二进制数据和文件修改时间二进制格式混在一起。混合的方法自己定义,可以加载开头,也可以在中间某一个位置,也可以在末尾。你还可以在开头加上一段混淆字节序列。反正就是对原始数据做一个处理。加的越多越乱也就越复杂,当然你自己解码也会复杂些。不过这个通过逆向分析也是可以得到操作方式的,不过已经加大了难度。

    这一步可以让别人剥掉外壳到达最核心的数据,因为不知道混淆的数据之前的原始数据,也是没有办法的。除非人家技术达到能够将这个混淆过程逆向出来,那也是醉了。其实这个逆向也不是特别麻烦吧。就是你字节的处理过程,逆向处理一下。因为你自己的代码会去解码这个文件,人家跟着你的代码一步步的演化就可以了。虽说难,但是还是可以行的。

第二步:

    将第一步混淆的数据进行Sha256提取摘要,当然还有其他各种提取摘要算法,或者是MD5摘要。我们这里只是举一个例子。得到摘要数据你可以再混入数据存储起来。在解码时你需要逆向将这个摘要去除,还原到第一步的数据。

第三步:

    选定一个密码。密码的现在也是有讲究的。不要选择字母组合,这样的字符很容易识别出来作为密码的。我们选择密码可以选择非字符的数字组合,这样即使逆向了,也很难识别出哪个是密码。因为你毕竟会用密码去解密,密码太显眼了,容易被看出来。密码就以变量形式写在代码里,不要以常量字符串形式写。最好可以以多次处理在代码中得到密码,加强密码破解难度。

第四步:

    用这个密码去加密第二步的数据,然后写成配置文件。写入时以二进制写入。

    这个配置文件数据和配置文件的修改日期都可以作为检测文件是否被修改的依据 。一旦文件日期被修改,你就可以逆向提取出存储的时间,比对一下就知道被修改了。如果数据被修改了,同样可以检测出来。当然,你比对的时候,只需要比对数据中的某些字节序列,不要比对所有的数据,这样容易暴露数据。

    而且因为有了这些综合,破解难度也大大提高了。当然,要多复杂,你可以自己拿捏。想再复杂点,可以再多一点过程,多绕一点弯。如果没有必要太复杂,可以简化一些步骤。思路就是这样。