以下は、あなたが説明しているように見える小さなPythonプログラムです。
#!/usr/bin/env python3
from hashlib import sha1
with open('binaryfile', 'rb') as bin:
binary = bin.read()
base = 0x0078
# ... is not valid Python; add more sequences, or take it out (or see below)
for seq in [[0xCA, 0xC5, 0xC5, 0x8A], [0xCB, 0xC5, 0xC5, 0x8A], ...]:
copy = binary[0:base]
copy += bytes(seq)
copy += binary[base+len(seq):]
if sha1(copy).hexdigest() == '9968733ce3ff0893bbb0a19e75faaf2fb0000e19':
print('success with bytes {0}'.format(seq))
break
else:
print('no success')
国連簡単なテストのみ。タイプミスを見つけたら私にpingを送ってください。
base
4つのバイトを適用しようとする指定し、長い文字列'996873
...期待SHA1の16進数表現です。行for seq in
...は、試行するバイトを定義しています。そしてもちろん'binaryfile'
、サルベージしようとするファイルへのパスに置き換えます。
あなたはリテラルリストを[[0xCA, 0xC5,
... ]]
すべての可能な値を実際にループするもので置き換えることができますが、それは基本的にもっと便利なものの単なるプレースホルダーです。
何かのようにfor seq in itertools.product(range(256), repeat=4)):
0から2までのすべての可能な値を超える意志ループ32 -1。(import itertools
その場合、上部近くに追加する必要があります。)または、単にオフセットを追加することもできます。スクリプトを更新して、現在のものfor seq in
を次のものに置き換えます(ここでもimport
、メインプログラムの前に移動する必要があります)。
import struct
for n in range(2**32):
val=(n+0x8AC5C5CA) % 2**32 # notice reverse order
seq=list(reversed(struct.pack(">I", val)))
copy = ...
私はそれ0x8AC5C5CAから0x8AC5C5CBに自然に刻みますが、次の増分は0x8AC5C5CC等になるようにバイトの順序を逆にstruct
魔法からそれをルックアップするために持っていたバイトのシーケンス(にこれを変換することです// stackoverflowの:httpsを。 com / a / 26920983/874188)。これは、0x8AC5C5CAから始まり、0xFFFFFFFFに移動し、次に0x00000000に戻り、0x8AC5C5C9に戻ります。
複数の候補範囲がある場合、特定の順序で調べたいと思うでしょう。
for rge in [(0x8AC5C5CA, 0x8AFFFFFF), (0x00C6C58A, 0x00FFFFFF),
(0x00000000, 0x00C6C589), (0x01000000, 0x8AC5C5C9)]:
for val in range(*rge):
seq=list(reversed(struct.pack(">I", val)))
copy = ...
ただし、本当にすべてを調べたい場合は、(開始、終了)のペアrge
が0x00000000と0xFFFFFFFFの間のすべてのスペースをカバーしていることを確認する必要があります。(また、範囲は最後のバイトをインクリメントし、指定seq
された要件に従って、値のバイトを逆に適用することに注意してください。)
2つの異なるbase
アドレスを使用したい場合、ブルートフォースを使用して一生の間に実行可能な制限にすぐに立ち向かいます。しかし、たとえば、4バイトの数値を2つの2バイト部分に分割し、それらを異なるオフセットで適用することもできます。
base1 = 0x1234
base2 = 0x2345
for seq in range(whatever):
copy = binary[0:base1]
copy += bytes(seq[0:1])
copy += binary[base1+2:base1+base2]
copy += bytes(seq[2:3])
copy += binary[base2+2:]