各種システム開発・WEBコンテンツ制作・WEBデザイン・ホームページ制作・インフラ設計・構築・レンタルサーバー・ソフトウェア技術者のアウトソーシング事業を行っております。

1 月
30

パッチを当てる

技術スタッフ


ソフトウェア開発の用語に「パッチを当てる」という言葉があります。
バグを修正したり機能の追加や変更でプログラムやファイルを書き換えますが、
その対象が一部分だけで、わずかに追加や変更するケースを言います。
ちなみに、パッチの語源は「着物の継ぎあて」や「絆創膏」という意味の英語で、
パッチを当てるとは、穴の空いた(バグがある)プログラムにあて布(パッチ)を
当てて、穴(バグ)を塞ぐということです。
そして、今回話をするのは、プログラムやファイルを書き換えるのではなく、
今まさに動かしているプログラムを直接書き換える方法です。

一般的に、プログラムを修正・追加してテストする手順は、1.プログラムを修正・
追加する→2.ビルドする→3.生成ファイルをデバッガにロードする→4.テストをする、
になりますが、これをロードしたプログラムに直接手を加えます。

1.プログラムの隙間を探す
プログラムをビルドすると、基本的にファイルの上から順に配置されます。
また、関数の先頭アドレスは、下桁が0番地(例:1000番地)になるよう配置されます。
そのため、関数と関数の間には隙間が生じます。
修正するプログラムは、その隙間を使って埋め込んでいきます。

2.プログラムを埋め込むアドレスにブランチさせる
修正を加える数命令前をブランチ命令に置き換えます。
そして、ブランチ先には先ほどの置き換る前の命令を入れます。
例:命令2と命令3の間に修正プログラムを入れる時のイメージ
ブランチ元 ブランチ先(先頭は1020番地)
1000番地 命令1→1020番地にブランチ 1020番地 命令1を入れる
する命令に置き換え 1022番地 命令2を入れる
1002番地 命令2
1004番地 命令3

③修正するプログラムを入れる
ブランチ元 ブランチ先(先頭は1020番地)
1000番地 1020番地にブランチする命令 1020番地 命令1
1002番地 命令2 1022番地 命令2
1004番地 命令3 1024番地 修正プログラムを入れる

③本線に戻す
修正したプログラムの最後に、本線に戻すブランチ命令を入れます。
なお、ブランチ先は本来戻す(命令3)数命令先にします。
ブランチ元 ブランチ先(先頭は1020番地)
1000番地 1020番地にブランチする命令 1020番地 命令1
1002番地 命令2 1022番地 命令2
1004番地 命令3 1024番地 修正プログラム
1006番地 命令4 1040番地 ↑(1040番地まで入れたとする)
1042番地 命令3
1044番地 1006番地にブランチする命令

この手法を使っていた時は、まだCPUの処理速度が遅くて、ビルド(当時はアセンブリ
言語でプログラムを組んでいたのでアセンブルと呼んでいた)をするのに数分数十分
かかっていました。
現在はCPUの処理速度が上がり、また一つの修正でも規模が大きくパッチを当てる程度で
なくなったため使わなくなりましたが、知っていて損はない手法なのでお話ししました。

月別アーカイブ

カテゴリ