Эх... наконец-то я использую другие правила вместо pac и попробовал Privoxy и это работает. Вот что я сделал.
127.0.0.1:1234
. Hexdump ничего не знает об адресах (или памяти ). Он просто печатает поток байтов и добавляет к нему префикс с количеством байтов, просмотренных до сих пор. Если его ввод поступает из файла, эти числа, таким образом, соответствуют позиции в файле.
Чтобы выяснить, где эти байты оказываются в памяти после загрузки файла, необходимо просмотреть метаданные в файле. Для файлов ELF это означает заголовки разделов (, а иногда и заголовки программ ).
readelf -S path/to/your/binary
показывает что-то вроде этого:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
…
[13].text PROGBITS 000000000050eac0 0010eac0
0000000001833275 0000000000000000 AX 0 0 16
…
Здесь значение в разделе «Смещение» — это позиция в файле, где начинается конкретный раздел, а значение в разделе «Адрес» — это соответствующий виртуальный адрес (, где он заканчивается в памяти ). Вам просто нужно добавить разницу между этими двумя числами из hexdump
, чтобы получить адреса.
Вы также можете использовать objdump -h path/to/your/binary
для получения тех же данных:
Sections:
Idx Name Size VMA LMA File off Algn
…
12.text 01833275 000000000050eac0 000000000050eac0 0010eac0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
…
Опять же,«File off» — это смещение в файле, а «VMA» — соответствующий виртуальный адрес. Если вам интересно, что такое «LMA», посмотрите здесь .
Насколько я понимаю, абсолютные физические адреса хорошо защищены. Но есть способ найти логические адреса. В учебных целях вы можете написать простую программу на языке C, которая содержит бесконечный цикл и работает в фоновом режиме. Во время работы программы вы можете использовать «pmap», утилиту Linux, чтобы обойти виртуальный адрес вашей программы. команда для запуска исполняемого файла в фоновом режиме в Linux zsh:
executable_filename&
pmap -x process_id