[PS2PAR解析部屋]

最近PS2PARを仕入れた、のはいいのだが、マニュアルにいつも書いてあったコードの説明が載っておらん。更にはなんかコードもよくある感じじゃない・・暗号化されてる?

・・ということで解析。素材はPS2PAR Ver1.3、1.6(+体験版)、1.6Jを使用しました。まだ不透明なとこもありますが、解ったところをつらつらと書き記しておきます。随時更新。


■暗号化計算式■
1つのコードは通常アドレス部+データ部の4バイト×2、で構成されていますが、これらは1バイト単位で暗号化されています。

元コードをa0a1a2a3 d0d1d2d3、暗号化コードを A0A1A2A3 D0D1D2D3 とすると
A0 = (a0 XOR $A6) - $6A
A1 = (a1 XOR $96) - $FF
A2 = (a2 XOR $01) - $7E
A3 = (a3 XOR $82) - $5A
D0 = (d0 XOR $D9) - $C5
D1 = (d1 XOR $3B) - $E5
D2 = (d2 XOR $1B) - $34
D3 = (d3 XOR $CC) - $27
となっています。当然復号時は逆に計算します。各数値の一覧表は下記。

■PARコード機能表■
以下はほぼPS2PARの逆アセンブルリストを見て推測したもので、確認状況は極めて甘いです。間違いがありましたらご指摘をお願いします。
数値は、暗号化される前の状態のものを記しています。無意味な部分で0となっている箇所の多くは、実際にはなんでもいいと思われます。

●単純書き込み

0aaaaaaa 000000dd
1aaaaaaa 0000dddd
2aaaaaaa dddddddd

aで示すアドレスにdで示すデータを書き込みます。上からそれぞれbyte/halfword/word単位での書き込みです。
halfwordの場合アドレスの下位1ビット、wordの場合同2ビットは立っていても0になります。この仕様は以下のコードも同様です。

●複数アドレスへのデータ連続書き込み

[★Ver.1.x]

3000nnnn dddddddd aaaaaaaa×(n-1)

(n-1)回のaで示すアドレス群にdで示すデータをまとめて書き込みます。単位はword。
※・・だけだったら良いんですが、d自体をもアドレスとみなして一度余計に書いてしまっている上に、更に下位2bitを0にしていないので、おそらく4の倍数値しか書き込めません。
※Ver1.3/1.6ではこのコードの次のコードは先頭数値に関係なく4コードとして認識します。

[★PS2PAR2]※未検証

3000nnnn aaaaaaaa dddddddd×n

aで示すアドレスから、n×4バイト分、d以下で示すデータ群を書き込みます。

●指定アドレスの値加減算

[★Ver.1.3/1.6]

300100nn aaaaaaaa
3002nnnn aaaaaaaa
30030000 aaaaaaaa nnnnnnnn 00000000

aで示すアドレス内のデータにnの値を減算し続けます。
※このコードの次のコードは先頭数値に関係なく4コードとして認識します。

[★Ver.1.6J以降]

301000nn aaaaaaaa
302000nn aaaaaaaa
3030nnnn aaaaaaaa
3040nnnn aaaaaaaa
30500000 aaaaaaaa nnnnnnnn 00000000
30600000 aaaaaaaa nnnnnnnn 00000000

aで示すアドレス内のデータにnの値を、3文字目が奇数なら加算、偶数なら減算し続けます。

加減算値の単位は3種ありますが、対象データの単位はword固定です。

●複数アドレスへの同一データ連続書き込み

4aaaaaaa xxxxyyyy dddddddd 00000000

aで示すアドレスから、xで示す回数分、yで示す数値×4をアドレスに加算しつつ、dで示すデータを連続で書き込みます。単位はword。
※Ver1.3ではこの後にコードが最多で(回数-2)個以上存在する必要があり、さらに最後から最多で(回数-2)個までのコードは機能しなくなります。詳細は下記。

●バイトコピー [★ver1.6以降]

5aaaaaaa nnnnnnnn bbbbbbbb 00000000

aで示すアドレスからbで示すアドレスへnバイト分データをコピーします。

●単純書き込み(一回)

Aaaaaaaa dddddddd

aで示すアドレスにdで示すデータをワード単位で1度だけ書き込みます。
ほぼBOOTプログラム書き換え用途にしか使用できませんが、このコードに限りマスターコードを必要としません。

●時間待ち

B0000000 nnnnnnnn

nで示すカウント分の時間が経過してから、以降のコードを実行します。

●マスター比較

Caaaaaaa dddddddd

aで示すアドレス内のデータがdで示す値と一致するまで待ってから、以降のコードを実行します。単位はword。

●条件比較(1)

Daaaaaaa 0000dddd
Daaaaaaa 0010dddd
Daaaaaaa 0020dddd
Daaaaaaa 0030dddd

aで示すアドレスのデータと、dで示すデータを比較し、条件に合致する場合のみ次のコードを実行します。単位はhalfword。
条件は上からそれぞれ、=、≠、d≧(a)、(a)≧dです。

●条件比較(2)

E0nndddd 0aaaaaaa
E0nndddd 1aaaaaaa
E0nndddd 2aaaaaaa
E0nndddd 3aaaaaaa
(1)と同様ですが、一致しない場合は以下、nで示す数のコード群を一気にスキップします。

●不明

DEADFACE aabbccdd

復号時にPARがドングルに送る値で、変更すると暗号化のパターンが変化する模様。
aaとbbがアドレス、ccとddがデータに関る。05100518がデフォルト。

[★PS2PAR2]※未検証

DEADFACE 00000000とすると、以後のコードは暗号化しなくても良い。

●マスターコード

Faaaaaaa bbbbbbbb
8aaaaaaa bbbbbbbb cccccccc 00000000 [★ver1.6以降]

ゲーム内からcheatを有効にするために必要なコードです。
カラットがコードを発表している場合はそれを使えば良い訳ですが、ない場合はツールで検索する、あるいは自前で作成する必要があります。詳細は下記。

aで示すアドレスは、cheatを有効にするためのフック位置ですが、8コードの場合は、aのアドレス値下位2bitにより、フック位置に正しい値が入っているかどうかの比較が行われます。
下位2bit=0....比較しない
下位2bit=1....aで示すアドレスのデータがcで示す値であればフック
下位2bit=2....比較しない
下位2bit=3....aで示すアドレスのデータがcで示す値でなければフック
※実際のアドレス値は下位2bitは0になります。


他、コード先頭の数値=6、7、9については現在の所未定義のようです。


■マスターコード詳細■
Faaaaaaa bbbbbbbb

PARはBOOTプログラム読み込み後、aの位置からの2ワードのプログラムコードを保存し、サブルーチンコール(jal)とnopコードを埋め込みます。(ついでにAコードが存在していればここで処理しています)
そこから呼ばれるサブルーチンでは、実際にcheatを有効にするための割り込みの設定等(bの値による−下記)、及び保存しておいたaの位置の元のコードを実行します。

自力でアドレスを決定する場合は、BOOTFILEを逆アセンブルし、実行開始アドレスからしばらく追い、割り込み関係の初期化が終わっていると思われる辺りの適当なjalコード等を狙うと良いでしょう。目星としては少なくとも最初のei($42000038)コードより後になります。
ある程度の初期化後で、cheatを効かせたい部分以前ならいつでも良い筈ですが、2度以上実行される箇所は避けなければいけません。また、フックという処理の都合上当然、遅延スロット上を指定したり、ブランチ命令を含んだりしてもいけません。

bで示す数値は、cheat用フックのパターンで、下位2bitの値によって場合分けされます。
下位2bit=0....形式(1)、syscall$20,$22,$2b使用/b=syscall$20,$2bへの引数×4/確認のみ
下位2bit=1....形式(2)、syscall$20,$22,$2b使用/b=syscall$20,$2bへの引数×4
下位2bit=2....形式(3)、syscall$10,$14使用/b=syscall$10への引数×4
下位2bit=3....形式(4)、syscall未使用/b=cheat用フック位置
※場合分け分岐後は下位2bitは0として扱われます。

このbについては、現在カラットが公表しているコードを見ると、以下の3パターンに分かれているようです。
1)形式(2)で引数$7F(×4+1で$01FD=暗号化で$1456E60A)
2)形式(3)で引数$03(×4+2で$000E=暗号化で$1456E79B)
3)形式(4)−割り込みを使わない方式

形式(2)と(3)はThread、及びIntc割り込みを利用する形式、形式(4)はプログラム内で定期的に実行される位置にjalコードを埋めこむ形式です。
形式(1)については(2)と同じ方式ですが、cheat処理のかわりに画面をフラッシュさせています。これを使うと、形式(2)が使えるかどうかの確認が可能です。

形式(4)以外の場合はその構造上、ゲーム中に割り込みの初期化等で突然無効になってしまう可能性が否めませんから、最近のカラット公表のコードはほとんどが形式(4)になっているようです。

○マスターコード作成実践例1:形式(1)及び(2)/"リモココロン"の場合
BOOTFILEのSCPS_110.12を逆アセンブルし、開始番地$100008から追うと、eiが$100094に存在。その後$100130番地に飛んでいます。
$100130からコードを見るとすぐ下にjalコードが2つあるので、その2つ目($100140)に目星をつけます。
試しにまず形式(1)で確認。コードはF0100140 000001FC、暗号化するとEC878268 1456E609。
これを入力して開始すると、ゲーム中画面枠がフラッシュ。あっさり成功。形式(2)に変更すると、マスターコードは
EC878268 1456E60A
となります。

○マスターコード作成実践例2:形式(3)/"三國志7"の場合
同じようにBOOTFILEの$100008から追うと、eiは$100088に存在、その後$1e2790に飛んでいます。$1e2790からコードを見ると下にjalコードが連なっているので、ここではその3つめ($1e27bc)に目星をつけてみます。
まず形式(1)で確認。F01E27BC 000001FC = EC89A8E4 1456E609 を入力。起動直後はうまくフラッシュしていて、アドレス自体はOKのようですが、ゲームを開始するとフラッシュが止まってしまいます。
これでは良くないので、次は形式(3)を使う手だてを考えます。
形式(1)のフラッシュはアドレス$120000E0に$00FF0000と$00FFFFFFを交互に書いて実現しています。このアドレスを変化させると背景の色が変わるようなので、減算コードを利用して、
(Ver1.6以前)30010001 120000E0 →暗号化→ 2C988329 0656E705
(Ver1.6J以降)30200001 120000E0 →暗号化→ 2CB78329 0656E705
を試してみたいマスターコードと一緒に入力しておくと、形式(3)及び(4)でのチェックに役立ちます。ちなみに$10000000を越えたアドレスなので、ここでは0、1、2コードは利用できません。
形式(3)のマスターコード、F01E27BC 0000000E = EC89A8E4 1456E79B と、上記フラッシュコードを入力して起動します。今度はゲーム中も背景が点滅。うまくいっているようです。ということでマスターコードは
EC89A8E4 1456E79B
となります。

○マスターコード作成実践例3:形式(4)/"ラブスマッシュ"の場合
まずアドレス部は実践例1及び2と同様の方法で追い、ei後のjalのアドレス、$10014cに設定します。
今度はデータ部で形式(4)を使う方法を試してみます。この場合ゲーム中定期的に呼ばれるサブルーチン内のアドレスを指定する訳ですが、カラットのこの種のコードをいくつか調べたところ、
"scePadRead"サブルーチン内の"memcpy"へのjalコードが位置するアドレスになっているようです。名前からいってPADの状態を読む場所ですから、定期的に呼ばれているであろうと推測できます。
といってもまず、どこが"scePadRead"サブなのかを知る必要があります。"ラブスマッシュ"の場合は、幸運にもシンボル情報がBOOTFILE内に残っていますので、これをps2disに読ませれば簡単に探す事ができます。
"scePadRead"は$149ba0〜、"memcpy"に対するjalコードは$149bfcに存在しますので、ここをフックアドレスに設定します。形式(4)なので下位2bitは11となりますので、マスターコードは
F010014C 00149BFF
暗号化すると
EC878274 144A4C0C
となり、これはカラットが公表しているものと同一になります。また、チェックには実践例2と同様のコードが利用できます。

問題はBOOTFILE内にシンボル情報が存在しない場合(の方がほとんど)に、"scePadRead"サブ内の"memcpy"へのjalがどこにあるかを特定する方法なのですが、
ps2disにはシンボルを持つファイルからのシンボルのインポート機能があるので、それで調べる事もできますが、
現在のところ以下のようなパターンを検索する事によってお手軽に位置を調べる事もできそうです。(もし違うパターンがあった場合ご報告ください)
0040802D   daddu     s0, v0, zero
0220202D   daddu     a0, s1, zero
8E060060   lw        a2, 0x60(s0)
0C######   jal       0x########    ←このjalコードが存在する位置
0200282D   daddu     a1, s0, zero
8E020060   lw        v0, 0x60(s0)
DFBF0020   ld        ra, 0x20(sp)
DFB10010   ld        s1, 0x10(sp)
DFB00000   ld        s0, 0x00(sp)
03E00008   jr        ra
27BD0030   addiu     sp, sp, 0x30
または
8E260000   lw        a2, 0x00(s1)
0C######   jal       0x########    ←このjalコードが存在する位置
########   addiu     a1, a1, 0x08等
8E220000   lw        v0, 0x00(s1)
DFBF0030   ld        ra, 0x30(sp)
DFB20020   ld        s2, 0x20(sp)
DFB10010   ld        s1, 0x10(sp)
DFB00000   ld        s0, 0x00(sp)
03E00008   jr        ra
27BD0040   addiu     sp, sp, 0x40

参考/PS2 syscall抜粋
syscall $10 .. AddIntcHandler (引数: a1 = 割り込み処理開始アドレス)
syscall $14 .. _EnableIntc
syscall $20 .. CreateThread   (引数: 4(sp) = スレッド開始アドレス)
syscall $22 .. StartThread
syscall $2b .. RotateThreadReadyQueue

■Ver.違いによる差異■
今回調査したのは3つのバージョンです。

A)Ver.1.3 ( 2001/02/21 , VER 1.3 )
B)体験版 ( 2001/06/11 , VER 1.7 ) - Ver.1.6相当
C)Ver.1.6J( 2001/08/10 , VER 1.9(KARAT 1.6) )

カッコ内はそれぞれ、SLPS_200.06の日付と、CD裏内周に書いてあるVER表示です。

VersionAでは、5/8コードは定義されていないので使用できません。
また、1つのデータ操作を1アクションとした場合、コードの行数の分だけのアクションしか行わない、という弊害があります。
アクション数はFコード(マスターコード)は0、4及び3000コードは書き込む回数分、その他は1として数えます。また、3003コードは行数2に対しアクション数は1となります。

たとえばFFXで、
・消費アイテムの上から4×8=32個分を99個に固定
40311B3C 00080001
63636363 00000000
というコードを暗号化して、
7CA89C64 144EE7A6
5BF6E487 00000000←最後は無意味なので0で良い
入力したとします。

仮にこの他に使用するコードはマスターコードだけ、とすると、コード行数3(マスターコード1行+4コードの2行)に対しアクション数は8となり、結果として3アクション分、4×3=12個分までしか効果が現れません。また、このコードのあとに他のコードが存在する場合は、4回以上機能するかわりに、最後の最大5つ分のコードが機能しなくなります。これを回避するには、コードの最後に5行分、無意味なコード(6、7、9コードなど)等を入力しておく必要があります。

VersionBとCは、3コードの扱いが異なります。Cでは3000〜3060の7種類がありますが、B以前は3000〜3003の4種であり、さらに3コードの次のコードは先頭数値に関らず4コードとなってしまう弊害があります。


■実行形式ファイルのヘッダフォーマット■
これはPS2PARとは直接関係ありませんが、これを知らないと逆アセンブルするにも開始アドレスが解らないという事にもなるので、ついでに記しておきます。ただし、逆アセンブルのために必要な情報のみです。

+$00 $7F,"ELF" (Executable and Linkable Format)
+$18 実行開始アドレス
+$38 バイナリデータ開始オフセットアドレス
+$3C 読み込まれるアドレス
+$44 読み込まれるバイト数
※以下、2つ以上のブロックがある場合
+$58 バイナリデータ開始オフセットアドレス(2)
+$5C 読み込まれるアドレス(2)
+$64 読み込まれるバイト数(2)
以下+$20で同様

■解析向け参考リンク■
DevLand PS2PS2DEVKVaks Home Page
以上海外サイト。GNU GCC/binutils、syscalls listや、R5900の逆アセンブラ/アセンブラ等が置いてあります。

hanimarさんのPS2 Linux関係のページ
PS2DIS、他有用な情報がいろいろ。
PS2DISはwindows用のPS1&2の実行形式バイナリ用の逆アセンブラです。
Psdisのps2対応版のようなものですが、解析に便利な様々な機能が付加されています。おすすめ。

ふぁおのぺえぢ
PS2 Disassembler、及びPS2PAR数値変換プログラムがあります。
PS2 Disassemblerは、海外のDISR5900にELFヘッダ解析と、vu/cop系特殊命令への対応を施したもののようです。
DOS用ですが、bootfileをドラッグしてやるだけでそのソースを作ってくれるのでお手軽です。

P S E X E
PS1用ツール類ですが、R3000用バイナリはR5900でもほぼそのまま使えるため、
EasyAsmR3000はPS2でもちょっとした改造をするのに便利です。

ps2linux付属説明書(PDF)..の説明
もし入手できたら、R5900及びPS2の仕様についてのかなり詳しい内容が載っています。


■暗号化数値リスト■
----------------------------
##  A0 A1 A2 A3  D0 D1 D2 D3
----------------------------
00  3C 97 83 28  14 56 E7 A5
01  3D 98 82 29  13 55 E6 A6
02  3A 95 85 26  16 54 E5 A7
03  3B 96 84 27  15 53 E4 A8
04  38 93 87 2C  18 5A EB A1
05  39 94 86 2D  17 59 EA A2
06  36 91 89 2A  1A 58 E9 A3
07  37 92 88 2B  19 57 E8 A4
08  44 9F 8B 30  0C 4E DF 9D
09  45 A0 8A 31  0B 4D DE 9E
0A  42 9D 8D 2E  0E 4C DD 9F
0B  43 9E 8C 2F  0D 4B DC A0
0C  40 9B 8F 34  10 52 E3 99
0D  41 9C 8E 35  0F 51 E2 9A
0E  3E 99 91 32  12 50 E1 9B
0F  3F 9A 90 33  11 4F E0 9C
10  4C 87 93 38  04 46 D7 B5
11  4D 88 92 39  03 45 D6 B6
12  4A 85 95 36  06 44 D5 B7
13  4B 86 94 37  05 43 D4 B8
14  48 83 97 3C  08 4A DB B1
15  49 84 96 3D  07 49 DA B2
16  46 81 99 3A  0A 48 D9 B3
17  47 82 98 3B  09 47 D8 B4
18  54 8F 9B 40  FC 3E CF AD
19  55 90 9A 41  FB 3D CE AE
1A  52 8D 9D 3E  FE 3C CD AF
1B  53 8E 9C 3F  FD 3B CC B0
1C  50 8B 9F 44  00 42 D3 A9
1D  51 8C 9E 45  FF 41 D2 AA
1E  4E 89 A1 42  02 40 D1 AB
1F  4F 8A A0 43  01 3F D0 AC
20  1C B7 A3 48  34 36 07 C5
21  1D B8 A2 49  33 35 06 C6
22  1A B5 A5 46  36 34 05 C7
23  1B B6 A4 47  35 33 04 C8
24  18 B3 A7 4C  38 3A 0B C1
25  19 B4 A6 4D  37 39 0A C2
26  16 B1 A9 4A  3A 38 09 C3
27  17 B2 A8 4B  39 37 08 C4
28  24 BF AB 50  2C 2E FF BD
29  25 C0 AA 51  2B 2D FE BE
2A  22 BD AD 4E  2E 2C FD BF
2B  23 BE AC 4F  2D 2B FC C0
2C  20 BB AF 54  30 32 03 B9
2D  21 BC AE 55  2F 31 02 BA
2E  1E B9 B1 52  32 30 01 BB
2F  1F BA B0 53  31 2F 00 BC
30  2C A7 B3 58  24 26 F7 D5
31  2D A8 B2 59  23 25 F6 D6
32  2A A5 B5 56  26 24 F5 D7
33  2B A6 B4 57  25 23 F4 D8
34  28 A3 B7 5C  28 2A FB D1
35  29 A4 B6 5D  27 29 FA D2
36  26 A1 B9 5A  2A 28 F9 D3
37  27 A2 B8 5B  29 27 F8 D4
38  34 AF BB 60  1C 1E EF CD
39  35 B0 BA 61  1B 1D EE CE
3A  32 AD BD 5E  1E 1C ED CF
3B  33 AE BC 5F  1D 1B EC D0
3C  30 AB BF 64  20 22 F3 C9
3D  31 AC BE 65  1F 21 F2 CA
3E  2E A9 C1 62  22 20 F1 CB
3F  2F AA C0 63  21 1F F0 CC
40  7C D7 C3 68  D4 96 27 65
41  7D D8 C2 69  D3 95 26 66
42  7A D5 C5 66  D6 94 25 67
43  7B D6 C4 67  D5 93 24 68
44  78 D3 C7 6C  D8 9A 2B 61
45  79 D4 C6 6D  D7 99 2A 62
46  76 D1 C9 6A  DA 98 29 63
47  77 D2 C8 6B  D9 97 28 64
48  84 DF CB 70  CC 8E 1F 5D
49  85 E0 CA 71  CB 8D 1E 5E
4A  82 DD CD 6E  CE 8C 1D 5F
4B  83 DE CC 6F  CD 8B 1C 60
4C  80 DB CF 74  D0 92 23 59
4D  81 DC CE 75  CF 91 22 5A
4E  7E D9 D1 72  D2 90 21 5B
4F  7F DA D0 73  D1 8F 20 5C
50  8C C7 D3 78  C4 86 17 75
51  8D C8 D2 79  C3 85 16 76
52  8A C5 D5 76  C6 84 15 77
53  8B C6 D4 77  C5 83 14 78
54  88 C3 D7 7C  C8 8A 1B 71
55  89 C4 D6 7D  C7 89 1A 72
56  86 C1 D9 7A  CA 88 19 73
57  87 C2 D8 7B  C9 87 18 74
58  94 CF DB 80  BC 7E 0F 6D
59  95 D0 DA 81  BB 7D 0E 6E
5A  92 CD DD 7E  BE 7C 0D 6F
5B  93 CE DC 7F  BD 7B 0C 70
5C  90 CB DF 84  C0 82 13 69
5D  91 CC DE 85  BF 81 12 6A
5E  8E C9 E1 82  C2 80 11 6B
5F  8F CA E0 83  C1 7F 10 6C
60  5C F7 E3 88  F4 76 47 85
61  5D F8 E2 89  F3 75 46 86
62  5A F5 E5 86  F6 74 45 87
63  5B F6 E4 87  F5 73 44 88
64  58 F3 E7 8C  F8 7A 4B 81
65  59 F4 E6 8D  F7 79 4A 82
66  56 F1 E9 8A  FA 78 49 83
67  57 F2 E8 8B  F9 77 48 84
68  64 FF EB 90  EC 6E 3F 7D
69  65 00 EA 91  EB 6D 3E 7E
6A  62 FD ED 8E  EE 6C 3D 7F
6B  63 FE EC 8F  ED 6B 3C 80
6C  60 FB EF 94  F0 72 43 79
6D  61 FC EE 95  EF 71 42 7A
6E  5E F9 F1 92  F2 70 41 7B
6F  5F FA F0 93  F1 6F 40 7C
70  6C E7 F3 98  E4 66 37 95
71  6D E8 F2 99  E3 65 36 96
72  6A E5 F5 96  E6 64 35 97
73  6B E6 F4 97  E5 63 34 98
74  68 E3 F7 9C  E8 6A 3B 91
75  69 E4 F6 9D  E7 69 3A 92
76  66 E1 F9 9A  EA 68 39 93
77  67 E2 F8 9B  E9 67 38 94
78  74 EF FB A0  DC 5E 2F 8D
79  75 F0 FA A1  DB 5D 2E 8E
7A  72 ED FD 9E  DE 5C 2D 8F
7B  73 EE FC 9F  DD 5B 2C 90
7C  70 EB FF A4  E0 62 33 89
7D  71 EC FE A5  DF 61 32 8A
7E  6E E9 01 A2  E2 60 31 8B
7F  6F EA 00 A3  E1 5F 30 8C
80  BC 17 03 A8  94 D6 67 25
81  BD 18 02 A9  93 D5 66 26
82  BA 15 05 A6  96 D4 65 27
83  BB 16 04 A7  95 D3 64 28
84  B8 13 07 AC  98 DA 6B 21
85  B9 14 06 AD  97 D9 6A 22
86  B6 11 09 AA  9A D8 69 23
87  B7 12 08 AB  99 D7 68 24
88  C4 1F 0B B0  8C CE 5F 1D
89  C5 20 0A B1  8B CD 5E 1E
8A  C2 1D 0D AE  8E CC 5D 1F
8B  C3 1E 0C AF  8D CB 5C 20
8C  C0 1B 0F B4  90 D2 63 19
8D  C1 1C 0E B5  8F D1 62 1A
8E  BE 19 11 B2  92 D0 61 1B
8F  BF 1A 10 B3  91 CF 60 1C
90  CC 07 13 B8  84 C6 57 35
91  CD 08 12 B9  83 C5 56 36
92  CA 05 15 B6  86 C4 55 37
93  CB 06 14 B7  85 C3 54 38
94  C8 03 17 BC  88 CA 5B 31
95  C9 04 16 BD  87 C9 5A 32
96  C6 01 19 BA  8A C8 59 33
97  C7 02 18 BB  89 C7 58 34
98  D4 0F 1B C0  7C BE 4F 2D
99  D5 10 1A C1  7B BD 4E 2E
9A  D2 0D 1D BE  7E BC 4D 2F
9B  D3 0E 1C BF  7D BB 4C 30
9C  D0 0B 1F C4  80 C2 53 29
9D  D1 0C 1E C5  7F C1 52 2A
9E  CE 09 21 C2  82 C0 51 2B
9F  CF 0A 20 C3  81 BF 50 2C
A0  9C 37 23 C8  B4 B6 87 45
A1  9D 38 22 C9  B3 B5 86 46
A2  9A 35 25 C6  B6 B4 85 47
A3  9B 36 24 C7  B5 B3 84 48
A4  98 33 27 CC  B8 BA 8B 41
A5  99 34 26 CD  B7 B9 8A 42
A6  96 31 29 CA  BA B8 89 43
A7  97 32 28 CB  B9 B7 88 44
A8  A4 3F 2B D0  AC AE 7F 3D
A9  A5 40 2A D1  AB AD 7E 3E
AA  A2 3D 2D CE  AE AC 7D 3F
AB  A3 3E 2C CF  AD AB 7C 40
AC  A0 3B 2F D4  B0 B2 83 39
AD  A1 3C 2E D5  AF B1 82 3A
AE  9E 39 31 D2  B2 B0 81 3B
AF  9F 3A 30 D3  B1 AF 80 3C
B0  AC 27 33 D8  A4 A6 77 55
B1  AD 28 32 D9  A3 A5 76 56
B2  AA 25 35 D6  A6 A4 75 57
B3  AB 26 34 D7  A5 A3 74 58
B4  A8 23 37 DC  A8 AA 7B 51
B5  A9 24 36 DD  A7 A9 7A 52
B6  A6 21 39 DA  AA A8 79 53
B7  A7 22 38 DB  A9 A7 78 54
B8  B4 2F 3B E0  9C 9E 6F 4D
B9  B5 30 3A E1  9B 9D 6E 4E
BA  B2 2D 3D DE  9E 9C 6D 4F
BB  B3 2E 3C DF  9D 9B 6C 50
BC  B0 2B 3F E4  A0 A2 73 49
BD  B1 2C 3E E5  9F A1 72 4A
BE  AE 29 41 E2  A2 A0 71 4B
BF  AF 2A 40 E3  A1 9F 70 4C
C0  FC 57 43 E8  54 16 A7 E5
C1  FD 58 42 E9  53 15 A6 E6
C2  FA 55 45 E6  56 14 A5 E7
C3  FB 56 44 E7  55 13 A4 E8
C4  F8 53 47 EC  58 1A AB E1
C5  F9 54 46 ED  57 19 AA E2
C6  F6 51 49 EA  5A 18 A9 E3
C7  F7 52 48 EB  59 17 A8 E4
C8  04 5F 4B F0  4C 0E 9F DD
C9  05 60 4A F1  4B 0D 9E DE
CA  02 5D 4D EE  4E 0C 9D DF
CB  03 5E 4C EF  4D 0B 9C E0
CC  00 5B 4F F4  50 12 A3 D9
CD  01 5C 4E F5  4F 11 A2 DA
CE  FE 59 51 F2  52 10 A1 DB
CF  FF 5A 50 F3  51 0F A0 DC
D0  0C 47 53 F8  44 06 97 F5
D1  0D 48 52 F9  43 05 96 F6
D2  0A 45 55 F6  46 04 95 F7
D3  0B 46 54 F7  45 03 94 F8
D4  08 43 57 FC  48 0A 9B F1
D5  09 44 56 FD  47 09 9A F2
D6  06 41 59 FA  4A 08 99 F3
D7  07 42 58 FB  49 07 98 F4
D8  14 4F 5B 00  3C FE 8F ED
D9  15 50 5A 01  3B FD 8E EE
DA  12 4D 5D FE  3E FC 8D EF
DB  13 4E 5C FF  3D FB 8C F0
DC  10 4B 5F 04  40 02 93 E9
DD  11 4C 5E 05  3F 01 92 EA
DE  0E 49 61 02  42 00 91 EB
DF  0F 4A 60 03  41 FF 90 EC
E0  DC 77 63 08  74 F6 C7 05
E1  DD 78 62 09  73 F5 C6 06
E2  DA 75 65 06  76 F4 C5 07
E3  DB 76 64 07  75 F3 C4 08
E4  D8 73 67 0C  78 FA CB 01
E5  D9 74 66 0D  77 F9 CA 02
E6  D6 71 69 0A  7A F8 C9 03
E7  D7 72 68 0B  79 F7 C8 04
E8  E4 7F 6B 10  6C EE BF FD
E9  E5 80 6A 11  6B ED BE FE
EA  E2 7D 6D 0E  6E EC BD FF
EB  E3 7E 6C 0F  6D EB BC 00
EC  E0 7B 6F 14  70 F2 C3 F9
ED  E1 7C 6E 15  6F F1 C2 FA
EE  DE 79 71 12  72 F0 C1 FB
EF  DF 7A 70 13  71 EF C0 FC
F0  EC 67 73 18  64 E6 B7 15
F1  ED 68 72 19  63 E5 B6 16
F2  EA 65 75 16  66 E4 B5 17
F3  EB 66 74 17  65 E3 B4 18
F4  E8 63 77 1C  68 EA BB 11
F5  E9 64 76 1D  67 E9 BA 12
F6  E6 61 79 1A  6A E8 B9 13
F7  E7 62 78 1B  69 E7 B8 14
F8  F4 6F 7B 20  5C DE AF 0D
F9  F5 70 7A 21  5B DD AE 0E
FA  F2 6D 7D 1E  5E DC AD 0F
FB  F3 6E 7C 1F  5D DB AC 10
FC  F0 6B 7F 24  60 E2 B3 09
FD  F1 6C 7E 25  5F E1 B2 0A
FE  EE 69 81 22  62 E0 B1 0B
FF  EF 6A 80 23  61 DF B0 0C
----------------------------
一番左の数値を暗号化すると各々右側の数値となります

しかし暗号化も面倒だが、そのコードの入力もえらく面倒だよねぇ。ほろり。

[戻る]