受保护的服务器库(PSL)是一种在Windows CE操作系统中广泛使用的技术,它允许系统API在独立的进程地址空间中实现,并且能够同时为多个客户端提供服务。PSL通过一种巧妙的技术生成特殊的处理器错误条件,从而触发PSL入口点的执行。这种技术不仅实现了对系统API的调用,还保证了调用过程的高效性和稳定性。
在Windows CE系统中,所有的系统API,包括WIN32 API、用户界面、设备驱动程序以及DirectX接口等,都是通过PSL技术实现的。PSL为每个API调用提供了一个对应的入口点,实现了API调用和PSL入口点之间的一一映射关系。
Windows CE通过生成特殊的处理器错误条件来实现PSL支持。系统维护了一个包含32个PSL入口点的表,其中0到24号入口点已经被预分配,不能用于自定义PSL。PSL在注册API时,需要将API与PSL表中的一个特定入口点关联起来。注册过程中,需要提供系统一个包含所有API入口点的函数表。此外,还定义了一组宏,这些宏接受PSL ID和注册函数表中的索引,以指示要调用的特定PSL函数。这些宏生成了一个实际上是无效内存地址的函数指针。当这个函数指针被使用时,会导致处理器出错。错误处理代码检查出错地址,发现它是PSL的特殊地址,然后提取PSL ID和函数表索引,并调用正确的PSL入口点,就像调用者直接跳转到它一样。
PSL由以下四个主要部分组成:
在Windows CE系统中,有两种基本的钩子技术,一种用于初学者,一种用于专家。
基础钩子技术是通过替换APISET函数指针来拦截系统函数调用。这种方法只能部分工作,因为它只能拦截设备上部分程序的调用,包括所有第三方应用程序和一些ROM中的程序(取决于MS团队的构建)。它不能拦截内核本身的调用。
如果想要拦截所有可能的调用,就需要使用更高级的技术。应该在内核调用特定函数的地址处放置钩子。不能替换ROM中现有的代码,所以唯一的选择是调整虚拟内存(VM)映射并愚弄系统。
以下是实现高级钩子技术的步骤:
通过仔细设计步骤3中的代码,能够在不失去调用原始函数的能力的情况下拦截调用。
以下是一些用于实现高级钩子技术的C++代码示例:
#define W32_SetKMode 108
#define W32_CreateAPISet 2
#define W32_CacheSync 34
#define W32_SetProcPermissions 72
#define W32_QueryAPISetID 112
#define W32_LockPages 138
#define W32_GetRomFileInfo 32
#define W32_GetCallerProcess 68
#define W32_GetProcAddrBits 63
#define W32_GetProcFromPtr 61
#define W32_GetOwnerProcess 67