山寨机技术考古(一):重现MRP游戏开发环境

支持MRP游戏的山寨机伴随了我初中那无聊的课上时光。记得当年把手机藏在笔袋里,哪怕老师就在眼前,也堂而皇之的在课桌上打超级玛丽,紧张刺激。高中之后,有了昂贵的iPhone,也有了便宜的Android,昔日辉煌的山寨机很快就成为了记忆中模糊的历史,但我依然会时常想起那串进入MRP游戏世界的神秘代码:*#220807#。如今,我终于有能力去探索当年MRP游戏背后的秘密…

昔日辉煌

用辉煌,红极一时,如日中天等词语,形容当年的山寨机,我觉得实至名归。记得2010年去拉萨,见过一个足球场大小的山寨机卖场,特别壮观(应该有照片,但暂时没找到…):

在寻找山寨机史料的过程中,发现一个作者:geekdroid,他的绝大部分文章都在写中国手机的历史,并且不乏技术细节。在山寨机专用软件MRP和秘籍*#220807#的故事中,geekdroid写到“国产手机在很早之前就已经有基于linux的智能手机系统。酷派,夏新都有linux的手机。可是山寨机把之前有梦想的国产手机们都锤的没有梦想了,锤的倒闭消失了。”读完心情复杂,可这就是历史,我们是历史的见证者,亦是参与者…

如今作为安全研究员的我想到,如果从CPU芯片的角度审视当年山寨机的辉煌,那联发科的MT6225这颗SoC无疑应当载入中国手机史册。山寨机流行时,对手机有追求有研究或者比较富裕的消费者可能会使用诺基亚,索尼,三星等。但我见到的绝大部分同学,老师,家人,等老百姓,在那时都用的是各色山寨机。即使是个正经的国产牌子,比如金立,天宇什么的,从使用上也可以看出和山寨机是一套技术方案。记得当年我用USB连接我家山寨机到电脑时,安装了一个来路不明的驱动程序后,发现我家三台山寨机的USB设备名都有6225字样,我才知道,原来他们仨是同一个玩意。所以从出货量或者说市场占有率来说,我觉得MT6225系列CPU在中国的经典程度不亚于红白机,文曲星的6502了。对于MT6225,我之后会单独写一篇来介绍,也会从老旧的山寨机中,拆出一颗来,让他晒晒太阳。

另外关于山寨机的安全研究,能想到的就是当年的死机短信了:

挖掘工作

其实对于山寨机的技术考古,我本来是想以MT6225这颗CPU作为切入点,因为我之前认为mrp游戏与CPU是深层次绑定的。但在对mrp游戏资料的挖掘过程中发现如下史料:

mrpdev的readme中,zengming00写到:

很遗憾,mrp时代结束这么多年后才终于将这些资料公开,可能我是最后一个保留了完整的开发技术的人留着将来考古用 
幸运的是,我们在安卓手机上有了mrp模拟器,以及与mrp开发极其相似的mpc

这里面有基础的API和当时未开放的高级API接口文档,以及当时比较高级的自定义字库、扩展内存等技术的资料

青春如同奔流的江河,一去不回来不及道别

比较细致的开发指南为mrpdev中的:

  • 《Mythroad程序员开发指南》卷一:“入门“
  • 《Mythroad程序员开发指南》卷二:“开发规范”
  • 《Mythroad程序员开发指南》卷二:“技术内幕”

仔细看了这些开发资料,原来mrp游戏开发是解耦于MTK开发,并且斯凯已经做好了一套简单易用的开发环境,不需要依赖对CPU的理解,那就先让mrp游戏的开发重见天日吧!

重见天日

在网上找到斯凯SDK开发包(含向导).rar,简化附件为Mrp开发包.zip,其中包括的文件有:

  • 使用说明.txt
  • ADS1.2的授权文件/license.dat
  • SKY Developer Suite(CP)_Setup.exe
  • SDK破解/使用说明.txt
  • SDK破解/mr_helpere.mrp
  • SDK破解/mr_helperk.mrp
  • SDK破解/mr_helpero.mrp
  • SDK破解/SDKCrack.exe

基础环境

首先安一个XP虚拟机和Visual Studio 2005,可在MSDN i tell you上下载:

使用XP的原因是:斯凯MRP游戏SDK的底座为VS 2005,而VS 2005的底座是XP,新系统会有兼容性问题…

- XP SP2: ed2k://|file|sc_winxp_pro_with_sp2.iso|629227520|505B810E128351482AF8B83AC4D04FD2|/
- 网上找了一个windows xp sp2的秘钥:BB96V-433XK-GM9WR-KXCDJ-4HTQW

- VS 2005: ed2k://|file|cs_vs_2005_pro_dvd.iso|2733268992|9DA1C378BAC22E66A73C9E20EC78CCFB|/
- 原版XP不自带能打开iso的软件,可以在外面解压好在拖进去,安装程序为./vs/setup.exe,自定义安装,语言仅勾选Visual C++即可

image

ARM Developer Suite

MRP游戏运行在MTK 6225等系列的处理器上,所以其实是个ARM程序。因此需要windows下的ARM交叉编译环境,找到官方的ARM Developer Suite,大小88.24MB,但是安装过程提示需要下一张CD…

后在网上在找到118M的版本,可以正常安装:

运行Setup.exe,这个安装时选择typical,需要输入license时,给入附件中的ADS1.2的授权文件/license.dat文件即可。

SKY Developer Suite

安装附件中的SKY Developer Suite(CP)_Setup.exe,即斯凯MRP的SDK,默然安装路径为C:\SKYMOBI\,这个SDK可以找到系统中的VS 2005并添加工程模板。但这曾经是一个需要授权的SDK,所以目前运行需要破解,复制附件中的以下四个文件到C:\SKYMOBI\SDS4CPv1.0\Compiler目录中:

  • mr_helpere.mrp
  • mr_helperk.mrp
  • mr_helpero.mrp
  • SDKCrack.exe

然后在复制后的目录运行SDKCrack.exe,提示破解成功。

新建工程以及编译

最后打开VS2005,新建工程,选择C++,即可看到斯凯的开发扩展,找到并选择SkyAppWiz(CP):

image

具体工程类别为:

  • Helloworld工程:Helloworld
  • DEMO工程:空战游戏的模版
  • SGL应用程序:开发一些实用功能的软件的模版

例如我使用Helloworld工程,修改DemoWinWinEvent函数,打印个内存地址:

void DemoWinWinEvent(int32 data, int32 eventId)
{
	char buf[20];

	switch (eventId)
	{
	case WIN_EVENT_SHOW:
	case WIN_EVENT_REFRESH:	
		mrc_clearScreen(255, 255, 255);
		
		sprintf(buf,"[+] XUANXUAN %x",(void *)buf);
		mrc_drawText(buf, 0, 152, 0, 0, 0, 0, MR_FONT_MEDIUM);
		
		mrc_refreshScreen(0, 0, 240, 320);
		break;
	case WIN_EVENT_PAUSE:
		break;
	case WIN_EVENT_EXIT:
		break;
	case WIN_EVENT_UPDATE:
		break;
	}
}

如果想编译成mrp,必须找到你新建工程的那个文件夹,然后运行build.bat生成,此脚本具体内容如下,只是调用mrpbuilder.exe,生成的mrp在bin文件夹。

C:\SKYMOBI\SDS4CPv1.0\Compiler\mrpbuilder.exe ./Makefile.mpr
pause

如果想在实机运行,可在闲鱼搜索“冒泡社区”,“*#220807#”等可买到支持mrp的山寨机。然后在sd卡根目录下新建mythroad目录,并将编译好的Helloworld_240.mrp改名为dsm_gm.mrp放入其中。最后,开机输入 *#220807# 即可运行Helloworld!

image

给出编译后的mrp文件:Helloworld_240.mrp,至此,我们可以正向开发,也可以逆向分析,则可继续探索mrp游戏实现背后的秘密了。