深入理解受保护的服务器库(PSL)

受保护的服务器库(PSL)是一种在Windows CE操作系统中广泛使用的技术,它允许系统API在独立的进程地址空间中实现,并且能够同时为多个客户端提供服务。PSL通过一种巧妙的技术生成特殊的处理器错误条件,从而触发PSL入口点的执行。这种技术不仅实现了对系统API的调用,还保证了调用过程的高效性和稳定性。

PSL的基本概念

Windows CE系统中,所有的系统API,包括WIN32 API、用户界面、设备驱动程序以及DirectX接口等,都是通过PSL技术实现的。PSL为每个API调用提供了一个对应的入口点,实现了API调用和PSL入口点之间的一一映射关系。

PSL的实现机制

Windows CE通过生成特殊的处理器错误条件来实现PSL支持。系统维护了一个包含32个PSL入口点的表,其中0到24号入口点已经被预分配,不能用于自定义PSL。PSL在注册API时,需要将API与PSL表中的一个特定入口点关联起来。注册过程中,需要提供系统一个包含所有API入口点的函数表。此外,还定义了一组宏,这些宏接受PSL ID和注册函数表中的索引,以指示要调用的特定PSL函数。这些宏生成了一个实际上是无效内存地址的函数指针。当这个函数指针被使用时,会导致处理器出错。错误处理代码检查出错地址,发现它是PSL的特殊地址,然后提取PSL ID和函数表索引,并调用正确的PSL入口点,就像调用者直接跳转到它一样。

PSL的四个主要组成部分

PSL由以下四个主要部分组成:

  1. 实现PSL各种入口点的函数。
  2. 函数表(Vtable),这是一个包含所有PSL入口点的函数指针数组。这个数组的第一个和第二个入口点被保留给内核使用。第一个入口点是通知程序,内核会在线程或进程停止或启动、内存不足或系统启动时调用它。第二个入口点由内核保留,应为零。其余入口点可供PSL实现者使用。
  3. 描述函数表中每个函数的所有参数类型的签名表。它由一个包含两个或更多入口点的数组组成,与API函数表一一对应。可以使用以下宏:FNSIG0-12、DWORD、PTR、I64。PSL函数可以有三种参数类型(DWORD、PTR、I64)或没有参数。这些类型可以是DWORD(无符号长整数)、指针(void*)或64位整数(long long)。它们的返回值相同。它们可以在函数内或跨函数以任何组合使用。除了当前参数类型外,不能有其他参数类型,但当前参数类型可以用来包含其他类型(例如,在DWORD中包含WORD或WCHAR,在void*中包含BSTR)。PSL函数可以有0到12个参数。如上所述,每个PSL函数签名是通过使用FNSIG宏定义的,该宏后面跟着函数具有的参数数量。然后,FNSIG宏用每个参数的参数类型规范填充。
  4. .lib文件,客户端链接到PSL,包含生成特殊无效内存地址的代码,该地址会导致处理器出错并执行PSL。该代码也可以是定义在头文件中的内联函数。

在Windows CE系统中,有两种基本的钩子技术,一种用于初学者,一种用于专家。

基础钩子技术是通过替换APISET函数指针来拦截系统函数调用。这种方法只能部分工作,因为它只能拦截设备上部分程序的调用,包括所有第三方应用程序和一些ROM中的程序(取决于MS团队的构建)。它不能拦截内核本身的调用。

如果想要拦截所有可能的调用,就需要使用更高级的技术。应该在内核调用特定函数的地址处放置钩子。不能替换ROM中现有的代码,所以唯一的选择是调整虚拟内存(VM)映射并愚弄系统。

高级钩子技术的实现

以下是实现高级钩子技术的步骤:

  1. 找到想要钩子的函数的虚拟地址。
  2. 找到这个地址的物理页映射(在VM表中)。
  3. 分配新的物理页并将代码复制到其中。
  4. 将步骤2中找到的映射切换为指向步骤3中分配的页面。

通过仔细设计步骤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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485