# แพตช์ไบนารี (Binary Patch)

แพตช์ไบนารีใช้สำหรับแก้ไขไฟล์หรือโปรแกรมบนอุปกรณ์ โดยใช้ wildcard เลขฐานสิบหกในการค้นหาและแทนที่ รองรับ wildcard สำหรับ nibble (ครึ่งไบต์) เช่น `??` หมายถึงไบต์ใดก็ได้, `B?` หมายถึงไบต์ใดก็ได้ที่ขึ้นต้นด้วย `B` เช่น `BA` `B1` `B9` ดังนั้น wildcard `49` `BA` `??` `?C` จะจับคู่กับส่วนใดๆ ในไฟล์ที่ตรงกับ `49` `BA` `..` `.C` การเรียกใช้ฟังก์ชันด้านล่างนี้จะแทนที่ไบต์ทั้งหมดที่เป็น `AA` `BB` `CC` `D[0-9A-F]` ในไฟล์ test.bin ด้วย `AA` `BB` `CC` `DD` และฟังก์ชันจะคืนค่าจำนวนการแทนที่และตำแหน่ง offset ที่ถูกแทนที่

```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}
ในตัวอย่างนี้เป็นการสาธิตการจับคู่และแทนที่เพียงสี่ไบต์ แต่อินเทอร์เฟซรองรับการจับคู่และแทนที่ได้หลายไบต์ โดยต้องมีรูปแบบการค้นหาที่ถูกต้องอย่างน้อยสองอักขระ
```

หากต้องการจำกัดจำนวนการแทนที่สูงสุด สามารถตั้งค่าผ่านพารามิเตอร์ `maxreplace` ได้ โดยค่าเริ่มต้นคือแทนที่ทั้งหมด

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

นอกจากนี้ยังมีโหมดทดสอบ (dry run) ซึ่งจะทำการค้นหาตำแหน่งที่ตรงกันในไฟล์เท่านั้นโดยไม่ทำการแทนที่จริง

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

```{hint}
พาธของไฟล์ (file path) รองรับการใช้ wildcard (glob) ในการจับคู่ เช่น /data/app/*/test.bin จะค้นหาและจับคู่ไฟล์ test.bin ที่อยู่ในไดเรกทอรีระดับใดก็ได้ภายใต้ /data/app
```