9.2.4 沙箱技术

9.2.4 沙箱技术

各种安全软件的普及,使得沙箱技术在现在听起来不再是一个神奇的字眼。沙箱技术是指通过将目标程序运行中对系统文件或者注册表等的修改隔离到一个安全的区域,使得这些修改并不立即反映到真实的系统中,就好像是使目标程序运行在一个箱子里面一样。不管对程序进行什么样的修改,都会被限制到这个箱子里面(如360安全沙箱软件描述的那样)。这种技术确实是一种非常好的隔离技术。

之所以介绍沙箱技术,是因为沙箱技术不仅是一种安全技术,而且在软件破解中同样是一种非常好的技术。这需要从沙箱技术的原理说起。沙箱技术的一般原理如图9.45所示。

图9.45 沙箱技术的原理

沙箱技术通过在程序执行时增加一个沙箱过滤层来实现程序对数据访问的过滤,将不安全的操作重定位到安全的区域,使得程序很难破坏真实的系统。沙箱技术也具备某些虚拟机的功能。因为沙箱技术拥有过滤任何系统函数的能力,所以可以通过对一些系统函数的模拟来模拟软件的执行环境。

一般情况下,沙箱过滤层就是通过过滤程序调用的系统函数来实现的,其技术原理说到底还是函数HOOK。例如,我们要监控和过滤目标程序对注册表的访问,就可以HOOK掉所有与注册表相关的系统函数,如RegOpen Key()等。但是,一般的沙箱技术不会在进程内过滤该程序的系统函数,因为这很不稳定,也容易被绕过。

安全技术中的沙箱技术是指驱动层在系统内核通过对内核函数的HOOK来过滤程序的访问。但是,在软件破解技术中,我们没有必要为了破解一个程序而开发一个完整、稳定的驱动,所以在这里我们介绍的沙箱技术是建立在进程内的隔离层上的。

在软件破解技术中,沙箱技术主要用来监视那些具有试用或者授权功能的程序对注册表或文件的访问,因为无论什么样的保护系统,其最终都会将软件的使用信息(如用户对软件的使用次数)存储到系统的某个地方,而且一般的保护系统能够选择的通用性和稳定性最好的方式就只有系统的注册表和文件。因此,我们可以通过监控所有的注册表操作和文件操作函数来探查程序对这些存储位置的访问,并且可以篡改这些访问结果,从而达到使保护系统的某些功能失效的目的。例如,一个被保护的程序允许用户使用30次,通过沙箱技术我们可以使这个程序永远可用。因为在使用沙箱技术后,该程序无法向系统保存该软件已经使用了多少次这个信息,所以保护系统无法判断用户实际使用了多少次这个信息。下面介绍如何实现一个简单的沙箱。

为了在进程内实现沙箱技术,我们需要在目标进程内HOOK众多系统函数。那么,采取什么样的方式HOOK函数才比较稳定和方便呢?一种方法是直接通过HOOK库对每一个需要HOOK的函数都进行函数HOOK。但是,很多保护系统都会检测系统函数有没有被动过手脚,而且有些系统函数由于自身代码过滤或其他因素导致无法用函数HOOK来HOOK该函数。

在各个系统平台中,系统对内核函数的调用方式是不同的。因此,针对不同的系统平台,没有统一过滤所有系统内核函数的办法。但是我们不难看出,在Windows XP和32位Windows 7程序当中,系统都使用了一个call指令来转到sysenter指令,这就给了我们一个非常好的过滤所有内核函数的机会。在Windows XP中,我们可以修改7FFE03000处(KiFastSystemCall)的指针,以中转所有系统函数的调用。同样,在Windows 7中,我们可以通过修改fs:[0C0]处的指针,以中转所有内核函数的调用。而且,因为我们实际上没有修改指令代码,所以保护系统一般都不会对其进行校验。