バイナリファイルにパッチを当てる
ファイルのnバイト目にバイナリデータを上書きします。ファイルサイズは変わりません。上書きする前に、元のバイナリデータを読んで、正しい場所にパッチを当てようとしているか確認します。
ポイントはファイルを「読み書き両方」「バイナリ」でオープンするところです。あとはseekしてread/writeをするだけ。
※はてなダイアリーの仕様により、コード上に余計なタグ(</pp>)が出てしまっていますが無視してください
PATCH = [ ('msnmsgr.exe', [ (0x0008CF08, '\xB7', '\xB6'), (0x000A9D87, '\x74', '\xEB'), (0x0021D15F, '\x8B\x86\xE0\x02\x00\x00', '\x33\xC0\x40\x90\x90\x90'), ]), ('msgsres.dll', [ (0x001A4259, 'layout=filllayout()', 'layoutpos=none '), (0x001A42CA, 'id=atom(adbanner)', ' '), (0x001AB38E, 'id=atom(colorizedropdownbtn)', 'layoutpos=none '), (0x001BD05A, 'id=atom(spacebtn)', 'layoutpos=none '), (0x001BD136, 'id=atom(msntodaybtn)', 'layoutpos=none '), (0x001BD215, 'id=atom(dialerbtn)', 'layoutpos=none '), (0x001BD5D8, 'id=atom(colorizedropdownbtn)', 'layoutpos=none '), (0x001BE92E, 'id=atom(idSearchContainer)', 'layoutpos=none '), (0x0020190D, 'id=atom(adbanner)', 'layoutpos=none '), (0x00233D30, 'id=atom(maininfobarholder)', 'layoutpos=none '), (0x001BDD45, '\x0D\x0A
このプログラムでは雑に書いていますが、もし公開物として作る場合は、実行中のファイルや書き込み権限のないファイル、あるいはseekがファイルサイズを超えちゃったときなど、きちんとエラーチェックを入れたほうがいいかと思います。
ちなみにこのパッチの内容ですが、
あたりを参考にして自前でWindows Live Messengerの広告を消そうとしたものです。使う場合は自己責任で。適用して被害を被っても私は責任は負いませんので念のため (^^;)