Hacking PSP

by Hui on 6月 11, 2006

Abstract: 本文回顾了在PSP的发展过程中hacker们对Sony不屈不挠的斗争历史,介绍了PSP的购买知识,详细说明了怎样安装game loader以及如何设置Homebrew的编译系统PSPSDK。

介绍

首先推荐下面几篇文章:

Wikipedia上对PSP的介绍 ( or here )
PSP的硬件详尽参数与实际性能
PSP菜鸟学堂

简单地说,PSP(PlayStation Portable)是索尼公司04年底推出的一款掌上游戏机。PSP配置两个333兆赫主频的CPU,支持很好的3D处理功能,大容量的UMD电影和游戏光碟(1.8G),Memory Stick Pro Duo(目前可以支持数个G的容量), 无线网络(支持网络对战)和红外线连接(多机直接连接),可以播放音乐浏览图片,继承了PS2手柄的设计(第一张图左下那个黑色的圆钮是模拟的摇杆)。这款机器本身已经是游戏界的传奇,但这还不是故事的全部。

PSP的UMD光盘技术是垄断的,UMD无法被PC上的光驱读写,所以想要看电影或者玩游戏必须购买正版UMD光盘(非常昂贵,通常是30多美元),而且用户无法从USB口刷新PSP的操作系统。但是,在PSP推出半年之后也就是去年五月份这种局面有了改变,有hacker发现PSP Firmware1.0版本可以运行Memory Stick Pro Due中用户自己写的程序,这样用户就得到了kernel级别的系统运行权限,这种用户自制的程序被称为Homebrew(翻译成中文指“家中土产的”)程序。随后,一些hacker在很短时间写出了将UMD光碟Rip成iso并保存在Memory Stick Pro Duo上的程序,以及将Memory Stick Pro Duo上的iso文件虚拟为系统UMD的“虚拟光驱”软件,这样用户就可以从网上下载iso文件(通常是数百兆)到自己的PSP上玩而不用花钱购买正版游戏和电影。更重要的是,用户可以自己编写游戏或者用程序来实现PSP没有的功能,比如有的程序可以将PSP变成红外遥控器,支持数千种设备,下次你到bar里就不用忍受一百年不换的无聊的电视频道了 🙂

这种局面并不会直接影响PSP的销路,但是会影响游戏出版公司的利润,所以会间接影响到索尼的利润并可能引来官司,所以索尼推出了1.50版本的Firmware禁止运行用户自己编写的程序,并且利用firmware的新特性来吸引用户升级。但是好景不长,hacker们发现了这个1.50firmware中显示程序图标导致内存溢出的一个bug,这个bug使得homebrew又成为可能,甚至有hack写了程序将1.0版本的homebrew程序转化成1.50版本。

(走题一下,Sony程序员的疏忽可以作为我们programming的反面教材,不过这么多smart的hackers keep eyes on the codes不发现错误几乎是不可能的 - 从而,我们体会到了Open Source的好处)

接着,可以想象的是,Sony又在网站上提供了1.51,1.52版本的firmware堵上了这个漏洞,吸引用户下载新版本,并且在1.5中有一个network update功能让用户能直接用PSP从网络更新系统。“叛乱”似乎平定了,虽然1.0和1.5的PSP已经卖出去不少并且homebrew的程序已经广为告知。

但是,hacker们还在盯着。

Sony推出了2.0版本。这个版本支持一些新的功能,比如允许用户自己设定桌面壁纸,添加了网络浏览器等等。但是fancy的功能和膨胀的代码终于让hacker再次发现了漏洞,一个查看图片的bug导致内存溢出从而可以欺骗2.0的系统以运行1.5版本的系统安装文件!于是2.0的PSP被降级到1.5,welcome to the old world! 🙂

然后Sony推出了2.01, 2.5, 2.6版本的firmware,堵上漏洞,并用新特性来吸引用户升级。然后,hacker们又发现游戏Grand Theft Auto: Liberty City Story中的一个溢出漏洞可以导致用户运行盗版游戏(不过这次不能降级了,也不能支持homebrew程序),看来,现在应该被责备的轮到游戏出版商了 🙂

目前最新的版本是2.7,尚未找到漏洞。

本文接下来的篇幅会谈谈如何购买PSP,设置引导游戏iso的软件(Game Loader),以及如何在Ubuntu Linux配置homebrew的编程环境。

购买

1.0(firmware)版本的PSP仅仅在日本发行过,现在很少见。目前能买到的新PSP是2.7版本,199美元,有时可以找到deal,150多美元。不过2.01,2.5,2.6,2.7版本的PSP目前无法运行Homebrew程序,所以如果你想要hack PSP,请购买2.0及其以前的二手PSP。因为可以运行盗版游戏,所以二手的旧版PSP(有些附带几张游戏光盘)一般要200多美元甚至300美元以上,比新的还贵。在ebay上偶尔能买到300圆以下的新的2.0及其以前版本的PSP,不过我觉得没必要,二手的足够了。我的二手的2.0版是从craigslist上找的,150美元,那个美国哥们对他的PSP保养得很好(买了一年几乎没玩过),随机附赠的《蜘蛛侠》的电影UMD都没有打开。

如果你买到的是1.5版本,那么请直接阅读下一节。如果是1.51或者1.52版本的PSP,请先升级到2.0:在qj.net上下载2.0美版或者日版的升级用的EBOOT.PBP,放在PSP/GAME/UPDATE/文件夹下面,然后进入菜单的game->memory stick运行2.0updater即可。将2.0降级到1.5可以参考下面的网页

英文

Game Loader的安装和使用

我使用的Game Loaders:

  • DevHook 0.41a
  • UMD Emulator 0.8c
  • MPH Gameloader 1.1 for 1.5

这三个软件已经可以运行我手边的游戏。关于UMD Emulator和MPH Gameloader的下载和安装请google。下面我谈谈怎样安装DevHook 0.41a:

原理:正如DevHook的名字所言,这个软件实际上将系统的光驱等设备(device)用其他自定义的设备(比如iso虚拟光驱)来替代,这样就可以像使用UMD光碟一样使用iso文件了。注意:需要一张任意的正版UMD游戏光碟,这样UMD的盘符才能在game菜单中显示出来。DevHook强大的地方不仅在于可以替换单个设备,而且可以替换整个系统(比如将正在运行的1.5系统替换成2.0或2.5系统!暂时替换,并没有写入flash,所以彻底关机后还会回到原来的1.5系统)。只安装DevHook是不够的,因为它只是一个launcher的壳子,还需要下载2.0或2.5系统的EBOOT>PBP。但下载的2.0或2.5系统的EBOOT.PBP并不能直接使用,需要用一个软件PBP unpacker将其中的DATA.PSAR提取出来,然后用DevHook自带的dh installer将其解开,解密。

步骤:
1. 下载DevHook 0.41,解开。将其中的MS_ROOT下的文件夹复制到PSP Memory Stick上。其中,PSP/GAME目录下面的DEVHOOK和DEVHOOK%下放的是主程序,dh_inst和dh_inst%放的是刚才提到的dh installer。
2. 下载DevHook 0.41a,解开。这实际上只是一个0.41的升级包,其中有用的文件只有MS_ROOT/dh/kd/devhook.prx 那个文件,用它覆盖DevHook 0.41中的对应文件即可。
3. 这样我们得到的DevHook仅仅是launcher。我们需要下载2.0或者2.5的EBOOT.PBP文件,然后用PBP unpacker解压EBOOT.PBP得到DATA.PSAR,将这个文件放在PSP memory stick根目录下面。
4. 在PSP上运行dh installer,这个程序会自动从DATA.PSAR识别firmware版本是2.5或者2.0,自动将其解压并解密,然后自动放在对应的位置(memory stick 根目录的dh/200或者dh/250目录下面)。运行完后,那个dh_inst和dh_inst%文件夹就可以删除了。

你不需要2.0 2.5两个EBOOT.PBP,2.5就足够了(不过显然这样只能模拟2.5系统)。

在2.5中CPU频率设置为333/166无线网络好像是不可使用的,不过频率设置到222/111就可以了。DevHook的研制者booster正在开发支持2.7的版本。

设置Homebrew的编译系统PSPSDK

PSPSDK网站

地球人都知道编译软件首先要有编译器,比如Linux和cygwin中的C语言编译器。这节的目的就是告诉你怎样在Ubuntu Linux下配置为PSP设计的C编译器psp-gcc,注意这个psp-gcc生成的是PSP中可执行的目标代码,和Linux中的gcc相互独立完全不同,他们的头文件和库文件放在两个互不相干的位置。我们知道C语言有很强的从一个操作系统移植到另一个操作系统的能力,就是说PC上的C程序源代码基本可以由psp-gcc编译得到PSP的可执行代码!

设置PSPSDK方法很简单:

pspsdk的svn下载那个toolchain.sh脚本,以root权限运行这个脚本(因为需要往/usr/local/pspsdk里写东西),它会自动下载源文件和patch文件,自动patch,编译并最后安装。整个过程需要较长时间,可以去喝杯咖啡(or whatever)。pspsdk就安装在了/usr/local/pspsdk文件夹中,/usr/local/pspsdk/psp/sdk/sample下面是一些例子,你可以试试make :

    make 会生成1.0需要的EBOOT.PBP文件
    make kxploit 会生成1.5需要的两个文件夹 xxx和xxx%
    make SCEkxploit 和make kxploit 一样,不过两个文件名称为 __SCE__xxx和%__SCE__xxx,这利用了fat文件格式的一个bug,这样,那个%__SCE__xxx文件夹在PSP的game菜单中就不会显示为corrupted。

这样就安装好了PSPSDK,具体使用方法请到PSPSDK的官方主页,也可以从sample下面的例子得到启发。有了PSPSDK这个基本的编译环境之后,已经可以让你编写homebrew程序。不过有的程序需要一些额外的library,这些library可以从pspsdk的svn中下载:

比如zlib
svn co svn://svn.pspsdk.org/psp/trunk/zlib

下载完成后进入目录,首先阅读README.PSP或者README等帮助文件,上面详细说明了需要怎样编译和安装。需要强调的是这些库之间有依存关系,先后安装是有顺序的。下面是我成功安装的库,以及补充说明(排在后面的库可能依赖前面的库,前面的库不依赖后面的库):

zlib
libpng (依赖zlib,我试过其中的例子screenshot可以编译在PSP上运行)
jpeg
mikmodlib (不要安装那个libmikmod,两者不一样,libmikmod导致cpplibs无法编译通过,另外make install就可以安装而make可能会失败,因为作者对make的知识很烂 🙂 )
cpplibs (sample 可以通过,但是需要在makefile的编译链接库选项中加入 -ljpeg,这是一个bug)
libogg
freetype
libTremor
libvorbis
aalib (sample “aafire” 可以编译运行,但是 其中的aastdin.c 文件头部要加入一行 #include 因为其中使用了fd_set这个structure,但这个structure定义在sys/fd_set.h中,在sys/select.h中如果检测到不是cgywin就不会自动include sys/fd_set.h,这是一个bug)
prxtool (这是一个本地PC上使用的prx工具)
pspgl (tests 和 test-vfpu 都可以通过, test-q3 没试过不知道)
编译pspgl的tests注意

    首先要export环境变量
    export PSP_REVISION=1.50
    export PSP_MOUNTDIR to a directory,比如tests/PSP

    然后修改tools/psp-install,注释掉一些语句用新语句替换:

    # LONG=”$IMGDIR”_________________________________1
    LONG=__SCE__”$IMGDIR”
    BASE=`echo “$LONG” | sed -e “s/\(.\{6\}\).*/\1/”`
    # SHORT=”$BASE”~1%
    SHORT=%__SCE__”$IMGDIR”
    else
    # LONG=”$IMGDIR”
    LONG=__SCE__”$IMGDIR”
    # SHORT=”$IMGDIR%”
    SHORT=%__SCE__”$IMGDIR”

    修改tools/psp-install,注释掉两句:

    # while [ ! -d $(PSP_MOUNTDIR)/psp/game ]; do mount $(PSP_MOUNTDIR); sleep 1; done
    PSP_MOUNTDIR=$(PSP_MOUNTDIR) \
    $(PSP_INSTALL) $(INSTALLFLAGS) $< \ --eboot-title="$* $(BUILDDATE)" --eboot-icon="firefox.png" # umount $(PSP_MOUNTDIR)

SDL (没试 samples)
SDL_gfx (没试 samples)

然后,你可以试试pspsdk svn中其他的好东东,发现什么好玩的请告诉我。

相关资源

几个有用的站点:

PSPSDK 网站及论坛
PSP Hacks
PSP @ qj.net
电玩俱乐部论坛
PSP中文网
PSPChina论坛

Leave your comment

Required.

Required. Not published.

If you have one.