Ваш вопрос касается корректного изменения двоичного файла на основе смещений, которые вы получаете с помощью IDA и HxD. Проблема заключается в неправильном вычислении смещений, а также в том, как правильно записывать изменения в файл на основе этих смещений.
Чтобы помочь вам решить эту задачу, давайте разберем несколько ключевых аспектов:
Смещения, которые вы получаете из IDA или HxD, скорее всего, являются логическими (виртуальными) адресами. Однако реальный файл может быть скомпилирован с различными механизмами, такими как статическая линковка, выравнивание данных, сегментирование и сдвиги для динамических библиотек (.so).
Когда вы работаете с двоичными файлами (.so), важно различать:
Чтобы корректно преобразовать виртуальные адреса в физические смещения, необходимо учитывать базовый адрес загрузки и возможные изменения, происходящие при компиляции или загрузке библиотеки.
Если вы хотите изменить данные по виртуальному адресу, вам нужно вычислить физическое смещение с учетом загрузочного адреса.
Для этого:
info->segment->start
в IDA или в ELF
заголовках).Например, если базовый адрес вашей библиотеки равен 0x10000000
, а смещение, которое вы получили из IDA или HxD, равно 0x173596
, то физическое смещение будет:
physical_offset = virtual_offset - base_address
physical_offset = 0x173596 - 0x10000000 = 0x073596
Теперь вы можете использовать это физическое смещение для изменения файла.
Теперь, чтобы изменить файл с использованием Python и mmap
, вы можете использовать следующий подход:
import mmap
import os
# Путь к вашему файлу
file_path = 'filetomodify.so'
# Получение физического смещения (например, 0x073596)
physical_offset = 0x073596
# Новый набор байтов для записи
new_data = bytes.fromhex("95 E5 0A 2F 66 1E 32 EE 4C B8 9A 6E BD EC 01")
# Открытие файла
with open(file_path, 'r+b') as f:
# Маппинг файла в память
mm = mmap.mmap(f.fileno(), 0)
# Запись данных по физическому смещению
mm[physical_offset:physical_offset + len(new_data)] = new_data
# Закрытие mmap
mm.close()
В этом коде:
mmap
для отображения файла в память.dd
)Если вы хотите использовать Bash для этого, вот пример команды:
#!/bin/bash
# Файл для изменения
file="filetomodify.so"
# Физическое смещение (например, 0x073596)
offset="0x073596"
# Новые байты
data="95 E5 0A 2F 66 1E 32 EE 4C B8 9A 6E BD EC 01"
# Использование dd для записи
echo "$data" | xxd -r -p | dd of="$file" bs=1 seek=$offset conv=notrunc
Этот скрипт:
xxd
.dd
для записи данных в файл, начиная с указанного смещения.Если вы хотите использовать PHP, то вот пример:
<?php
$file = 'filetomodify.so';
$offset = 0x073596; // Физическое смещение
$new_data = hex2bin('95 E5 0A 2F 66 1E 32 EE 4C B8 9A 6E BD EC 01');
$fp = fopen($file, 'r+b');
if ($fp === false) {
die('Unable to open file.');
}
fseek($fp, $offset);
fwrite($fp, $new_data);
fclose($fp);
?>
Этот код:
fseek()
для перемещения на нужное смещение.fwrite()
.Чтобы корректно изменить данные в двоичном файле, важно правильно вычислить физическое смещение. Используя вышеуказанные подходы для Python, Bash или PHP, вы сможете модифицировать файл на основе смещений, полученных через IDA или HxD.
Основной задачей здесь является правильная интерпретация виртуальных адресов и их преобразование в физические смещения, с учетом базового адреса и структуры ELF-файла.