項書き換え機能付きプログラムは、そのプログラムが自分自身の命令を書き換える場合を指します。データの項目を書き換える場合は、ここでは含みません。ただし、プログラムの流れを、データを書き換えることによって実現する場合には、似たような現象があるかもしれません。
ゲームソフトウェアでは、内容を読まれないようにするためなどで、自分のプログラムの中身を、プログラム自身で書き換えてから実行するものがありました。
それらのプログラムのデバッグを依頼され、項書き換え機能の付いたソフトウェアをディスアセンブルするソフトウェアを自作したことがあります。
バイナリデータまたはメモリのバイナリの状態を読み込んで、intel 8086のアセンブラを生成するものです。
第一段階 静的ディスアセンブル
プログラムの起動位置から、バイナリデータを読み込んで、アセンブラのソースコードに変換していきます。ファイルを全部済ませたら終了します。
ひとつながりのプログラムで、プログラム項目の書き換えがなければ、これで終了です。
第二段階 一度の書き換え
プログラムの初期段階で、メモリの中身を書き換える機能があれば、その部分を、ディスアセンブラから呼び出して実行を模擬試験(simulation)します。メモリの中身を書き換えを終えた状態で、その書き換えた番地に飛ぶ命令があれば、飛んだところからディスアセンブルを再開します。
この項書き換えが1度だけであれば、対応はさほど難しくはありませんでした。
第三段階 複数回の書き換え
項書き換えが何度あるかがわかっていないと、項書き換え後のメモリの中に、また項書き換えの機能があるかを自動的に探すソフトにしないといけないため、やや複雑そうです。どこまでが項書き換え機能で、どこが単なるデータなのか。
ジャンプ命令がないなと思ったら、データ領域だと思っているところに、コードがあってそこからJMPしているとか。
厳密な設計にしようとすると複雑になりすぎて、第二段階だけで断念しました。
備考
Basicで作成しました。
参考文献
項書換えシステムからLispプログラムへの変換系, 戸村哲、二木厚吉, ソフトウェア基礎論17-11, 情報処理学会, 1986
http://bit.ly/2CMSr7p
p.s.
Z80のディスアセンブラの作成を依頼されたこともあります。しかし、Z80はパチンコの当選確率の演算で用いるものがあり、悪用される可能性が確認できなかったためお断りした記憶があります。
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.