Как играть в сапера на компьютере секреты


Взламываем игру-головоломку «Сапер» / Habr

Intro

Холодным зимним вечером, начитавшись статей об исследовании различного ПО и насмотревшись различного рода видео про взломы игр и прочее, у меня вдруг тоже возникло желание повозиться под дебагерром с чем-нибудь интересным. Крякингом я занимаюсь сравнительно давно, поэтому практический опыт имеется. Поначалу я, как и многие, просто искал различные CrackME в сети и взламывал их с целью обучения, затем перешел на взломы платных приложений(поиск/подбор ключей) и написание различного рода KeyGen`ов. В данный момент «набиваю руку» и пытаюсь оттачивать мастерство взлома.
Ну да ладно, это лирическое отступление от сути. Теперь определимся с некоторыми деталями.

В данной статье главным объектом внимания для нас будет компьютерная игра «Сапер».
Исследование и последующая отладка приложения происходят под Windows 7 x64 (реализация игры «Сапер» отличается в различных версиях OS Windows).

В качестве дизассемблера будем использовать встроенный дебаггер CheatEngine. Мне он нравится своей простотой и изящностью, некоторые вещи в нем делаются гораздо легче, чем, например, в OllyDBG.

Окей, c деталями разобрались, приступим же к делу!

Наверняка, почти каждый, кто использует Windows, когда-либо имел дело с игрой «Сапер». В «семерке» игра выглядит так:

Это стандартное поле( в данном случае 16x16 клеток ). Мы будем ломать игру на среднем уровне сложности, т.е на уровне «Любитель». В общем-то для уровней сложности «Новичок» и «Профессионал» эта статья также будет актуальна, ничего кроме времени, количества мин и размеров поля не изменится.

1 этап

Итак, открываем наш CheatEngine( в дальнейшем будет использоваться сокращение CE ) и аттачимся к процессу игры:

Ок, присоединились. Поиск нужных нам значений будет основываться на поиске открытых в текущий момент клетках. Поэтому, ищем нужное нам значение текущего количества открытых клеточек. В CE это делается достаточно просто:

1) Вводим в поле «Value» первоначальное количество открытых клеток, т.е ноль, нажимаем на «First Scan»
2) Переходим в игру и кликаем на случайной клетке, после переходим в CE и в поле «Scan Type» выбираем «Increased Value»(значение увеличилось), жмем «Next Scan»

Делаем похожие действия, пока не найдем то самое, заветное значение:

Мы отыскали адрес, в котором хранится другой адрес, который, в свою очередь, хранит статическое значение.
Добавляем значение в «AddressList». Теперь если немного поиграть в игру, можно будет заметить, что значение меняется.

Теперь ищем asm-инструкцию, которая как-то взаимодействует с данным значением( меняет, читает ):

Открываем игру и еще немного играем, затем видим такую картину:

Ага, очень интересно :) Особенный интерес представляют 1 и 3 инструкции, так как они во-первых пишут в память, а во вторых они схожи и в общем счете выполняются целых 3 раза! Вот мы и переходим в дебаггер, выделив 1 или 3 инструкцию и нажав на кнопку «Show Disassembler».

Так, так, так, все становится интереснее и интереснее! Особый интерес представляет вот эта цепочка с заверщающим сравнением( cmp ):

Если повесим «бряк» на сравнение «cmp edx,eax», то при возврате в игру и попытке кликнуть на клетку, бряк сработает. При чем, как при клике на клетку с миной, так и при клике на обычную клетку. А что это значит? А значит это то, что где-то здесь происходит «распознавание» того, что находится под в закрытой клетке: пустота, мина или цифра. Пробуем изменить это значение на какое-либо бессмысленно сравнение, например, на такое:

Здесь, как некоторые поняли, главная задача — активация процессорного флага «Z», которая происходит в случае, если оба операнда инструкции CMP эквивалентны.
Возвращаемся в игру и кликаем по какой-либо закрытой клетке. В итоге:

Хах, прикольно! Оказывается, это была проверка " на выигрывание игры ", которая происходит при каждом клике по клетке поля, что в общем-то логично. Уже неплохо, но мы ведь хотим именно играть, минуя все мины, а не тупо выигрывать игру при открытии первой же клетки поля, верно? Так что, продолжаем наше исследование.

2 этап

Во втором этапе взлома мы постараемся выяснить, что является «переломным моментом» при распознавании «нутра» клетки, на которую пришелся клик. Ок, снова идем в CE и проделываем те же операции, что и в первом этапе, разве что дебажить код не требуется. Видим уже знакомую последовательность инструкций:

Попытаемся отыскать границы функции( блока инструкций ), в которой мы находимся в данный момент( где находится инструкция ):

Ага, и что же мы видим:

Нас визуально перекинуло в начало текущей функции. Это нам пока что еще ни о чем важном не говорит, но если поразмыслить, обдумать, все что имеем, то можем прийти к выводу, что данная функция может быть как-либо связана с графикой игры, например. К такому выводу можно прийти, исходя из 1 этапа, где мы отыскали проверку игры «на выигрывание», что, скорее всего, сказывается на отрисовке поля. Ладно, проверим эту теорию. Спускаемся от начала функции немного вниз, где вскоре обнаружим весьма интересную инструкцию:

Это первое сравнение в данной функции… Хм, попробуем поставить бряк на инструкцию, затем переходим в игру:

Мы не можем перейти в игру. Почему? Да потому что наша теория подтвердилась! Эта функция и правда связана с графикой игры. При каждой активации окна и прочем взаимодействии с игровым интерфейсом вызывается эта функция, а в ней установлен BreakPoint на сравнении => активировать окно и «Сапёрить» мы не сможем, пока не снимем бряк. Снимаем его. Есть вероятность, что данное сравнение играет ключевую роль в последующем поведении всей функции. Попробуем изменить данное сравнение на бессмысленно сравнение, чтобы флаг процессора «Z» активировался, как это было сделано в первом этапе:

Размер новой инструкции( 2 байта ) в 2 раза меньше, чем тот, что был изначально( 4 байта ), следовательно, добавились инструкции «nop» в 1 байт, чтобы «Занопалось» оставшееся пространство в 2 байта. Переходим в игру и пытаемся играть. Тыкаем по клеткам, натыкаемся на мину, и… ничего не произошло! Хм, не удивительно. Ладно, попробуем не включать, а выключать флаг процессора «Z». Для этого надо заменить сравнение на такое, чтобы два сравниваемых элемента никогда не были равными. Для этого восстанавливаем изначальную инструкцию:

cmp dword ptr [rax+38],01

и изменяем сравнение содержимого указателя, например, на сравнение с отрицательным числом( с -1 ):

Теперь возвращаемся в игру и начинаем «саперить». При клике на некоторые области, они отрисовываются с некоторым запозданием, или их «нутро» отрисовывается лишь со второго раза. Оно и верно, ведь мы нагло влезли в графическую функцию и беспощадно отдебажили её :). Зато при клике на «опасные области» с минами ничего не происходит вообще!
Результат:

Профит :) Мы хакнули игру «Сапер» из стандартного комплекта игр от Microsoft.

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

habr.com

Прохождение сапера на поле 9x9 с 32-мя минами / Habr

Вот до чего иногда доводят безобидные развлечения. 2 месяца назад я неожиданно увлекся игрой в сапера. Особенно мне было интересно побить рекорд не по времени, а по количеству мин на поле. На уровне игры «новичок» дается поле 9x9 и 10 мин. Разумеется, это было очень просто, и я стал наращивать количество мин. 12, 15, 20 штук, это была простая разминка. Затем прошел 25 после большого числа попыток. Игра с 27-ю минами (каждая 3-я клетка заминирована) отняла у меня несколько часов. Не остановившись на достигнутом, я выставил сразу 30 штук. Выиграл спустя полторы недели, играя по часу в день.

Более месяца пытался разминировать 32 мины, причем даже в лучших попытках оставалось найти около 10 мин, затем подрывался. А мне очень хотелось победы, и решил, что без радикальных мер могу затратить еще пару лет. Пришла мысль написать программу подсчета вероятности нахождения мины в каждой клетке, в любой момент игры.

Основная сложность в игре заключается в том, куда ткнуть, если полученные числа не дают однозначно определить наличие или отсутствие мины ни в одной клетке. Но, тем не менее, эти вероятности могут очень сильно отличаться. Если мы видим, что в данной клетке мина теоретически может быть, но это будет достигаться, если несколько мин будут располагаться в строго определенных местах, то конечно можно достаточно смело кликать по этой клетке. Но лично я слабо представляю, как можно математически точно рассчитать эти вероятности. Поэтому все эти проблемы пришлось переложить на программу. На написание ушло часа 2, но наконец-то, затратив десяток попыток, я выиграл!

Собственно сама программа:

Алгоритм работает по самому простому способу, что называется «в лоб»: пользователь вводит данные с минного поля, жмет кнопку, затем программа расставляет у себя в массиве недостающие мины случайным образом, но так, чтобы они удовлетворяли введенным данным. Заполнение минами происходит достаточно большое количество раз, при этом подсчитывается, сколько раз в каждой клетке побывала мина, и это количество делится на число итераций. То есть, получаются приблизительные вероятности существования мины в каждой клетке, и затем выводятся на экран (в процентах). (программисты и математики, сильно не ругайте :)

Ввод данных:

Результат:

Если она кого-либо заинтересует, скажу пару слов по поводу работы:
Во время игры в сапера нужно ввести данные о текущем состоянии дел в клетки. Клетка может быть пустой (если о ней ничего неизвестно), число от 0 до 8, или буква «m» если клетка помечена флажком, как заминированная. Все 3 кнопки справа вычисляют вероятности, разница заключается в разном количестве итераций (100, 1000, 10000). Поэтому, во избежание слишком долгого ожидания расчета, рекомендую сначала нажать первую кнопку.
Остальное понятно. Скачать можно здесь (200кб). Сразу извиняюсь за отсутствие какой-либо защиты «от дурака».

Все, с сапером завязал. По крайней мере на пару дней.

habr.com

Как выиграть в игру Сапер?

метолоискатель взять)

Там справка есть. Например, если открыл 1, то вокруг единицы квадрат 3 х 3, где в закрытых клетках одна бомба и остальные цифры. Лучше новичкам пустое поле открыть там уже понятно, как. Хотя надо самому посмотреть, как в нее играют.

Ну.... это же самая легкая и простая игра.... =)

Элементарно!!!

Пройти за 3 секунды на эксперте.

Eastegger качай и там стока пасхальных яиц и сапёр тоже есть

Справка из Висты: Советы Старайтесь пометить все мины как можно быстрее. Если точно известно, где находится мина, уделите время на то, чтобы пометить ее. Иначе можно забыть о ней, пока игра ведется на другом конце поля. Это полезно, хотя и отнимает время. Разгадывайте последовательности чисел. Если три ячейки в ряду содержат числа 2-3-2, это указывает на то, в ряду рядом с этими ячейками находится три мины. Если ячейка содержит число 8, это значит, что все ячейки вокруг нее содержат мины. Старайтесь открывать закрытые области. Если по сочетанию ячеек сложно понять, какой ход делать следующим, стоит открыть другую часть поля. Лучше открывать еще не исследованные области, чем те, где наверняка находятся мины. Чтобы изменить параметры игры В диалоговом окне «Параметры» можно изменить уровень сложности и другие настройки игры . Щелкните, чтобы открыть папку «Игры» . Дважды щелкните Сапер. Если Сапер отсутствует, вероятно, необходимо установить эту игру. Более подробную информацию об установке компонентов Windows см. в разделе Включение и выключение компонентов Windows . В меню Игра щелкните Параметры. Установите флажки, соответствующие параметрам, которые необходимо включить, и щелкните ОК.

Зайди в игру потом нажми файл. Дальше особые. И выбери число мин 1. А дальше всё просто!))))))))))

Выбери вариант Особый. Кол-во мин поставь минимальное. Нажми на любую кнопку, а дальше разберешься :)

touch.otvet.mail.ru

Как играть в сапера?

Ответ мастера:

В состав операционной системы Windows входит несколько игр, одна из которых называется "Сапёр" – великолепная тренировка для ума, развития логического мышления, проверка внимательности и просто способ отдохнуть. С первого раза в ней мало кому удалось разобраться, хотя это не составит труда тем, кто будет следовать приведённым ниже подсказкам.

Для начала игры в сапёра, надо сперва запустить её. В меню "Пуск" открываем "Все программы", затем "Игры" и далее "Сапёр".

Нажимаем "Начать новую игру". Начало игры определяется появлением индикатора отсчёта времени. Цель игры – за определённое количество времени открыть все имеющиеся мины и ни на одной из них не подорваться.

Сделать первый и последующие ходы можно, щёлкнув по любой из клеток на игровом поле. Подорваться можно и на первом ходу, который всегда делается наугад, тогда вы проиграли и игру надо начинать сначала. А может в результате хода откроется клетка с цифрой от одного до восьми; или пустая клетка; или рядом с цифрой будет ещё несколько пустых клеток и клеток с цифрами.

Каждый последующий ход необходимо правильно просчитать. Когда цифры стали видны, кое-где можно стопроцентно определить где прячутся остальные мины, а кое-где ещё слишком мало для этого информации. Цифры являются индикаторами расположения мин и появляются на клетках, свободных от них. Обозначают цифры количество минных клеток, соседствующих с данной клеткой. К примеру, если от угловой клетки по диагонали есть цифра 1, и рядом нет других закрытых клеток, это означает, что мина находится как раз в этой клетке. Если вы правильно вычислили, где может находится мина, следует пометить эту клетку флажком. Установить флажок, можно нажав на мышке правую кнопку. Здесь главное ничего не перепутать, потому что будет обидно начинать игру заново из-за одной нелепой ошибки.

Когда абсолютно все клетки, которые свободны от мин, открылись, можно считать, что игра закончилась с успехом. Флажки, их количество и правильность расположения, никакой роли здесь не играют. Они помогают помнить, где расположены мины и важны только для игрока. Кстати, пока вы не снимете флажок с клетки, вам её не открыть. В общем-то, игра на самом деле не чересчур сложная (хотя в некоторые моменты бывает не так уж просто вычислить расположение мин), тут главную роль играет логика и предельное внимание, ведь сапёр ошибается только один раз.

remont-comp-pomosh.ru


Смотрите также