Nの世界

【 Pオプション付きプロテクト対策 】

●はじめに

ちょっと前に、掲示板上で話題になっていたBASICリスト不可視に関する話題についてです。
ただ、市販ソフトの不可視解除には、余り向いていない気がします。
なお、この章を書く上で、「はじめてのマシン語」 前田光男著を参考にさせて頂きました。

●Pオプション付きだと?

Pオプションを付けて保存したプログラムに対しては、以下の7つの命令を使用出来ません。
・LIST ・LLIST ・MON ・POKE ・PEEK ・BSAVE ・BLOAD
確かに、この命令が使用不可になってしまえば、プログラムの中身を見る事が出来ない気がします。

●解除の原理

ワークエリアEC29H番地に00Hを書込む。それだけです。
(ちなみに、Pオプション付きの場合、一般的に20Hが書いてあるようです。)
しかし、MONとPOKE文が封印された状態では、該当番地に書込む事が出来ません。

●未使用命令に着目

未使用命令のジャンプテーブルのアドレスを書換えて、マシン語のプログラムの先頭に飛ぶように
すれば、未使用命令実行時に、そのプログラムが実行されます。
そのプログラムに、Pオプションを解除するコードを記述すれば、Pオプションを解除出来ますし、
モニタプログラム(mon)に入るコードを記述すれば、モニタに入る事が出来ます。
(これは別の機会があれば説明するかも…)

●Pオプションの解除

コードの細かい説明は省略します。
該当未使用命令(今回は、ISET)のジャンプテーブルのアドレスをEC29H番地に00Hに書換えるプログラムの
先頭にしているだけです。

< コード >
F220 3E 2A 32 AB EE 3E F2 32 AC EE 3E 00 32 29 EC C3
F230 E5 50 00

< 保存方法 >
BSAVE ”pof”, &HF220, &H2FH(要DISK BASIC)

< 実行方法 >
1.BLOAD ”pof”, &HF220, r(要DISK BASIC)
2.Pオプションのかかっているプログラムをロードする。
3.iset

●NEWしたプログラムの復活

ただ、上記方法だと、古いBASICで作られた市販ソフトのプログラムを見る事が出来ません。
そこで、リセットを行い、プログラムを消した後、プログラムを復活させる事でプログラムを
見る方法を考えてみました。

●復活の原理

NEWやリセットをかけたプログラムは完全にメモリから消される訳ではありません。
リンクポインタと終わりを示すポインタのみが消されます。
従って、そのポインタのみ復活させれば良いです。

●リンクポインタの復活

以下のプログラムでリンクポインタ復活を試みます。
10 PRINT ”TEST”
20 GOTO 10

まず、消去前のテキストエリアの状態を見てみます。
消去前

次に、リセットした後のテキストエリアの状態を見てみます。
消去後

見て頂ければ、分かると思いますが、8001H〜8002H番地の0E00Hが0000Hに書き換わっています。
この書き換わっている部分がリンクポインタです。ちなみに、0000Hはプログラムの終了を意味します。

次に、0000Hに書き換わってしまったリンクポインタの元の値を調べる方法を説明します。
最初の行の終わりには、00Hが必ず格納されています。従って、00H捜せば良いという事になります。
但し、リンクポインタの次の2byteは、行番号なので、00Hが入る可能性があります。
よって、行番号以降で、00Hを捜す事になります。

この例の場合、800DH番地に00Hがあるので、次の800EH番地となりますと言いたいのですが、
実は違います。ウィンドウを利用しているので、8000H番地台から表示されているだけで、
実際には、0000H番地台にあります。従って、000EHが正解となります。(消去前参照の事)

●プログラムの復活

では、実際に上記のプログラムの復活を試みます。
1.MON
2.h]O70,0
※ウィンドウを強制的に0000H番地にする。
(800H0番地に表示されるデータが0000H番地でない場合がある)
3.h]E8000
4.次のリンクポインタの位置を00Hを手掛かりに捜す(この例の場合、000EH番地)
5.上位バイトと下位バイトを入れ替えてリンクポインタを書込む。(Z80の仕様らしい)
 (この例の場合、0E00Hとなる)
6.[ESC]
7.[CTRL]+[B]

●まとめ

以下に、掲示板にて、やーくんさんに教えて頂いたリストを掲載しておきます。
これ1つで、Pオプション解除とNEWしたプログラムを復活出来ます。
(内容については、私自身もうちょっと勉強しないと…。(汗))

< コード >
F320 2A 58 E6 36 FF CD C0 05 CD 1A 4F AF 32 29 EC C3
F330 7B 04

< 保存方法 >
BSAVE ”ファイル名”, &HF320, &H2FH(要DISK BASIC)

< 実行方法 >
1.MON
2.h]EF320で、上記のコードを打込む。
3.[ESC]
4.[CTRL]+[B]
※事前に、プログラムを打込んでおいて、BLOAD ”pof”, &HF320, r
(要DISK BASIC)でプログラムをロードしても良いです。
5.A=&HF320:CALL A


【 おまけ 】へ続く



Return