2016-11-04 1 views
0

Я пытаюсь расшифровать простой код Ассамблеи, но я не очень разбираюсь в этом языке. Если у меня есть следующий блок кода в основной:Как определить, что находится в адресе Сборка вызывает

push %ebp 
8048a45:  89 e5     mov %esp,%ebp 
8048a47:  53      push %ebx 
8048a48:  83 e4 f0    and $0xfffffff0,%esp 
8048a4b:  83 ec 10    sub $0x10,%esp 
8048a4e:  8b 45 08    mov 0x8(%ebp),%eax 
8048a51:  8b 5d 0c    mov 0xc(%ebp),%ebx 
8048a54:  83 f8 01    cmp $0x1,%eax 
8048a57:  75 0c     jne 8048a65 <main+0x21> 
8048a59:  a1 c4 d7 04 08   mov 0x804d7c4,%eax ?? 
8048a5e:  a3 f0 d7 04 08   mov %eax,0x804d7f0 ?? 
8048a63:  eb 74     jmp 8048ad9 <main+0x95> 
8048a65:  83 f8 02    cmp $0x2,%eax 
8048a68:  75 49     jne 8048ab3 <main+0x6f> 
8048a6a:  c7 44 24 04 e8 a2 04 movl $0x804a2e8,0x4(%esp) 

На линиях 8048a59 и 048a5e, где я поставить знаки вопроса, я предполагаю, что он пытается установить все, что в адрес 0x804d7f0 к тому, что в адрес 0x804d7c4, но как узнать, что конкретно находится в этих адресах?

+0

У вас нет, если вы не знаете, что такое программа и что она делает. – Hannu

+1

Если вы можете заставить компоновщик выплевывать файл карты, вы должны получить список всех абсолютных адресов для ваших переменных. – Lundin

ответ

1

Прежде всего, вам необходимо определить, в какой секции соответствует этот адрес. Вы можете сделать это с помощью objdump objdump -h

Тогда вы можете разобрать раздел, который вам интересен, как его сделано here.

Here Некоторая полезная информация о просмотре разделов и их адресах.

Другой способ - использовать отладчик времени выполнения и просто распечатать память, например. x addr для gdb.


P.S. если вы хотите восстановить имя переменной, это может быть невозможно, потому что компилятор обычно удаляет такую ​​информацию для большинства символов.

+1

Используйте 'objdump -d -r' для печати информации о символах (« Перемещение ») для адресов, когда они доступны. Он добавляет комментарий, например '# 61d0c8 '. Остерегайтесь таких случаев, когда это не имеет никакого отношения к stderr, именно это был ближайший символ, все еще присутствующий в финальном двоичном файле. Он работает намного лучше на файлах .o', чем исполняемые файлы, поскольку компоновщик еще не выбрал информацию о символе для неглобальных статических данных. –

+0

На самом деле я использую 'alias disas = 'objdump -drwC -Mintel'', чтобы сделать это, уничтожить имена C++ и использовать синтаксис в стиле Intel. (И не обведите машинный код длинными инструкциями). –

Смежные вопросы