ハードウェアキーの話 Feb.13 '95 By H.Kashima Nティーサーブのベンダーフォーラムなどでは、しばしばバージョンアップソフト をディスクイメージでそのまま配布している。 ところが、そのようなソフトは多く の場合ハードウェアキーやパスワードによってプロテクトされているのが常識である。 また、プロテクトプロセスがデバッガなどで解析しにくく作ってある事は言うまで もない。 あるソフトのハードウェアキーは、パラレルポートに接続される。 /STROBE 信号 が電源となっており、/STROBEが Lo、つまり、プリンターアクセス中はキーは動作し ないようになっている。 キーへの信号は4本あり、D0(フレーム?), D1(クロック), D2(ロード?), D4(データ入力) で、BUSY信号がデータ出力となる。 1フレーム は、1ビットの入出力データ転送である。 [1フレーム] D0: 001111111111111111111100000011 D1: 101010101010101010101010101011 D2: 111111001111111111111111111111 D4: 11111111dddddddddddddddd111111 すべての dは同じ値 BU: 000000000000000000000XX0000000 プログラムからは、起動時のチェックの他に、アプリケーションの操作をするごと に不特定のサブルーチンからチェックされる。 エラーがでしだい、0x0000セグメント をアクセスして一般保護エラーにて終了するようになっている。 キーの回路構成は、 シフトレジスタ+キーロジックで構成されていると考えられ、最後のデータ入力は 最長で 20フレーム後の出力に影響することが判っている。 [プログラムのチェックプロセス] a. 起動時 あらかじめ決まっているビット列を入力し、その出力ビットの合計をチェックする。 b. 各処理時 グローバル変数にキー値をおいて、各処理をするときにその値を使ってハードキーに アクセスする。 恐らく、その後にキー値更新ルーチンを経て、矛盾が生じたら 一般 保護エラーをぶっこいて自爆するようになっているとおもわれる。 なぜ一般保護エラー かというと、データー領域のセグメントを配列に持っておいて、その配列をキーからの 情報にあわせて変化させるために、キー情報に誤りがあるとデタラメなセグメント情報 を返し、一般保護エラーに陥るという仕組みである(?)。 [結論] 起動時チェックはソフト的にバイパスできるものの、各処理チェックはもはや訳が わからんので、もうキーの等価回路を作ってしまうしかない。 さあどうやってつくろ うか。;(^^) ..... 結局できませんでした。 ;(^^)