软件保护入口点安全及技术分析

来源:互联网 发布:nginx 多域名负载 编辑:程序博客网 时间:2024/05/17 21:42

1.    目前被保护软件普遍存在的破解点
    爆破点1:修改安全产品模块内部的关键点,修改其判断点,从而达到破击的目的。
    爆破点1:修改安全产品模块内部的关键点,修改其判断点,从而达到破击的目的。
    爆破点2:修改被保护软件调用安全产品的关键点,跳过加密点,从而达到破击的目的。
    爆破点3:修改或者替换DLL,从而达到破击的目的。
    爆破点4:通过分析通讯规约,直接修改驱动,从而达到破击的目的。
    爆破点5:直接复制或者替换硬件,从而达到破击的目的。
从以上可以看出,主要的破击点还是上层软件。

2.    什么是入口点安全
对于硬件安全以及通道安全,可以通过使用智能卡芯片以及非对称算法来保证其安全性。如下图所示:
 
对于上层开发商软件的安全性的问题,可以称之为入口点安全问题,目前还没有一种从理论上能够保证入口点的绝对安全,这是由于目前的操作系统本身就不是一个安全的操作系统造成的。但是并不是说,就没有办法进行保护了,如果能够最大限度的增加黑客破解的难度,使其在被保护软件的生命周期内无法破击,那么我们可以称之为安全的。

3.    保护入口点安全的技术手段
我们可以把保护入口点安全的技术手段分为5个级别,其中每个级别又可以包括以下相应的实现方法:
第1级:反静态分析

  •     扰乱汇编代码
  •     使用外壳压缩
  •     花指令
  •     信息隐藏

第2级:反跟踪

  •     反调试
  •     断点检测技术
  •     反加载技术
  •     反监视技术

第3级:反DUMP
第4级:文件完整型检测

  •     磁盘文件校验
  •     内存文件校验

第5级:内外结合

  •     硬件自定义算法
  •     硬件实现SMC
  •     代码直接存储在硬件
  •     截获系统函数调用

由于从第1级到第4级的安全技术,已经有很多资料讨论过,本文的重点在第5级,即内外结合技术的探讨,通过结合特定的硬件来实现内外结合功能。


4.    硬件自定义算法
硬件自定义算法的使用方式可以分成3种使用方式,其中第1种和第2种,都已经有了相应的产品,第3种目前来说市场上还没有类似的产品。

4.1.    开发商使用供应商提供的自定义的编程语言及工具,来编写自定义算法,然后再移植到硬件中执行,开发商在自己的程序中调用算法。目前宏狗、深思的SENSE4、飞天的ROCKEY5,都是采用这种方式。优点:这种方式可以适用于各种开发语言环境,具有普遍适用性。缺点:需要开发商去学习新的编译工具和自定义算法语言。同时需要保证所编写的自定义算法输入输出参数具有随机和隐蔽性,否则上层被保护代码还是有可能被跟踪改写。 产品比较:

  • 深思SENSE4    使用C51语言来编写自定义算法,    功能比较强大,但是使用的编译器是第三方的编译器。
  • 飞天ROCKEY5    使用类C语言来编写自定义算法,很多语法和C还不一样。    语法定义比较复杂,难以掌握。
  • SAFENET宏狗    支持ANSI C,是其的子集。    比较简单,容易掌握,只要使用过C编程的开发者,可以马上使用。但是目前还不支持浮点、子函数,以及相关的库函数调用。

4.2.    供应商提供编译器插件,集成在开发商使用的的编程工具中,开发商只需要使用自己的编程语言来编写自定义算法,隐藏了开发商调用的过程。缺点:扩展性差,必须针对不同语言的编译器,提供不同的插件。同时需要保证所编写的自定义算法输入输出参数具有随机和隐蔽性,否则上层被保护代码还是有可能被跟踪改写。优点:对于几种特定主流语言的开发者来说比较方便,同时这种方式是基于原代码级别的保护,在特定的应用下具有特殊的作用。

4.3.    使用供应商的分析工具对开发商生成的可执行文件进行分析,分析出独立可用代码,然后移植到硬件中进行运行,上层软件改为调用硬件中程序。但是关于分析Sub Fun,即可独立运行的代码,转换成硬件可执行代码,还有几点需要解决:

  •     如果子函数中调用了全局变量,该如何处理?
  •     如果存在重定位项,该如何处理?
  •     如果子函数中调用了其他子函数或者系统函数,该如何处理?
  •     对于输入输出函数的传递,该如何处理?

如果这几点解决了,这种方法将具有很好的易用性。

5.    硬件实现SMC
必须需要开发者在自己的程序中嵌入标志,编译成可执行文件后,然后让分析工具去识别,并且修改成自己的加解密调用,同时硬件需要支持加解密算法。这种方式可以加密常量、字符串、以及部分代码,可以保证在内存中的被加密代码以明文方式存在周期最短。
 
6.    代码直接存储在硬件内
 
这种方式可以提升无狗破解的难度,虽然这种方式和算法无关,但是比单纯的使用算法还要难以破击。
 
7.    截获系统函数调用
截获系统函数的功能,可以保证被加壳的软件被脱壳后,不能够正常运行,是让壳和被保护软件结合更紧密的一种手段。
截获系统函数的方法大概可以分为4种:

  •     直接修改可执行文件中调用系统函数库的相关代码,把它修改成调用外壳中附加代码中的函数地址,附加代码中的函数在进行相关操作后,再去调用系统函数,把返回值和返回参数返回给开始调用的函数。
  •     修改引入表,把引入表中系统函数的地址修改成调用我们外壳中附加代码中的函数地址,附加代码中的函数在进行相关操作后,再去调用系统函数,把返回值和返回参数返回给开始调用的函数。
  •     当程序运行后,动态修改系统函数所在核心库的映射空间中的内存数据,这种方式不支持WIN98/ME操作系统。
  •     通过HOOK来截获系统函数调用。

8.    结论
如果能够按照保护入口点安全的5个安全级别去开发一款安全性高的安全产品,那么每个安全级别都需要做好,不断的完善,这样将会把破解的门槛提升的越来越高,最终将会取得防盗版的胜利。

原创粉丝点击