バイナリファイルにパッチを当てる

ファイルの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の広告を消そうとしたものです。使う場合は自己責任で。適用して被害を被っても私は責任は負いませんので念のため (^^;)