Symbian OS 初探 tombkeeper@xfocus,http://hi.baidu.com/tombkeeper 2005.12.01 1. Symbian OS简介 Symbian OS是Symbian公司的针对智能手机的嵌入式操作系统,是目前市场占有率最大的手机操作系统,也是最早出现的智能手机操作系统。 Symbian公司的前身是Psion,原本是英国一家主力生产计算机软件的公司,1984年起开始生产电子记事簿。Symbian OS的架构就基于Psion以前开发的Epoc OS。1998年6月,爱立信、诺基亚、摩托罗拉和Psion共同出资,筹建了Symbian公司。 2001年,Symbian公司中止了EPOC OS的开发,只保留商用电子助理的产品线,同时跟摩托罗拉、爱立信、诺基亚、Sendo、西门子及松下等手机大厂组成Symbian联盟。 在2003年人们曾经一度认为Symbian OS即将被淘汰,但是从最近的情况来看,Symbian OS然具有很强的生命力。下面是历年来的市场占有率: 目前诺基亚在智能手机市场上占据着最大的份额,其所有智能手机都基于Symbian OS。诺基亚出货量最大的智能手机是S60系列。 S60是Series 60的缩写,指的是手机的操作界面,类似于“桌面环境”的概念。相应的还有Series 40(6230i等机型)、Series 80(9210/9300/9500等9系列机型)。7650/3650/6600/6670/7610/3230等机型使用的就是Series60的界面。 7650和3650这两款老型号手机的操作系统是Symbian OS 6.1,2004年和2005年新出的S60手机则都是基于Symbian 70操作系统的,所以本文以Symbian 70为研究对象。 从外表来看,Symbian十分类似于Windows。譬如驱动器也称之为“C:、D:……”,依赖扩展名识别文件,可执行文件扩展名是EXE,动态链接库扩展名是DLL、配置文件扩展名是INI……系统甚至也使用Windows的PE格式。所以对Symbian OS的研究分析工作很容易上手。 Symbian OS的Z:盘存储着系统的Rom,通常是不可写的。C:盘也是Rom,可写,是主要驱动器。平时安装的程序、需要读写的数据都存储在C:盘。D盘是Ram,相当于临时目录,存储的数据在系统重启后会丢失。 智能手机和普通PC相比具有其特殊性: 1、人们几乎没有“手机存在漏洞”的意识,更不知道如何给手机打补丁。 2、手机的短信、“彩信”、蓝牙等通信方式都可以成为外来数据的入口。而且用户无法拒绝这些数据进入手机。 “彩信”是一种类似电子邮件的通信方式,通过GPRS协议传输数据,可以携带任意格式的文件。当手机打开“彩信”的时候,会根据携带的文件扩展名,自动调用相应的程序进行处理。而这些程序就非常有可能存在各种各样的安全问题。“彩信”问题可能是未来数年内手机安全的最大威胁。 “彩信”可能影响的不光是智能手机,普通手机也是一样,只不过相应的漏洞利用起来要难一些罢了。 2. 研究环境的搭建 首先下载Symbian 7.0的SDK(参考资源[1]),如果你有CodeWarrior,可以下载支持CodeWarrior的版本(参考资源[2])。 考虑到大多数人都没有CodeWarrior(参考资源[3]),所以本文所述的一切操作均以无CodeWarrior支持的SDK为环境。无CodeWarrior支持的SDK可以和微软.NET开发环境整合,不过本文也不会涉及.NET开发环境。Symbian SDK中包含了足够的文档、编译器、调试工具、相关头文件和库、虚拟机、例子代码等。本文全部内容都仅需SDK即可完成。 SDK的安装过程很简单,默认安装路径为C:\Symbian。本文所述皆以默认安装路径为例。 如果要使用Symbian的SDK的全部功能,系统上需要先安装ActivePerl(参考资源[4])和JRE(参考资源[5])。 有一点需要注意,SDK所带的工具要求JRE必须是1.3.1_xx、1.4.0_xx或者1.4.1_xx中的某一个才能正常运行,否则会报错。限制是在C:\Symbian\7.0s\Series60_v21\Epoc32\tools\splash.exe中做的: .text:004027CB push offset a1_3_1 ; "1.3.1" .text:004027D0 push edx ; unsigned __int8 * .text:004027D1 call __mbscmp .text:004027D6 add esp, 8 .text:004027D9 test eax, eax .text:004027DB jz short loc_402809 .text:004027DD mov eax, [esp+74h+var_60] .text:004027E1 push offset a1_4_1 ; "1.4.1" .text:004027E6 push eax ; unsigned __int8 * .text:004027E7 call __mbscmp .text:004027EC add esp, 8 .text:004027EF test eax, eax .text:004027F1 jz short loc_402809 .text:004027F3 mov ecx, [esp+74h+var_60] .text:004027F7 push offset a1_4_0 ; "1.4.0" .text:004027FC push ecx ; unsigned __int8 * .text:004027FD call __mbscmp .text:00402802 add esp, 8 .text:00402805 test eax, eax .text:00402807 jnz short loc_402823 你可以选择安装这三个版本JRE中的某一个,或者把上面的某个jz改成jmp。如果不想安装那些老古董,又懒得修改代码,还有个折中并且优雅的方案:在注册表里增加一个虚假的版本描述,其中的路径指向当前的JRE: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.4.1] "JavaHome"="C:\\Program Files\\Java\\jre1.5.0_05" "MicroVersion"="0" "RuntimeLib"="C:\\Program Files\\Java\\jre1.5.0_05\\bin\\client\\jvm.dll" 本小节 参考资源 [1] Series 60 SDK 2.1 for Symbian OS v7.0s, Nokia Edition http://www.symbian.com/developer/sdks/S60_SDK_2_1_NET.zip [2] Series 60 SDK 2.1 for Symbian OS v7.0s Supporting CodeWarrior for Symbian OS http://www.symbian.com/developer/sdks/S60_SDK_v21c_CW.zip [3] CodeWarrior for Symbian OS http://www.metrowerks.com/MW/Develop/Wireless/Symbian/Personal_Edition.htm [4] ActivePerl Download http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl [5] Java[tm] Technology Products Download http://java.sun.com/products/archive/index.html 3. Symbian OS SDK的组成 安装好后的C:\Symbian\7.0s\Series60_v21\目录下有6个子目录。下面对这些内容作一些简单介绍: Debug目录下只有一个文件:gdbstub.SIS。这是用于调试的gdb服务器。如果要用GDB对手机或者虚拟机进行调试,就需要安装gdbstub.SIS。 Epoc32目录是SDK的主要部分。包括编译器、调试器、虚拟机等。 Epoc32\cshlpcmp_template目录下是整合.NET开发环境所需的模板。 Epoc32\data目录下是虚拟机的文件。 Epoc32\gcc目录下是开发调试工具。 Epoc32\include目录是开发所需的头文件。 Epoc32\release目录下是虚拟机,Epoc32\release\wins\udeb是Debug版本,Epoc32\release\wins\urel是release版本,里面的目录“z”会映射为虚拟机中的Z:盘,每个虚拟机目录中的epoc.exe和eshell.exe分别是标准虚拟机和命令行模式虚拟机。 Epoc32\tools下是一些和开发相关的小工具,譬如SIS文件的制作打包程序。不少工具是Java写的,装JRE就是为了能运行这些工具。 Epoc32\wins下的“c”和“d”两个目录会映射为虚拟机的C:和D:盘。 Examples和Series60Ex中是一些例子代码。 Series60Doc目录中保存着SDK的全部文档。 Series60Tools里是两个辅助开发的小工具。 需要注意的是,Symbian SDK中提供的虚拟机只是一个x86版本的Symbian而不是ARM版本的,用来进行开发可能还行,但是对于安全研究就基本上没有什么价值了。所以我们还是得用真正的移动电话来调试。 4. 用GDB调试 要进行调试,首先得在移动电话上安装上面提到的gdbstub.sis。默认安装到C:\gdbstub.exe,并生成目录C:\gdbstub。C:\gdbstub\gdbstub.ini是gdbstub的配置文件。只要能建立串行通信的接口都可以用于调试,譬如红外或者蓝牙。 4.1 通过红外进行调试 首先,修改移动电话上的gdbstub.ini如下: [COMMSERV] PDD=EUART%d LDD=ECOMM CSY=IRCOMM PORT=0 RATE=9600 然后在电脑上建立一个目录:C:\gdb,并在其中创建文件:gdb.ini,内容为: epoc-exec-file Path\To\Your\Application target epoc com4 break *0xAAAAAAAA source //c/symbian/7.0s/Series60_v21/Epoc32/gcc/share/epoc-des.ini gdb.ini的内容事实上就是gdb命令,如果不建立这个文件,启动gdb后手工输入也没问题。注意:上面的com4是计算机的红外虚拟串口,在不同的计算机上未必都是com4。 这时候就可以将移动电话和电脑的红外口对上,然后通过SeleQ之类的文件管理工具运行gdbstub.exe。然后以C:\gdb为当前目录,启动gdb,就可以开始调试了。 有一点要注意,大多数系统自带的程序都保存在不可写的Z:盘,而为了节省内存,提高程序启动速度,Symbian系统对这些程序都是直接映射到线性空间,而不是读入内存。再加上Symbian没有Windows的“脏页”机制,这就意味着对于这些系统程序我们无法设置断点,因为不能插入中断指令。一个可行的办法是将程序拷贝到可写的C:盘来,但大多数系统程序在拷贝到C:盘后可能就无法执行了,还需要破解作这部分限制的代码。 4.2 通过蓝牙进行调试 通过蓝牙进行调试要比用红外更方便,因为不存在“对准”的问题,甚至可以一边调试一边打电话。 在配置上没有什么特殊之处,只需要修改一下上面提到的gdbstub.ini文件: [COMMSERV] PDD=EUART1 LDD=ECOMM CSY=BTCOMM PORT=0 RATE=9600 接下来的操作和红外调试差不多。 本小节参考资源 [1] Configuring Bluetooth virtual serial ports (with source) http://www.symbian.com/developer/downloads/files/BTCOMM_control_S60_v1.zip [2] On Target debugging on Serie 60 with Bluetooth http://forum.newlc.com/index.php?action=printpage;topic=11470.0 [3] Symbian OS Tools http://www.symbian.com/developer/downloads/tools.html [4] GDB Debugger for Symbian OS v7.x http://www.symbian.com/developer/downloads/files/gdb.zip |