# Binärer Patch

Binäre Patches werden verwendet, um Dateien oder Programme auf einem Gerät zu patchen. Es verwendet hexadezimale Wildcards zum Suchen und Ersetzen und unterstützt Wildcards für High- und Low-Nibbles. So steht `??` für ein beliebiges Byte, `B?` für ein beliebiges Byte, das mit `B` beginnt, wie z.B. `BA`, `B1`, `B9`. Der Wildcard `49` `BA` `??` `?C` wird beispielsweise jede Sequenz in der Datei finden, die mit `49` `BA` `..` `.C` übereinstimmt. Der folgende Aufruf ersetzt alle Byte-Sequenzen `AA` `BB` `CC` `D[0-9A-F]` in `test.bin` durch `AA` `BB` `CC` `DD`. Die Funktion gibt die Anzahl der Ersetzungen und deren Offsets zurück.

```python
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin")
```

```python
>>> 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
```

```{note}
Das Beispiel zeigt nur eine Übereinstimmung und Ersetzung von vier Bytes. Die Funktion unterstützt jedoch Übereinstimmungen und Ersetzungen beliebiger Byte-Länge, erfordert aber mindestens zwei gültige Hex-Zeichen für die Suche.
```

Um die maximale Anzahl der Ersetzungen zu begrenzen, verwenden Sie den Parameter `maxreplace`. Standardmäßig werden alle Vorkommen ersetzt.

```python
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin", maxreplace=2)
```

Es gibt auch einen Testmodus. In diesem Modus werden nur die übereinstimmenden Positionen in der Datei gefunden, ohne eine Ersetzung durchzuführen.

```python
d.hex_patch("AA BB ?? ??", "AA BB 00 00", "/data/test.bin", dryrun=True)
```

```{hint}
Der Dateipfad unterstützt Wildcard-Matching (Glob). Zum Beispiel wird `/data/app/*/test.bin` die Datei `test.bin` in jedem direkten Unterverzeichnis von `/data/app` finden und patchen.
```