Я пытаюсь изучить реверс-инжиниринг, используя Minesweeper в качестве примера приложения. Я нашел эту статью MSDN о простой команде WinDbg, которая обнаруживает все мины, но она устарела, не объясняется подробно и действительно не то, что я ищу.
У меня есть дизассемблер IDA Pro и отладчик WinDbg, и я загрузил winmine.exe в оба из них. Может ли кто-нибудь дать несколько практических советов для любой из этих программ с точки зрения определения местоположения структуры данных, представляющей минное поле?
В WinDbg я могу устанавливать точки останова, но мне трудно представить, в какой момент устанавливать точку останова и в каком месте памяти. Точно так же, когда я просматриваю статический код в IDA Pro, я не уверен, где даже начать искать функцию или структуру данных, представляющую минное поле.
Есть ли в Stackoverflow обратные инженеры, которые могут указать мне правильное направление?
источник
Ответы:
Часть 1 из 3
Если вы серьезно относитесь к реверс-инжинирингу - забудьте о трейнерах и чит-движках.
Хороший реверс-инженер должен сначала узнать ОС, основные функции API, общую структуру программы (что такое цикл выполнения, структуры окон, процедуры обработки событий), формат файла (PE). Классика Петцольда «Программирование Windows» может помочь (www.amazon.com/exec/obidos/ISBN=157231995X), а также онлайновый MSDN.
Сначала вы должны подумать о том, где можно вызвать процедуру инициализации минного поля. Я подумал о следующем:
Решил проверить команду акселератора F2.
Чтобы найти код обработки ускорителя, вам нужно найти процедуру обработки оконных сообщений (WndProc). Это можно отследить по вызовам CreateWindowEx и RegisterClass.
Читать:
Откройте IDA, окно импорта, найдите «CreateWindow *», перейдите к нему и используйте команду «Перейти по внешней ссылке к операнду (X)», чтобы увидеть, где он вызывается. Звонок должен быть только один.
Теперь найдите функцию RegisterClass и ее параметр WndClass.lpfnWndProc выше. В моем случае я уже назвал функцию mainWndProc.
Нажмите Enter на имени функции (используйте 'N', чтобы переименовать его во что-нибудь получше)
Теперь посмотрим на
Это идентификатор сообщения, который при нажатии кнопки F2 должен содержать значение WM_COMMAND. Вы должны найти, где он сравнивается с 111h. Это можно сделать либо путем отслеживания edx в IDA, либо путем установки условной точки останова. в WinDbg и нажатия F2 в игре.
В любом случае приводит к чему-то вроде
Щелкните правой кнопкой мыши 111h и выберите «Символьная константа» -> «Использовать стандартную символьную константу», введите WM_ и Enter. Теперь у вас должно быть
Это простой способ узнать значения идентификаторов сообщений.
Чтобы понять работу с ускорителем, ознакомьтесь с:
Достаточно много текста для одного ответа. Если интересно, могу написать еще пару постов. Короче говоря, минное поле хранится в виде массива байтов [24x36], 0x0F показывает, что байт не используется (играет меньшее поле), 0x10 - пустое поле, 0x80 - мое.
Часть 2 из 3
Хорошо, давайте продолжим с кнопкой F2.
В соответствии с использованием ускорителей клавиатуры при нажатии кнопки F2 функция wndProc
Хорошо, мы уже нашли, где обрабатывается WM_COMMAND, но как определить соответствующее значение параметра wParam? Вот где в игру вступает ресурсный хакер . Накормите его двоичным кодом, и он вам все покажет. Нравится таблица ускорителей для меня.
альтернативный текст http://files.getdropbox.com/u/1478671/2009-07-29_161532.jpg
Вы можете видеть здесь, что кнопка F2 соответствует 510 в wParam.
Теперь вернемся к коду, который обрабатывает WM_COMMAND. Он сравнивает wParam с разными константами.
Используйте контекстное меню или сочетание клавиш 'H' для отображения десятичных значений, и вы можете увидеть наш прыжок
Это приводит к фрагменту кода, который вызывает некоторую процедуру и завершает работу wndProc.
Это функция, которая запускает новую игру? Узнай это в последней части! Следите за обновлениями.
Часть 3 из 3
Давайте посмотрим на первую часть этой функции.
Два значения (dword_10056AC, uValue) считываются в регистры eax и ecx и сравниваются с двумя другими значениями (dword_1005164, dword_1005338).
Взгляните на фактические значения с помощью WinDBG ('bp 01003696'; на break 'p eax; p ecx') - мне они показались размерами минного поля. Игра с нестандартным размером минного поля показала, что первая пара - это новые измерения, а вторая - текущие. Зададим новые имена.
Чуть позже новые значения перезаписывают текущие и вызывается подпрограмма.
И когда я это увидел
Я был полностью уверен, что нашел массив минных полей. Причина цикла, который начинается с массива длиной 360 байт (dword_1005340) с 0xF.
Почему 360h = 864? Ниже приведены некоторые подсказки, что строка занимает 32 байта, а 864 можно разделить на 32, поэтому массив может содержать 27 * 32 ячеек (хотя пользовательский интерфейс допускает максимальное поле 24 * 30, есть одно байтовое заполнение вокруг массива для границ).
Следующий код генерирует верхнюю и нижнюю границы минного поля (0x10 байт). Надеюсь, вы видите повторение цикла в этом беспорядке;) Мне пришлось использовать бумагу и ручку
А остальная часть подпрограммы рисует левую и правую границы.
Разумное использование команд WinDBG может предоставить вам классный дамп минного поля (нестандартный размер 9x9). Проверьте границы!
Хм, похоже мне понадобится еще один пост, чтобы закрыть тему
источник
Похоже, вы пытаетесь разобрать исходный код, но вам нужно посмотреть объем памяти запущенной программы. В шестнадцатеричном редакторе HxD есть функция, которая позволяет вам это сделать.
Как только вы окажетесь в области памяти, вам нужно будет сделать снимки памяти, пока вы возитесь с платой. Изолируйте, что меняется, а что нет. Если вы думаете, что знаете, где находится структура данных в шестнадцатеричной памяти, попробуйте отредактировать ее, пока она находится в памяти, и посмотрите, изменится ли в результате плата.
Процесс, который вам нужен, мало чем отличается от создания «трейнера» для видеоигры. Обычно они основаны на обнаружении в памяти таких значений, как здоровье и боеприпасы, и их изменении на лету. Возможно, вы сможете найти несколько хороших руководств по созданию игровых трейнеров.
источник
Ознакомьтесь с этой статьей проекта кода, она немного глубже, чем упомянутая вами запись в блоге.
http://www.codeproject.com/KB/trace/minememoryreader.aspx
редактировать
И эта статья, хотя и не о тральщиках напрямую, дает вам хорошее пошаговое руководство по поиску памяти с помощью WinDbg:
http://www.codingthewheel.com/archives/extracting-hidden-text-with-windbg
Редактировать 2
Опять же, речь идет не о сапере, но он определенно дал мне пищу для размышлений по поводу отладки памяти, здесь есть множество руководств:
http://memoryhacking.com/forums/index.php
Кроме того, загрузите CheatEngine (упомянутый Ником Д.) и прочтите руководство, с которым он поставляется.
источник
В яблочко!
Что ж, вы можете поискать подпрограммы вроде random (), которые будут вызываться во время построения таблицы mines. Эта книга очень помогла мне, когда я экспериментировал с реверс-инжинирингом. :)
В общем, хорошие места для установки точек останова - это вызовы окон сообщений, вызовы воспроизведения звука, таймеры и другие подпрограммы Win32 API.
Кстати, я сейчас сканирую тральщик с OllyDbg .
Обновление: nemo напомнил мне отличный инструмент Cheat Engine от Эрика «Dark Byte» Хейнена.
Cheat Engine (CE) - отличный инструмент для наблюдения и изменения пространства памяти других процессов. Помимо этого основного средства, CE имеет больше специальных функций, таких как просмотр дизассемблированной памяти процесса и внедрение кода в другие процессы.
( настоящая ценность этого проекта в том, что вы можете загрузить исходный код -Delphi- и посмотреть, как были реализованы эти механизмы - я сделал это много лет назад: o)
источник
Хорошую статью по этой теме можно найти на Uninformed . Он довольно подробно описывает реверсирование Minesweeper (как введение в обратное проектирование приложений Win32) и представляет собой отличный ресурс.
источник
Этот веб-сайт может быть более полезным:
http://www.subversity.net/reversing/hacking-minesweeper
Общий способ сделать это:
В ответ на Bounty
Что ж, при втором чтении кажется, что вам нужно руководство по использованию отладчика, такого как WinDBG, а не обычный вопрос о том, как выполнить обратное проектирование. Я уже показал вам веб-сайт, на котором указаны значения, которые нужно искать, поэтому вопрос в том, как вы их искать?
В этом примере я использую Блокнот, потому что у меня не установлен Minesweeper. Но идея та же.
Вы печатаете
Нажмите «?», А затем «s», чтобы увидеть справку.
После того, как вы нашли нужный шаблон памяти, вы можете нажать alt + 5, чтобы вызвать средство просмотра памяти для красивого отображения.
К WinDBG нужно привыкнуть, но он не хуже любого другого отладчика.
источник
Хороший момент для начала трассировки в отладчике - это навести курсор мыши. Итак, найдите процедуру главного окна (я думаю, что такие инструменты, как spyxx, могут проверять свойства окон, и адрес обработчика событий является одним из них). Зайдите в него и найдите, где он обрабатывает события мыши - там будет переключатель, если вы сможете распознать его в ассемблере (посмотрите значение WM_XXX для мыши вверх в windows.h).
Поместите там точку останова и начните действовать. Где-то между моментом, когда вы отпустите кнопку мыши и обновлением экрана, victum получит доступ к структуре данных, которую вы ищете.
Будьте терпеливы, попытайтесь определить, что делается в любой момент времени, но не утруждайтесь слишком глубоким изучением кода, который, по вашему мнению, не представляет интереса для вашей текущей цели. Чтобы решить эту проблему, может потребоваться несколько запусков отладчика.
Также помогает знание обычного рабочего процесса приложений win32.
источник
Мины, вероятно, будут храниться в виде двумерного массива. Это означает, что это либо массив указателей, либо единственный массив логических значений в стиле C.
Всякий раз, когда форма получает событие «вверх», на эту структуру данных делается ссылка. Индекс будет рассчитываться с использованием координаты мыши, возможно, с использованием целочисленного деления. Это означает, что вам, вероятно, следует искать
cmp
инструкцию или аналогичную инструкцию, в которой один из операндов вычисляется с использованием смещения, аx
гдеx
- результат вычисления, включающего целочисленное деление. Тогда смещение будет указателем на начало структуры данных.источник
Вполне разумно предположить, что информация о минах размещена в памяти непрерывно, по крайней мере, для строк (т.е. это 2D-массив или массив-массив). Таким образом, я бы попытался открыть несколько соседних ячеек в одной строке, создавая дампы памяти процесса по мере продвижения, а затем различать их и искать любые повторяющиеся изменения в той же области памяти (т.е. 1 байт изменен на первом шаге, следующий байт изменился на точно такое же значение на следующем шаге и т. д.).
Также есть вероятность, что это упакованный битовый массив (3 бита на каждую должно быть достаточно для записи всех возможных состояний - закрыто / открыто, мое / нет, помечено / не помечено), поэтому я бы тоже обратил внимание на это ( шаблоны также будут повторяться, хотя их труднее обнаружить). Но это не очень удобная структура, и я не думаю, что использование памяти было узким местом для Minesweeper, поэтому маловероятно, что подобные вещи будут использоваться.
источник
Хотя это не совсем «инструмент реверс-инженера», а скорее игрушка, которую мог бы использовать даже такой идиот, как я, попробуйте Cheat Engine . Это несколько упрощает отслеживание того, какие части памяти были изменены, когда, и даже имеет положения для отслеживания измененных частей памяти с помощью указателей (хотя вам, вероятно, это не нужно). Включен хороший интерактивный учебник.
источник