Что в этом уроке:
В данном коротком но думаю полезном уроке мы ознакомимся с инструментарием и взломаем первую программу 2 способами. Необходимый инструментарий:
Нам понадобится только OllyDBG - на мой взгляд лучший User-Mode отладчик. Версия 1.1. Скачать ее можно с оффсайта. [Ссылки могут видеть только зарегистрированные пользователи. ]
А так же вам понадобится сама [Ссылки могут видеть только зарегистрированные пользователи. ]. Практическая часть:
Для начала откройте OllyDBG. Устанавливать ее кстати не нужно - просто распакуйте архив в удобную вам папку. Откройте файл SimpleApp.exe (Нажминет в OllyDBG File->Open). На экране вы должны увидеть что то вроде такого:
[Ссылки могут видеть только зарегистрированные пользователи. ]
В куче этого кода нас интересует фрагмент по адресу 402082 - 402091.
MOV ECX,8
MOV ESI,401008
MOV EDI,401208
REPE CMPS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
Это как ни странно цикл сравнения двух строк - серийников введенных и того что зашит в программу. Комментарий отображает один из аргументов этой инструкции - зашитый в программу сейриник. Это логично так как до запуска программы, дизассемблер может отобразить только один аргумент, так как пользователь не ввел второй.
Вот сосбтвенно и все - переписываем в блокнотик серийник и вводим его в программе. На этом первый способ кряка завершен.
Теперь давайте проанализируем что же происходит после сравнения строк.
JNZ SHORT 004020C3
А происходит у нас условный переход - JNZ - если флаг ZF не установлен. Он не установится только если результат последнего сравнения отрицательный. Т.е эта команда почти тоже самое что и JNE.
Кликаем два раза по строке с этой инструкцией, ставим галочку Fill with NOPs и вводим в текстовое поле команду NOP и нажимаем assemble.
Теперь нам осталось только сохранить эти изменения:
1. Выделите обе инструкции NOP(у нас их получилось две, так как команда JNZ+Аргумент = 2 байта. А инструкция NOP однобайтовая - 90h) зажав клавишу Shift. Кликните по выделенным инструкциям правой кнопкой мыши. И в выпадающем меню выберите Copy to Executable -> Selection.
После этих манипуляций перед вами появится окно дизассембла файла(Значок - Буква D на голубом фоне.). Наши инструкции как раз отобраажены в нем(и выбраны) Нажимаем по выделение правой кнопкой мыши и выбираем Save File. Все - указывайте путь куда сохранять взломанный файл.
[Ссылки могут видеть только зарегистрированные пользователи. ]
В заключение:
Вот и все - поздравляю вы взломали свою первую программу. Эти знания помогут вам в ислледовани экзешек клиентов игр на предмет защит и проверок. В них все реализовано по такому же принципу
Урок этот первый но не последний.
Последний раз редактировалось Ivan_32; 27.03.2009 в 23:31.
Причина: Исправлена тестовая программа.
Но вот одна проблемка вышла... серийник не вмещается О_О
Я, как понял, сначала сравниваются строки, если результат отрицательный, значит флаг ZF не установлен, и джамп будет идти на "Wrong serial number"
А если убрать этот джамп (хотя можно сменить на переход на "Correct serial" ), то следующая команда будет вывод текста "Correct serial" и далее команды соответственно)
П.С: вторым способом получилось
Последний раз редактировалось Leo_ня; 27.03.2009 в 11:08.
Не вмещается? о_О А скрин можно?) Кажется у Висты теперь несовместимость с XP на уровне UI X_X Я могу сделать конечно больше или скроллбар прикрутить...
Да кстати, вот что хочу добавить. Эта прога она на асме написана - а значит дизассембл будет очень похож на исходник. Ну вот тут разве что есть один косяк. Я ставил в коде не JNZ а JNE, но видимо компиль решил что JNZ предпочтительней...
Все конечно замечательно... И я благодарен Ивану за статью. Но чет я тут самого главного не увидел. Как же все таки всю эту хрень искать. Тут нам сразу сказали, что интересуеют такие-то строчки. Это конечно хорошо, когда прога мелкая и ее можно просмотреть за полминутки...
Короч мой вариант прохождения этой мелкой радости:
Открываем прогу в оле. Т.е. можно File->Open или F3 (надо начать привыкать к горячим клавишам - в дальнейшем будут спасать время) и выбираем нужный файл.
По началу оля проводит анализ, встает на предпологаему точку входа и впадает в состояние задумчивости aka Pause
[Ссылки могут видеть только зарегистрированные пользователи. ]
Далее запускаем прогу - Debug->Run (F9). Появляется милое окошечко проги. Веря нашему интуитивному мышлению мы понимаем, что прога ждет ввода серийника. Но мы его не знаем.... =( Но это не беда! =) Вводим любую фигню. Либо не вводим вообще ничего =) Ага.. прога выдала надпись:"Wrong serial number."
[Ссылки могут видеть только зарегистрированные пользователи. ]
Нам это на руку. Переключаемся на олю и выполняем следующие махинации:
ПКМ на экране CPU (окно с буквой С в синем квадрате) -> Search for -> All referenced text strings.
[Ссылки могут видеть только зарегистрированные пользователи. ]
В появившемся окошке пробегаемся по надписям и радуемся при виде знакомой нам "Wrong serial number." Выделяем ее, ПКМ -> Follow in Disassembler (можно просто Enter)
[Ссылки могут видеть только зарегистрированные пользователи. ]
Добрая оля отсылает нас к коду где эта строка употребялется. Смотрим в окно дополнительной инфы (оч полезная штука кстати), где нам сообщают, что прыжок сюда есть на оффсете 402093. Выделяем эту строку, ПКМ -> Go to...
[Ссылки могут видеть только зарегистрированные пользователи. ]
И...оля перекидывает нас как раз на те строки сравнения о которых нам любезно рассказал Иван. Далее следуем его интсрукциям и пускаем сопли от взломанной проги.
Спасибо за внимание ^_^
Leo_ня Можно выделить строку с пассом и в окне доп инфы ПКМ -> Copy pane to clipboard. Скопирует конечно все что там будет написано... но имхо эт этого избавится гораздо быстрее чем се-то еще в хекс-редакторе открывать...
Добавлено через 32 минуты
ЗЫ Я пожалуй дополню варианты поиска... Если знаем API, то можно химичить с ними... К примеру у нас алгоритм будет таков:
Открываем прогу.
ПКМ в окне ЦПУ (или дизассемблера другими словами) -> Search for -> Name (label) in current module (Ctrl+N).
Перед нашими глазами появляется список импортируемых/экспортируемых функций данной проги. Ищем там глазами GetDlgItemTextA. В относительно простых прогах этой функцией часто считывается пароль из окна ввода пароля.
ПКМ по нему -> Set breakpoint on every reference (это мы поставили бряк на каждый вызов этой функции)
Далее запускаем прогу, вводим фигню, жмем Check и... оля тормозит прогу ибо была вызвана наша функция на которую мы поставили бряк.
За ней следует код проверки валидности пасса. Это в самом простом случае.
Посложнее - далее может идти вызов проверяющей функции (так что надо будет трассировать прогу с вхождением) или джамп куданить... а за ним еще джамп и еще джамп =) Дабы "усложнить" реверсеру жизнь =) Но мы же таких трудностей не испугаемся, прально? =)
Просьба не писать мне в ЛС по поводу того, что что-то не работает/выложить тему из подполья/рассказать о последних багах, читах, глюках. Не отвечу! Задавайте конкретные вопросы. Чем смогу - тем помогу. И в теме указывайте суть вопроса, а то смотреть вообще не буду - удалю и все.
__________________
Предоставляю услуги Гаранта/Проверяющего. Все подробности здесь.
Связь только через ПМ. В теме писать "Гарант/Проверка".
__________________
Выделить пароль можно было ещё проще, в "С", под-окно внизу слева, я так понял hex-редактор, в нём ПКМ, Text, ASCII (64 chars). Идём на адрес 401200, выделяем пароль, ПКМ, copy, To clipboard, получится:
00401200 AFuguw931t7hwghasfuhuqw8hf2[2333
Отсюда вытянуть пасс тем же способом: выделить, copy =)
з.ы. по дефолту вид hex 4 byte.
Ещё хочу добавить, чтоб без знания процедур/функций (JNZ, JNE), того же флага (ZF)... трудненько разобраться, я, к примеру, не знаю ассемблера, пока не понял какая аббривиатура, за что отвечает. Но всё же что-то понять удалось
________________ ГОНЯЮСЬ за СПАСИБО и за кол-вом сообщений, но получается плохо (( поможете!? ))
С уважением, ZeLiK
Последний раз редактировалось ZeLiK; 08.08.2009 в 01:20.
Сорцы компильнуть может каждый чоткий пацык с компилятором.. А вот длл распаковать... Сначала находишь пакер которым она запакована, а потом анпакер к нему =) Так что тут проблем тож нет)
Просьба не писать мне в ЛС по поводу того, что что-то не работает/выложить тему из подполья/рассказать о последних багах, читах, глюках. Не отвечу! Задавайте конкретные вопросы. Чем смогу - тем помогу. И в теме указывайте суть вопроса, а то смотреть вообще не буду - удалю и все.
__________________
Предоставляю услуги Гаранта/Проверяющего. Все подробности здесь.
Связь только через ПМ. В теме писать "Гарант/Проверка".
__________________
Попробовал по уроку взятому отсюда [Ссылки могут видеть только зарегистрированные пользователи. ] проделать с тестовым примером, все получилось.
Решил взяться за свою программу, но тут не так все просто. В программе имеются "Логин" и "Пароль" которые можно получить, зарегистрировавшись на сайте*. Программа состоит из одного исполняемого файла. Можно ли как то отвязать ее от сайта или вообще от авторизации с помощью OLLYDBG, я пробовал, но уже в самом начале застрял на том, что никак не могу поймать нужный шаг и он все время меняется. Можете объяснить, помочь и научить. Хочу расширить границы "читерского" мастерства.
mars2107, не легче ли проснифить пакеты(при успешной авторизации), поднять небольшой прокси сервер и при запросе на сайт авторизации заменять его ответ на "исправленный".Уверен программа не отличит фейк от валидного
(если конечно Вы не писали защиты (хеши, токены, кукисы))