バイナリパッチ¶
バイナリパッチは、デバイス上のファイルやプログラムにパッチを適用するために使用します。十六進ワイルドカードを用いて検索・置換を行い、上位/下位ワイルドカードに対応しています。たとえば、?? は任意の 1 バイトを表し、B? は上位ニブルが B である任意のバイト(つまり B0-BF)を表します(例: BA、B1、B9)。パターン 49 BA ?? ?C は、ファイル内でこのパターンに一致する任意のバイト列とマッチします。次の呼び出しは、test.bin 内の AA BB CC D? に一致するすべてのバイト列を AA BB CC DD に置き換え、置換の数と各置換のオフセットを返します。
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin")
>>> result = d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin")
>>> print(result.count)
1
>>> print(result.replaces[0].offset)
8123
注釈
デモでは 4 バイトのマッチと置換のみを示していますが、実際のインターフェースは任意の長さのマルチバイトのマッチと置換をサポートしています。ただし、マッチパターンには少なくとも 2 つの有効な十六進文字(つまり、ワイルドカードでないバイトが少なくとも 1 つ)が必要です。
置換の最大数を制限する必要がある場合は、maxreplace パラメータで設定できます。デフォルトでは、一致するすべての項目が置換されます。
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin", maxreplace=2)
また、dryrun パラメータを有効にするとテストモードになり、実際の置換操作を行わずに、ファイル内の一致位置を検索するのみとなります。
d.hex_patch("AA BB ?? ??", "AA BB 00 00", "/data/test.bin", dryrun=True)
ヒント
ファイルパスではワイルドカード (glob) を使用したマッチングがサポートされています。たとえば /data/app/*/test.bin は、/data/app ディレクトリ直下の任意のサブディレクトリにある test.bin ファイルにマッチします。