« PSPで動くアプリの自作?(準備・環境) | トップページ | PSPで動くアプリの自作 【SwitchV】 »

2012年1月 4日 (水)

PSPで動くアプリの自作?(署名)

前回に続いてPSP。

EBOOT.PDPの署名について。

EBOOT.PDPに対して「署名」をすることで、無改造のPSPでそのアプリを実行できる。


◆署名の方法

・公式PSPだけで署名できるツール
  「PSCRYPTER v2.0 w/ source for PSP」
  ms0:/PSP/GAME に、PSCRYPTER_v2.0_signed をフォルダごとコピー
  PSCRYPTER_v2.0_signed/sign フォルダに、署名したいEBOOT.PBP を入れておいて
  PSPにて PSCRYPTER を実行することで、sign に入れておいた EBOOT.PBP が署名される。

  …と(どこかで)説明されていたが、EBOOT.PBPはそのままに、EBOOT_signed.PBP が作られていた。
  他にもいくつかファイルができていたが、これは署名過程で PBP を分解(unpack)した名残。ゴミ。いらない。

  PBPのサイズが、100kB から 5MB へと大幅増加。うーん。。

  PSP上でできるのはおもしろいが、その後結局USBでつないでPC上でファイルを移動して‥などしないといけない。
  PCでやってしまったほうが早い気がする。


・PBPの pack/unpack を駆使して PCでやる

  SDKについている, pack-pbp, unpack-pbp で、PBPファイルの分解、再構成ができる。
  
  unpack-pbp EBOOT.PBP
  で PBP ファイルを分解。
    DATA.PSP
    PARAM.SFO
  という2つのファイルが抽出された。
  署名の対象となるのは DATA.PSP ファイル。
  これに「署名」をしたあと、packしなおせばよい。

  prxEncrypter をダウンロード、展開。
  作成された Release/prxEncrypter.exe に EBOOT.PBP をドラッグ&ドロップしてみる。
  → ?しーん・・・ なにか起きた?
    ( C:/Documents and Settings/[User]/ にdata.psp ができてました)
  ドラッグ&ドロップはあまりよろしくない。
  コマンドラインでやればその場に作られるようなので、ここはやはりバッチファイルで。

@echo off
dir DATA.PSP
echo Encrypting...
prxEncrypter DATA.PSP
dir DATA.PSP
pause

  DATA.PSPのある場所に prxEncrypter.exe と上記バッチをおいて、バッチ実行。
  DATA.PSP が書き換えられた。  、、サイズが5MBに…むー。まあいい。

  最後に再構築。
  pack-pbp EBOOT.PBP PARAM.SFO NULL NULL NULL NULL NULL DATA.PSP NULL
  ※ pack-pbp のコマンドライン引数は固定されている。コマンドラインで pack-pbp と打つとhelpがでる。

  できたっぽい。
  CFWでないPSPで動くか確認。 よしよし、動く。
  ただし、やっぱりサイズが 5MB とでかくなってしまった。

  ※ PACK/UNPACK は pbp_util というGUIを使うと楽。HSPで書かれてるっぽい。


・ サイズをもうちょい小さく

  http://volotax.blog59.fc2.com/blog-entry-24.html に、情報がありました。感謝。

  > Proxima's PRXEncrypterを使用すると署名後のPBPのサイズを500kb程に抑えることが出来ます。
  > some1氏のDowngrader v4.1に付属しています。
  >  DL : http://www.mediafire.com/?fop3fsojv3oesl0
  > このファイルを解凍したbinフォルダ内にあるprxencrypter.exeがそうです。

  というわけで、こっちの prxEncrypter.exe を使うことで、
  たしかにサイズが 500kB くらいになった。1/10 なので満足することにする。


◆コンパイル時に署名できないか?

  コンパイル時のログを見ていると、最後に pack-pdp を実行している。

  待て。
  ということはいちいち分解再構築しなくても、pack直前に署名を実行してしまえばよいのでは。

  Makefile の中を見ると、一番最後のほうで
  pspsdk/psp/sdk/lib/build.mak がincludeされている。
  この build.mak が Makefileの実体らしい。

  build.mak を見てみると、4箇所ほどで pack-pbp を実行している。
  サンプルで実行したところ、後ろの2つのどちらかになる模様。
  なので、この2ヶ所に署名実行を書いてしまおう。

  とりあえずは pspsdk/bin に prxEncrypter.exe をコピーしておく。

  build.mak を編集。以下の赤字部分を追加。

# PSP Software Development Kit - http://www.pspdev.org
# -----------------------------------------------------------------------
# Licensed under the BSD license, see LICENSE in PSPSDK root for details.
#
# build.mak - Base makefile for projects using PSPSDK.
#
# Copyright (c) 2005 Marcus R. Brown
# Copyright (c) 2005 James Forshaw
# Copyright (c) 2005 John Kelley
#
# $Id: build.mak 2333 2007-10-31 19:37:40Z tyranid $

# Note: The PSPSDK make variable must be defined before this file is included.
ifeq ($(PSPSDK),)
$(error $$(PSPSDK) is undefined. Use "PSPSDK := $$(shell psp-config --pspsdk-path)" in your Makefile)
endif

# OS tools
CP = $(shell psp-config --pspdev-path)/bin/cp
RM = $(shell psp-config --pspdev-path)/bin/rm
MKDIR = $(shell psp-config --pspdev-path)/bin/mkdir
TRUE = $(shell psp-config --pspdev-path)/bin/true

CC = psp-gcc
CXX = psp-g++
AS = psp-gcc
LD = psp-gcc
AR = psp-ar
RANLIB = psp-ranlib
STRIP = psp-strip
MKSFO = mksfo
PACK_PBP = pack-pbp
ENCRYPT = prxEncrypter
FIXUP = psp-fixup-imports

PSPDATA = DATA.PSP


  ( 中略 )


all: $(EXTRA_TARGETS) $(FINAL_TARGET)

kxploit: $(TARGET).elf $(PSP_EBOOT_SFO)
$(MKDIR) -p "$(TARGET)"
$(STRIP) $(TARGET).elf -o $(TARGET)/$(PSP_EBOOT)
$(MKDIR) -p "$(TARGET)%"
$(PACK_PBP) "$(TARGET)%/$(PSP_EBOOT)" $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) NULL $(PSP_EBOOT_PSAR)

SCEkxploit: $(TARGET).elf $(PSP_EBOOT_SFO)
$(MKDIR) -p "__SCE__$(TARGET)"
$(STRIP) $(TARGET).elf -o __SCE__$(TARGET)/$(PSP_EBOOT)
$(MKDIR) -p "%__SCE__$(TARGET)"
$(PACK_PBP) "%__SCE__$(TARGET)/$(PSP_EBOOT)" $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) NULL $(PSP_EBOOT_PSAR)

$(TARGET).elf: $(OBJS) $(EXPORT_OBJ)
$(LINK.c) $^ $(LIBS) -o $@
$(FIXUP) $@

$(TARGET_LIB): $(OBJS)
$(AR) cru $@ $(OBJS)
$(RANLIB) $@

$(PSP_EBOOT_SFO):
$(MKSFO) '$(PSP_EBOOT_TITLE)' $@

ifeq ($(BUILD_PRX),1)
$(PSP_EBOOT): $(TARGET).prx $(PSP_EBOOT_SFO)
#
ren $(TARGET).prx $(PSPDATA)
$(ENCRYPT) $(PSPDATA)
ren $(PSPDATA) $(TARGET).prx
#

$(PACK_PBP) $(PSP_EBOOT) $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) $(TARGET).prx $(PSP_EBOOT_PSAR)
else
$(PSP_EBOOT): $(TARGET).elf $(PSP_EBOOT_SFO)
$(STRIP) $(TARGET).elf -o $(TARGET)_strip.elf
#
ren $(TARGET)_strip.elf $(PSPDATA)
$(ENCRYPT) $(PSPDATA)
ren $(PSPDATA) $(TARGET)_strip.elf
#

$(PACK_PBP) $(PSP_EBOOT) $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) $(TARGET)_strip.elf $(PSP_EBOOT_PSAR)
-$(RM) -f $(TARGET)_strip.elf
endif

%.prx: %.elf
psp-prxgen $< $@

%.c: %.exp
psp-build-exports -b $< > $@

%.o: %.m
$(CC) $(CFLAGS) -c -o $@ $<

clean:
-$(RM) -f $(FINAL_TARGET) $(EXTRA_CLEAN) $(OBJS) $(PSP_EBOOT_SFO) $(PSP_EBOOT) $(EXTRA_TARGETS)

rebuild: clean all

  できたっと。

  これで、自作アプリ作成のための環境構築はよしとする。

  長くなったので今回ここまで。

|

« PSPで動くアプリの自作?(準備・環境) | トップページ | PSPで動くアプリの自作 【SwitchV】 »

ゲーム(PSP)」カテゴリの記事

コメント

今更ながらにコメント。
>>PSP上でできるのはおもしろいが、その後結局USBでつないでPC上でファイルを移動して‥などしないといけない。 PCでやってしまったほうが早い気がする。

PCでやった方が早いのは事実だろうけども、PSPにはFilerという便利な代物があり、PCに接続せずともメモステのデータを移動させたりできるので、
PSP内で署名するファイルの移動から署名、署名後のファイルの移動までを完結できるため、PCがない環境にて署名する場合は便利だったりするかと。(PCのない環境にて手持ちファイルorネット環境はあるので落とした上で、OFWな別PSP用等に署名する場合とか)

投稿: | 2013年12月 5日 (木) 23時58分

コメントを書く



(ウェブ上には掲載しません)




« PSPで動くアプリの自作?(準備・環境) | トップページ | PSPで動くアプリの自作 【SwitchV】 »