Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2012, 16:05   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 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.
8Observer8 вне форума Ответить с цитированием
Старый 17.11.2012, 16:07   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Теперь перейду к вопросам, которые меня давно уже появились.

Почему Ollydbg после открытия exe-файла останавливает выполнение в модуле ntdll? Что это за модуль - ntdll?



Вот так выглядит Log:


Последний раз редактировалось 8Observer8; 17.11.2012 в 16:12.
8Observer8 вне форума Ответить с цитированием
Старый 17.11.2012, 16:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может потому что после открытия функция запуска собственно завершается именно на этом месте в этом модуле?
Ты выясни что это за адрес, какой функции пренадлежит. Думаю это как раз точка возврата после действий загрузки модулей под отладку, посему Оля просто случайно там останавливается, показывая первое на что проц смотрит (или смотрел в этот момент)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2012, 16:22   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

При запуске Ollydbg выдаёт сообщение:



"Некоторые отладочные функции могут не работать". Это действительно так? И какие функции могут не работать? Как запустить от администратора? С этим нужно бороться? Хотелось бы понять, почему выскакивает это сообщение?
8Observer8 вне форума Ответить с цитированием
Старый 17.11.2012, 16:35   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Почему Ollydbg после открытия exe-файла останавливает выполнение в модуле ntdll?
Шут его знает, у меня как и должно, запускается на entry point. Может как-то связано с 64 разрядной виндой ?
Цитата:
Как запустить от администратора?
ПКМ - запуск от имени администратора ?
У меня, опять таки, все работает и без этого.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 17.11.2012, 19:49   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Может потому что после открытия функция запуска собственно завершается именно на этом месте в этом модуле?
Ты выясни что это за адрес, какой функции пренадлежит. Думаю это как раз точка возврата после действий загрузки модулей под отладку, посему Оля просто случайно там останавливается, показывая первое на что проц смотрит (или смотрел в этот момент)
К сожалению, как узнать, что это за адрес я не знаю. По остальному тоже ничего проверить не могу, так как опыта нет. Я эту информацию взял на заметку, позже вернусь к ней.

В главе 9 написано:

Цитата:
При загрузке приложения в OllyDbg, отладчик останавливается на точке входа, анализирует код и ждёт дальнейших инструкций от пользователя.
Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Может как-то связано с 64 разрядной виндой ?
Возможно... Так как в XP работает, как надо.

Мне приходится нажимать два раза F9, чтобы добраться до точки входа.

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
ПКМ - запуск от имени администратора ?
Да, попробовал. Нормально запускается, но я запускаю вот так:



Я летом помню дочитал до 20 статьи (с чем-то ) было много вопросов. Сейчас я их забыл. Решил начать перечитывать с 9-ой (первые 8 перечитал пока писал содержание). Теперь знаю, где вопросы буду писать
8Observer8 вне форума Ответить с цитированием
Старый 18.11.2012, 08:26   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 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.
8Observer8 вне форума Ответить с цитированием
Старый 18.11.2012, 18:43   #8
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 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.
8Observer8 вне форума Ответить с цитированием
Старый 22.11.2012, 19:02   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 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.
8Observer8 вне форума Ответить с цитированием
Старый 23.11.2012, 22:43   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 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.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На чём писать обучающий сайт? Алексей Голубов 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