先日、バイナリエディタを使って特定の番地のデータを書き換える、ということがありました。こういう作業は、ひとつふたつ書き換えるだけなら気になりませんが、変更する箇所が多いと地味に怠いものです。
でもやってることは、①番地に移動する②バイナリデータを上書きする、を繰り返すだけです。なんだかプログラムを使えば楽そうなので、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/
0 件のコメント:
コメントを投稿