|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.11.2012, 16:05 | #1 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Обучающий материал Рекардо Норвахи об исследовании программ
Приветствую, друзья! Цель данной темы объединить силы тех кто занялся (или занимается) исследованием программ по материалам статей Рекардо Норвахи: http://wasm.ru/series.php?sid=17 и прояснить вопросы, которые возникают по ходу решения задач.
Хочется добиться того, чтобы все учебные примеры из статей Рекардо Норвахи были подробно разобраны здесь. Статьи Рекардо ориентированны на начинающих и не хотелось бы оставлять пробелов, тем более на этом этапе. Сразу отмечу, что исследование программ законно, если мы просто удовлетворяем своё любопытство и повышаем уровень понимания того, как работают программы. Цель - это научиться исследовать, чтобы понимать. Никакие знания не будут использоваться в корыстных (недобрых) целях. К статьям не прилагается содержания. А ведь это удобная штука, когда что-то быстро нужно вспомнить, а найти - проблема. Вот содержание для первых 8 статей, которые касаются необходимых навыков работы с отладчиком Ollydbg и ассемблером (следующие главы (после 8-ой) посвящены непосредственно исследованию программ): Глава 1 - Ссылка для скачивания Ollydbg - Ссылка для скачивания "подопытной" программы "CrackMe" - Обзор среды отладчика Ollydbg (настроек, окон, кнопок) - Подключение плагинов. Ссылка для плагина: CmdBar Глава 2 - Системы счисления - Отрицательные шестнадцатеричные числа - ASCII-символы - Стек Глава 3 - Регистры - Флаги Глава 4 - NOP (NO OPERATION) - PUSH - POP - PUSHAD - POPAD - MOV - MOVSX (Move with Sign-Extension) - MOVZX (Move with Zero-Extend) - LEA (Load Effective Address) - XCHG (Exchange Register/Memory with Register) Глава 5 - INC и DEC - ADD - ADC (ADD с переносом) - SUB - SBB - MUL (умножение без знака) - IMUL (умножение со знаком) - DIV (Unsigned Divide) / IDIV (Signed Divide) - XADD (Обменять и сложить) - NEG - AND - OR - XOR - NOT Глава 6 - CMP - TEST (логическое сравнение) - JMP – переход - JE, JZ – переход, если равно нулю - JNE, JNZ – переход, если не равно нулю - JS – переход, если знак отрицателен - JNS – переход, если знак не отрицателен - JP, JPE – переход, если чётно - JNP, JPO – переход, если нечётно - JO – переход, если произошло переполнение - JNO – переход, если переполнения не произошло - JB, JNAE – переход, если ниже - JNB, JAE – переход, если выше или равно - JBE, JNA – переход, если ниже или равно - JNBE, JA – переход, если выше - JL, JNGE – переход, если меньше - JNL, JGE – переход, если больше или равно - JLE, JNG – переход, если меньше или равно - JNLE, JG – переход, если больше - Насторойка подсветки JMP'ов Глава 7 - CALL и RET Глава 8 - Циклы - LOOP - MOVS - REP - LODS - STOS - CMPS - Прямая адресация - Косвенная адресация Последний раз редактировалось 8Observer8; 17.11.2012 в 16:09. |
17.11.2012, 16:07 | #2 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Теперь перейду к вопросам, которые меня давно уже появились.
Почему Ollydbg после открытия exe-файла останавливает выполнение в модуле ntdll? Что это за модуль - ntdll? Вот так выглядит Log: Последний раз редактировалось 8Observer8; 17.11.2012 в 16:12. |
17.11.2012, 16:12 | #3 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Может потому что после открытия функция запуска собственно завершается именно на этом месте в этом модуле?
Ты выясни что это за адрес, какой функции пренадлежит. Думаю это как раз точка возврата после действий загрузки модулей под отладку, посему Оля просто случайно там останавливается, показывая первое на что проц смотрит (или смотрел в этот момент)
I'm learning to live...
|
17.11.2012, 16:22 | #4 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
|
17.11.2012, 16:35 | #5 | ||
equ asm
Участник клуба
Регистрация: 02.05.2009
Сообщений: 1,605
|
Цитата:
Цитата:
У меня, опять таки, все работает и без этого. |
||
17.11.2012, 19:49 | #6 | ||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Цитата:
В главе 9 написано: Цитата:
Мне приходится нажимать два раза F9, чтобы добраться до точки входа. Да, попробовал. Нормально запускается, но я запускаю вот так: Я летом помню дочитал до 20 статьи (с чем-то ) было много вопросов. Сейчас я их забыл. Решил начать перечитывать с 9-ой (первые 8 перечитал пока писал содержание). Теперь знаю, где вопросы буду писать |
||
18.11.2012, 08:26 | #7 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
На заметку. Три способа попасть в внутрь функции (глава 9):
1. Через адрес (Go to -> Expression (или Ctrl+G)) - вводим в Command Bar: ? MessageBoxA - нажимаем Enter - справа от Command Bar появилось значение адреса: 77D504EA - правая кнопка мыши в листинге (CPU) и выбираем: Go to -> Expression (или Ctrl+G) - вводим полученное значение адреса 77D504EA - нажимаем OK 2. Через имя функции (Go to -> Expression (или Ctrl+G)) - правая кнопка мыши в листинге (CPU) и выбираем: Go to -> Expression (или Ctrl+G) - вводим имя функции: MessageBoxA - нажимаем OK 3. Через полный список имён API'шных функций (Search for -> Name (label) in current module (или Ctrl+N)) - правая кнопка мыши в листинге (CPU) и выбираем: Search for -> Name (label) in current module (или Ctrl+N) - в появившимся окне начинаем набирать: MessageBoxA - правая кнопка мыши на имени функции MessageBoxA - выбираем Follow import in Disassembler Последний раз редактировалось 8Observer8; 18.11.2012 в 08:30. |
18.11.2012, 18:43 | #8 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Заметка. Патч для CrackMe.exe (глава 9)
Написал другой способ. Без точек останова. Данный метод годится только для этой программы и то только после того, как прочитал, какие переходы совершаются. - программа остановлена на Entry Point - правая кнопка мыши в листинге (CPU) и выбираем: Search for -> All intermodular calls - запускаем CrackMe.exe в отладчике (F9) - находим все MessageBox'ы: - ищем MessageBox с "благоприятным исходом" для этого: правая кнопка мыши по MessageBox'у -> Follow in Disassembler (или нажимаем Enter на строке с MessageBox'ом) -> выделяем начало функции (начало квадратной скобки) -> правая кнопка мыши по Local call from 0040124C -> Go to CALL from 0040124C - меняем JE на JMP: - переходим по другому "негативному" вызову (CALL 00401362) для этого: правая кнопка мыши по строке CALL 00401362 -> Follow (или Enter): - запоминаем адрес вызова фукнции MessageBoxA (это 00401378) - правая кнопка мыши в листинге (CPU) и выбираем: Search for -> All intermodular calls - выбираем MessageBox c адресом, который неравен ранее запомненному и неравен "благоприятному" - правая кнопка мыши по MessageBox'у -> Follow in Disassembler (или нажимаем Enter на строке с MessageBox'ом) - выделяем строку с треугольной скобкой (первая треугольная скобка выше вызова MessageBox'а) - смотрим откуда был переход и ставим NOP на команде перехода (для этого выделяем JB -> нажимаем пробел и вводим NOP) - сохраняем изменения, как написано в статье, для этого: правый щелчёк в любом месте листинга -> Copy to executable -> All modifications - выбираем опцию Copy all чтобы перенести все изменения - открывается новое окно, в котором нужно опять сделать правый щелчёк - Save file - сохраняем файл под НОВЫМ именем Последний раз редактировалось 8Observer8; 18.11.2012 в 19:15. |
22.11.2012, 19:02 | #9 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
На заметку. Обычная точка останова (глава 10)
Чтобы установить обычную точку останова, нужно: - либо [правая кнопка мыши в листинге (на месте установки) -> Breakpoint -> Toggle] [Или выделить строчку -> нажать F2] - либо двойной щелчёк в области машинного кода (колонка с байтами) по строчке с инструкцией в окне дизассемблера - либо ввести в Command Bar: bp Address Чтобы снять обычную точку останова, нужно: - либо [правая кнопка мыши в листинге (на месте установки) -> Breakpoint -> Toggle] [Или выделить строчку -> нажать F2] - либо двойной щелчёк в области машинного кода (колонка с байтами) по строчке с инструкцией в окне дизассемблера - либо нажать на кнопку B на панели инструментов, выделить строку с точкой останова и удалить, нажав клавишу Del Обычная точка останова (bp) на инструкции вызова функции Устанавливаем точки останова на всех вызовах указанной функции в текущем модуле (окно Intermodular calls открывается само, после ввода команды bp MessageBoxA в Command Bar и нажатия Enter): Чтобы снять обычную точку останова, нужно: - либо [правая кнопка мыши в листинге (на месте установки) -> Breakpoint -> Toggle] [Или выделить строчку -> нажать F2] - либо двойной щелчёк в области машинного кода (колонка с байтами) по строчке с инструкцией в окне дизассемблера - либо нажать на кнопку B на панели инструментов, выделить строку с точкой останова и удалить, нажав клавишу Del Обычная точка останова (bpx) на первой команде внутри функции Устанавливаем точку останова на первой команде внутри функции: Последний раз редактировалось 8Observer8; 22.11.2012 в 19:10. |
23.11.2012, 22:43 | #10 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Точки останова на обращения к памяти BPM (глава 10)
- BPM можно установить только одну: на доступ, запись, чтение. Для этого выделяем байты в дампе -> ПКМ -> Breakpoint -> выбираем нужный тип BPM - BPM можно установить на секцию кода, для этого нужно нажать на панели инструментов кнопку М, выбрать секцию, нажать ПКМ и выбрать Set memory breakpoint on access (или Set memory breakpoint on write) - чтобы снять BPM нужно нажать ПКМ -> Remove memory breakpoint. Либо установить другую BMP (предыдущая удалится) Возврат в основной модуль из неосновного (при установки BPM на секцию кода) (глава 10) - снять BPM (cм. выше) - (ПКМ -> Execute till return) (или Ctrl+F9), далее по-шагам (F7 и F8) Процессорные точки останова (HBP) (глава 11) - HBP можно установить только четыре штуки. На выполнение, чтение, запись. На байт, слово, двойное слово Чтобы установить HBP: - либо ПКМ -> Breakpoint -> Hardware, on execution (Hardware, on write или Hardware, on read) - либо в CommandBar: he Address - либо (если на функции) в CommandBar: he MessageBoxA Чтобы снять HBP: - в меню: Debug -> Hardware breakpoints -> удаляем, нажав кнопку Delete в окне Условная точка останова (это обычная точка останова (bpx), но с условием) (глава 11) Чтобы установить: - (ПКМ -> Breakpoint -> Conditional) (или Shift+F2) -> вводим условие (см. справку в меню: Help -> Contens -> Breakpoints) Чтобы снять: - либо [правая кнопка мыши в листинге (на месте установки) -> Breakpoint -> Toggle] [Или выделить строчку -> нажать F2] - либо двойной щелчёк в области машинного кода (колонка с байтами) по строчке с инструкцией в окне дизассемблера - либо нажать на кнопку B на панели инструментов, выделить строку с точкой останова и удалить, нажав клавишу Del Примечание. Есть ещё условная точка останова с логированием (ПКМ -> Breakpoint -> Conditional log) (или Shift+F4). См. справку в меню: Help -> Contens -> Breakpoints. Логи можно сохранять в файл: в панели инструментов кнопку L -> ПКМ -> Log to file Доступ программы к серийнику (глава 12) - программа остановлена на Entry Point - открываем список всех API функций текущего модуля, для этого -> в любом месте листинга ПКМ -> Search for -> Name (label) in current module (Ctrl+N) - находим GetDlgItemTextA - ставим точку останова, для этого: (ПКМ по GetDlgItemTextA -> Toogle breakpoint on import) (или в CommandBar: bpx address или в CommandBar: bpx GetDlgItemTextA) - запускаем приложение (F9) - в стеке видим адрес буфера -> щелчёк в дампе -> Ctrl+G -> вводим адрес буфера -> Enter -> это имя - запускаем приложение (F9) - в стеке видим адрес буфера -> щелчёк в дампе -> Ctrl+G -> вводим адрес буфера -> Enter -> это серийник Message Breakpoints (BMSG) при нажатии на левую кнопку мыши (глава 12) - запускаем приложение (F9) - вводим имя и серийник, но не нажимаем ок - на панели инструментов нажимаем кнопку W - ПКМ по строке "Button" "OK" -> Message breakpoint on ClassProc - из списка выбираем сообщение WM_LBUTTONUP (под кодом 202h) - выбираем Break on any window - значение Pause program -> On message - значение Log WinProc arguments -> On message - нажимаем OK в окне регистрации - ставим BPM на секции главного модуля, для этого: на панели инструментов нажимаем кнопку M -> ПКМ по строке с адресом 401000 -> memory breakpoint on access - запускаем приложение (F9) - продолжаем нажимать F9 (получается выполнение по шагам) -> оказываемся вблизи вызовов GetDlgItemTextA Последний раз редактировалось 8Observer8; 23.11.2012 в 22:46. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
На чём писать обучающий сайт? | Алексей Голубов | PHP | 5 | 13.06.2012 16:23 |
TrinityCore C++ Обучающий проект. + DB MySQL | L30m4nc3r | Свободное общение | 2 | 26.06.2011 16:08 |
Обработка массивов экспериментальных данных при исследовании технических систем | monarx | Помощь студентам | 0 | 08.04.2011 01:07 |
Мультимедийный Обучающий Курс TeachPro Java Для Начинающих | mihali4 | Общие вопросы по Java, Java SE, Kotlin | 3 | 04.11.2008 05:39 |