如何解决平台安全问题
文章信息
在应用软件开发过程中,我们通常会碰到各种与平台安全概念有关的问题,而弄清当前面临问题是否的确与平台安全有关却有点棘手。下面的检查列表将有助于分析平台安全相关问题。
Contents |
检查模拟器日志输出
可做的首要事情是检查模拟器日志输出,这个比较容易查找。从模拟器的Tools | Preferences菜单可启用模拟器日志输出,确保"Enable EPOCWIND.OUT logging"被选中。另外,从epoc.ini文件也能启用日志输出,确保LogToFile值为1。
LogToFile 1
然后运行应用程序,执行一些操作后退出。接着,打开EPOCWIND.OUT文件,这个文件位于%TEMP%文件夹(在DOS窗口键入"echo %temp%"命令行,即可获知%TEMP%的真实路径)。下面给出一个有平台安全问题的应用程序的例子。
151.975 *PlatSec* WARNING - Capability check would have failed - A Message
(function number=0x00000000) from Thread Screenshot[20000555]0001::screenshot,
sent to Server !Windowserver, was checked by Thread
WSERV.EXE[10003b20]0001::Wserv and was found to be missing the capabilities:
SwEvent . Additional diagnostic message: Capability check failed for
RWindowGroup::CaptureKeyUpsAndDowns API
153.600 *PlatSec* WARNING - Capability check would have failed - A
Message (function number=0x00000000) from Thread
Screenshot[20000555]0002::screenshot, sent to Server !MsvServer, was checked by
Thread !MsvServer[1000484b]0001::!MsvServer and was found to be missing the
capability: ReadUserData.
这个例子显示出此程序缺少两个能力,即:SwEvent and ReadUserData。
在模拟器上执行能力检查
这个与前面的那个基本类似。不是将问题写入日志文件,而是当有平台安全问题时模拟器会立即通知。
从模拟器的菜单Tools | Preferences可使能模拟器能力检查。也可从epoc.ini文件使能这个检查,就是将PlatSecDisabledCaps的值改为NONE。
PlatSecDisabledCaps NONE
意思是没有被禁用的capability。换言之,所有能力检查都被启用。 当启用这个功能后,模拟器在每次调用受限API时将显示一个对话框。下例给出一个例子:因为缺少能力显示的错误信息。
我所用的API需要哪些能力?
在检测到问题之后,下一步就是如何找到问题所在。调试代码总是有帮助。另外,也查看SDK帮助看应用程序是否有被拉掉的能力。下例是一个写在SDK帮助中的能力信息的例子。
Capability Information
Required capabilities:
ReadUserData WriteUserData ReadDeviceData WriteDeviceData
检查MMP文件
在收集到所有需要的能力之后,下一步就是检查.mmp文件,确保这个文件中列举了所有需要的能力。mmp文件中能力声明例子:
CAPABILITY SwEvent LocalServices NetworkServices ReadUserData WriteUserData
注意:Carbide.c++ 1.1不使用.mmp file。要在Carbide.c++ 1.1上修改capabilities,右击工程并选择Properties | C/C++ Build。 因此,推荐使用最新版本(当前为2.0版)。
Carbide.c++ 能力扫描工具
有一个Carbide.c++新插件,叫做Capability Scanner],它能在IDE中检测平台安全问题。这个插件在Carbide.c++ release v1.3之后可用。
检查DLL依赖关系
在平台安全中,可执行程序只能装载比它自身有更多能力的DLL。例如,具有A和B能力的可执行程序不能装载只有能力A的动态库(DLL)。确信可执行文件所装载的所有DLL都有更多的能力或者至少一样多且完全相同。
这个问题通常发生在使用第三方DLL时。大多数在ROM上的DLL都有"All -Tcb"能力;而大多数第三方应用的能力比ROM上的DLL的能力少。 检查可执行文件的能力,包括.exe和.dll,可通过elftran工具来进行。使用"-dump h"参数运行这个工具,然后检查运行结果中的capabilities 区段。
ELFTRAN - ELF file preprocessor V02.01 (Build 564)
Copyright (c) 1996-2006 Symbian Software Ltd.
E32ImageFile 'screenshot.exe'
Entry points are not called
...
Capabilities: 00000000 0001f000
...
上例中的可执行文件拥有0x0001 F000能力。能力位的定义可以在头文件e32capabilities.h中找到。这个文件随任何Symbian OS 9 SDKs而发行,包括S60 3rd Edition SDK。 There is no such file as e32capabilities.h in either MR release or the FP1 release, there is a file named e32capability.h but that is not usefull at all.
然而,使用elftran -dump s <filename>命令可能更易获得可执行文件的能力。
ELFTRAN - ELF file preprocessor V02.01 (Build 573)
Copyright (c) 1996-2006 Symbian Software Ltd.
E32ImageFile 'HelloWorldBasic.exe'
Secure ID: 102ee322
Vendor ID: 10333333
Capabilities: 00000000 000ffffe
CommDD
PowerMgmt
MultimediaDD
ReadDeviceData
WriteDeviceData
DRM
TrustedUI
ProtServ
DiskAdmin
NetworkControl
AllFiles
SwEvent
NetworkServices
LocalServices
ReadUserData
WriteUserData
Location
SurroundingsDD
UserEnvironment



(no comments yet)