2001/09/11 更新
KTPatch Ver.1.00 Copyright (C) 2001 K.Takata 1.概要 汎用パッチ当てプログラムです。バイナリファイルの中から指定された特 定のパターンを探し出し、パッチを当てます。(汎用とは言いながら、現バ ージョンにはかなり多くの制約がありますが。) 2.動作環境 ・Win9x DOS 窓など 3.使用方法 コマンドラインから以下のように入力するだけです。ただし、foo.ktp は、 4.での説明にしたがって書かれたパッチデータファイルのファイル名とし ます。 > KTPatch foo.ktp これで、KTPatch は、まず foo.ktp に書かれている、ターゲットファイ ル(パッチを当てるべきファイル)の名前を読み込みます。次にターゲット ファイルの拡張子を ".org" に変えたファイル名でバックアップを取ります。 既に同名のファイルが存在する場合は、処理を中止します。あとは foo.ktp に書かれている内容に従って、ターゲットファイルにパッチが当てられます。 パッチ当て処理中には、パッチを当てたアドレスと、どのようにパッチを当 てたのかが(fc /b と同様の形式で)表示されます。もしパッチ当てに失敗 した場合は、ターゲットファイルは、バックアップから自動的に書き戻され ます。 4.パッチデータファイル(KTP ファイル)の書き方 KTPatch 用のパッチデータファイル(以下 KTP ファイル)は、単なるテ キストファイルです。普通のテキストエディタで書いてください。他のファ イルとの区別をするために拡張子は ".ktp" とすることを推奨します。 以下は KTP ファイルの例です。なお、行番号は説明のためのもので、実 際に KTP ファイルを書く際には行番号は付けないようにしてください。 1: *KTPatch:100 2: ; "foo.exe" に対するパッチファイル 3: filename=foo.exe 4: 5: ; コードに対するパッチの例 6: ; jnz -> jmp 7: *patch 8: 3b 45 08 75 19 9: 3b 45 08 eb 19 10: 11: ; 文字列に対するパッチの例 12: *patch 13: "Hello, world" 0a 00 14: "Hi, world" 0a 00 00 00 00 15: 行頭が ';'(セミコロン)となっている行はコメントと見なされます。2, 5, 6, 11行目はコメントです。 KTP ファイルの 1行目は、"*KTPatch:" という文字列で始まっていなけれ ばなりません。大文字・小文字も一致していなければなりません。':' の後 の数字はファイル形式のバージョンを示しています。KTPatch Ver.1.00 で 扱える KTP ファイルは、この数字が 100 のものだけです。 3行目では、パッチを当てる対象となるファイル名を指定しています。 "filename=" の後にターゲットファイル名を書いてください。なお '=' の 前後に空白を入れてはいけません。この場合は "foo.exe" がターゲットフ ァイルとなります。LFN(Long File Name) も使用可能です。また、 "filename=" の行より前には、空行またはコメント行(および KTP ファイ ル認識行 = 1行目)しか書くことができません。 7 - 9行目と 12 - 14行目 は、パッチデータです。7, 12行目の "*patch" の文字列は、その次の 2行に実際のパッチデータが書かれていることを示し ています。"*patch" の書かれた次の行はパッチを当てる前のデータを示し、 その次の行はパッチを当てた後のデータを示します。データは、16進数で 2 桁の数字を書き並べる方法と、文字列を '"' でくくって書く方法の2つが あります。パッチを当てるデータに応じて使い分けてください。なお '"' 自身を文字列に含めることはできません。代わりに 16進 2桁で 22 と書い てください。 7 - 9行目は "foo.exe" の中の、3b 45 08 75 19 というバイト列を 3b 45 08 eb 19 に置換するということを意味しています。3b 45 08 75 19 と いうバイト列が複数ある場合は、最初に見つかった部分にだけパッチを当て ます。複数の箇所に同じパッチを当てる場合は、その回数分だけ同じパッチ データを書き連ねる必要があります。 12 - 14行目 は "Hello, world\n"(C言語表記)という文字列を "Hi, world\n" に置換するということを意味しています。この置換は、7 - 9行目 で指定されている 3b 45 08 75 19 のバイト列よりも後の部分のうち最初に 出てくる "Hello, world\n" という文字列に対して行われます。すなわち、 1つのターゲットファイルに対して複数箇所のパッチを当てる場合は、パッ チデータは、その箇所のアドレス順に並んでなければならないということで す。また、パッチデータのアドレスは重なっていてはいけません。14行目の 最後の 00 00 00 の部分は、パッチ前のサイズとパッチ後のサイズを一致さ せるためのものです。現バージョンの KTPatch では、パッチ前とパッチ後 のデータのサイズは一致していなければなりません。なお 13, 14行目は以 下のように書いても同じことです。 13: 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a 00 14: 48 69 2c 20 77 6f 72 6c 64 0a 00 00 00 00 パッチを当てるべき箇所が1つでも見つからなかった場合は、パッチ当て は失敗となります。 5.コンパイル方法 コンパイラには LSI C-86 3.30c 試食版と、拙作の LFN library を利用 しています。 > lcc ktpatch.c -lintlib としてコンパイルしてあります。また、VC++ 6.0、BC++ 5.5.1 でもコンパ イルできることを確認しています。 6.更新履歴 2001/09/11 Ver.1.00 ・最初の公開バージョン。 7.注意事項、その他 ・このプログラムはフリーソフトウェアです。 ・このプログラムの著作権は作者である私 K.Takata(高田 謙)に帰属しま す。 ・もしこのプログラムを使用することで何らかの問題が発生しても作者はい っさいの責任を負いません。各自の責任で使用してください。 ・アーカイブを変更しない限り配布/転載は自由です。 ・リバースエンジニアリングの禁止はいたしません。 ・このプログラムを元にして新たなプログラムを作って公開する際は、その ことを明記しなければなりません。 a. このプログラムのソースを元に新たなプログラムを作って公開する際 は、ソースを公開しなければなりません。 b. このプログラムをリバースエンジニアリングして新たなプログラムを 作って公開する際は、そのプログラムのリバースエンジニアリングを 禁止してはなりません。 作者 : K.Takata(高田 謙) E-mail : kentkt@anet.ne.jp, HZL03275@nifty.ne.jp URL : http://webs.to/ken/