【Python】番地へ移動しバイナリデータを書き換える

【Python】番地へ移動しバイナリデータを書き換える

先日、バイナリエディタを使って特定の番地のデータを書き換える、ということがありました。こういう作業は、ひとつふたつ書き換えるだけなら気になりませんが、変更する箇所が多いと地味に怠いものです。

でもやってることは、①番地に移動する②バイナリデータを上書きする、を繰り返すだけです。なんだかプログラムを使えば楽そうなので、Pythonでプログラムを作ることにしました。

ところが、コード量の割に以外と一筋縄ではいかないんですよ。こんなのに何時間も掛かってしまいました。

サンプルコード

address = [0xFFFFF, 0xEEEEE, 0xDDDDD]
data = [b'\x00', b'\x01', b'\x02']
binary = open('binary.exe', 'r+b')

for i in range(len(address)):
  binary.seek(address[i])
  binary.write(data[i])

binary.close()

型の違い

番地も書き込むデータも、どちらも16進数です。しかし、データ型が異なります。番地はint型の16進数。書き込むデータはbytes型となります。

表示されるデータと実際のデータの違い

bytes型のデータは、ASCIIで表示できる場合に限り、ASCIIでコンソールに出力されます。データ自体は変わっていません。どういうことなのかは、下をご覧下さい。

>>> print(b'\x00')
b'\x00'
>>> print(b'\x4f')
b'0'
>>> print(hex(ord(b'\x4f')))
0x4f

色々やってる内にb'U'みたいな値になってやっと気がつきましたが、b'0'とかだと紛らわしすぎる。普段からbytes型のデータを扱っていないと、間違えやすいです。

おわりに

ハマリポイントをまとめてみました。もう書くことがないので、便利なサイトを1つご紹介。今はバイナリエディタいらないんですね。WEB上でできちゃう。

HexEd.it - Browser-based Online Hex Editing:
https://hexed.it/

お知らせ

現在お知らせはありません。

最近の投稿

シェア