![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Регистрация: 15.11.2012
Сообщений: 8
|
![]()
[QUOTE=8Observer8;1138108]cesco10, обратите внимание на ответ sauvage. Это уже готовое решение:
Если вас комментарии смущают, то без них так: Первое задание: Код:
|
![]() |
![]() |
![]() |
#12 |
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
|
![]() Код:
|
![]() |
![]() |
![]() |
#13 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Подробно, насколько смог.
- скачиваем Ollydbg по следующей ссылке (восьмая в списке) http://wasm.ru/toollist.php - распаковываем скаченный архив - запускаем Ollydbg.exe - открываем загружаем любой exe-файл c помощью Ollydbg, для этого нажимаем F3 (или в меню: File -> Open) и открываем любой exe-файл - так вот здесь минуточку если вы не выполнили предыдущие шаги, то читать дальше вам бессмысленно. И начните выполнять эту инструкцию, а не просто читать её - дальше мы видим листинг: ![]() Дальше показано: слева машинные команды, а справа мнемоника этих команд (PUSH, MOV и т.д.): ![]() - напишем наши команды, для этого нажимаем в листинге пробел (или щелчёк правой кнопкой мыши в листинге (на месте где мы ходим ввести команду) -> Assembly, должно появится окно (в котором мы вводим команду): ![]() - так должен выглядеть листинг после ввода команд: ![]() - обратите внимание на следующий рисунок, это Hex Dump (это оперативная память, из которой процессор считывает команды (PUSH, MOV и т.д.) и выполняет их): ![]() - найдём наши (введённые) команды в Hex Dump, для этого: щелчёк правой кнопкой мыши в области Hex Dump (прямо на байтах в таблице) -> Go to -> Expression (или Ctrl+G) и вводим адрес нашей первой команды PUSH 5: ![]() Последний раз редактировалось 8Observer8; 27.11.2012 в 22:44. |
![]() |
![]() |
![]() |
#14 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
- нажимаем OK и видим, как наши команды расположены в оперативной памяти:
![]() - теперь найдём эти команды (PUSH и POP) в официальной документации от Intel. Этой документации 5 томов: 253665 - Basic Architecture 253666 - Instruction Set Reference A-M 253667 - Instruction Set Reference N-Z 253668 - System Programming Guide, Part 1 253669 - System Programming Guide, Part 2 Там нужен третий том сейчас, так как команды PUSH и POP начинаются на 'P'. Копируем в поисковик (например, google) следующую строку: 253667 - Instruction Set Reference N-Z В поиске по открытому документу набираем: PUSH. Много нашёл, но мы будем искать с конца выданного списка (по разделу Numerics). Нажимаем на строке в документе: PUSH instruction, 4-285. Здесь можно прочитать всё о команде PUSH. Если проблемы с английским, то пользуйтесь http://translate.google.com/ Это я к тому, что нужно приучаться пользоваться первоисточниками, то есть официальной документацией. И так, продолжим. Стек - это область памяти, которая используется для хранения каких либо данных. Регистр ESP хранит адрес начала этой области памяти (стека). Видите, справа внизу отображается область стека (а ESP, как раз хранит этот адрес): ![]() Когда выполняется команда PUSH, то сначала ESP меняет значение (на размер помещаемых в стек данных), а потом значение копируется в ячейку на которую указывает ESP. Причём PUSH бывает разный. Данные могут копироваться из регистра (например EAX) или из ячейки памяти и т.д. И размер данных может быть разным (и ESP будет менять своё значение на разное число, в зависимости от размера копируемых в стек данных (байт, слово, двойное слово и т.д.)). Нажимаем F7 (или F8) (это выполнение пошагам) и смотрим, что произойдёт. Послы выполнения команды PUSH должен измениться ESP и константа содержимое регистра AX (2 байта) должно скопироваться в стек, смотрим, что так и есть: ![]() Теперь опять нажимаем на F7 (или F8). Выполняется ещё один PUSH. Теперь снова меняется ESP и уже содержимое регистра CX (2 байта) копируется в стек: ![]() В документации (которую мы рассмотрели выше) подробно написано, как работает PUSH: ![]() |
![]() |
![]() |
![]() |
#15 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Команда POP копирует данные из стека в регистр (или в оперативную память) и далее меняет указатель стека на величину данных (байт, слово (2 байта) и т.д.)). Значит при выполнении команды POP число 5 должно скопироваться в регистр BX (это младшее слово (2 байта) регистра EBX (4 байта)), а стек освобождается от этого числа (просто меняется указатель стака, 5 на своём месте может и остаться на какое-то время, но уже не в зоне "охраны" стека и ничто не гарантирует, что её (эту пятёрку) может другой PUSH затереть):
![]() Следующий POP копирует тройку в регистр BX (уничтожая пятёрку) и меняет указатель стека (стек освобождается от тройки): ![]() Подробно об языке ассембера и об отладчике Ollydbg написано по следующим ссылкам: http://wasm.ru/article.php?article=ollydbg01 http://wasm.ru/article.php?article=ollydbg02 http://wasm.ru/article.php?article=ollydbg03 http://wasm.ru/article.php?article=ollydbg04 http://wasm.ru/article.php?article=ollydbg05 Последний раз редактировалось 8Observer8; 27.11.2012 в 22:50. |
![]() |
![]() |
![]() |
#16 |
Форумчанин
Регистрация: 16.01.2011
Сообщений: 325
|
![]()
8Observer8, ну Вы энтузиаст! Нагорную проповедь прочтите, если ещё не читали, на досуге. В частности, обратите внимание на фразу: "...не мечите бисер перед свиньями..."
|
![]() |
![]() |
![]() |
#17 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Всё таки, если человек задал вопрос:
Значит хочет разобраться. И сейчас он понимает, что если он не повторит этой инструкции (которую я написал), то более сложные вещи, которые встретятся в будущем, станут ещё сложнее. Нужно ещё понимать следующую мысль: человеку нужно видеть границы абстракции. Во время этих операций происходит очень многое. Всё что нам нужно знать на уровне абстракции языка ассемблера описано в официальной документации. Глубже - это уже другая абстракция. Теперь у него есть оружие: отладчик Ollydbg и доступ к официальной документации. Что позволяет самому видеть, что должно происходить (из документации) и что происходит на самом деле (в отладчике). Здесь нужно понять одну простую вещь, что нужно увидеть в живую в отладчике, чем 100 раз на бумаге. Увидеть и выполнить пошагам. Незнание английского компенсируем переводчиком (http://translate.google.com/ и учим английский). Он же не будет теперь спрашивать про каждую команду: что присходит во время её выполнения. Теперь, он сможет сам искать описание каждой команды в официальной документации. Переводить переводчиком или с помощью словаря. Вводить команду в отладчик и смотреть, что происходит. Ещё мой знакомый говорит, что лучше сделать, чем не далать. Не жалею о потраченном времени ![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
не могу разобраться! | Apsalon | Microsoft Office Excel | 1 | 28.12.2010 18:54 |
Нужно разобраться со стеком | GladiatoR24 | Общие вопросы C/C++ | 1 | 08.05.2010 11:34 |
НЕ МОГУ РАЗОБРАТЬСЯ... | GSV84 | HTML и CSS | 0 | 03.02.2010 01:38 |