Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Корсары проклятье дальних морей - Пример взлома CD

Автор: Fess

Target: Корсары проклятье дальних морей

Tools:

  • Немного мозгов
  • Win32Dasm 8.93
  • Любой файловый менеджер
  • Hex-редактор

Пролог

Вступление:

Наконец-то заработал CD-ROM!!! Дали мне тут гамес Корсары от известной в России фирмы 1С. Насколько мне известно игры от этой фирмы за- щитой не блещут. Установилась хорошо, вот только без кампакта работать не хотела. Что ж придется помочь. А заодно вот решил накатать тьюториал, как иллюстрация к другому моему тьюториалу от 31.05.2002 с названием "Практи- чески все о взломе CD". Найти можно на vallkor.chat.ru.

Что за прога:

Вполне приличный гамес типа RPG. Минимальные системные требования: PII-233МГц, 64 Мб оперативки, 3D-видео карта, 800 Метров на ЖД, Win9x.

Начало

Первое, что надо сделать это проверить, каким методом гамес проверяет наличие CD. Вариантов 3: использует функцию GetDriveTypeA, пишет букву CD в файл, другим способом. Первые два наиболее популярны. Проверяется это так, заходим в "Система" Панели управления и изменяем имя вашего CD-ROM'a на любое другое. У меня был K: я заменил на Z:. Перезагружаем. И запуска- ем гамес, компакт с игрой, оставив в лотке CD-ROM'a. Заработала. Значит тип защиты (скорее всего номер 1).

Взлом

Засовываем запускающийся файл engine.exe в Win32Dasm и ищем там, в разделе Импорта строку KERNEL32.DLL GetDriveTypeA. К сожалению, ее там не оказалось. Стукните рукой по CD-ROM'у может заработает. И тут нам приходит в голову, что если ее тут нет, значит она может быть где- нибудь еще, например, в динамической библиотеке (dll). Запускаем любой фаловый менеджер (я предпочитаю клоны DosNavigator'a, в частности NDN). Заходим в каталог куда мы установили Корсары нажимаем Alt-F7. Выбираем такие опции: Поиск в текущем каталоге, Рекруссивный поиск. В Имя файлов пишем *.dll в Содержащий текст пишем GetDriveTypeA. И запускаем, если все сделано правильно находится один файл core.dll, его и дизассемблируем.

Опять смотрим в таблицу импорта. Нашлась строка, нажимаем на нее два раза и вываливаемся тут.


:1000C86A 8D6C1C18      lea ebp, dword ptr [esp+ebx+18]
:1000C86E 55            push ebp

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
                          |
:1000C86F FF1534700110  Call dword ptr [10017034]
:1000C875 83F805        cmp eax, 00000005
:1000C878 7579          jne 1000C8F3
:1000C87A 8BFD          mov edi, ebp

Ага, это почти 100% то, что нам нужно, если посмотреть в моей общей статье (см. выше) вид функции GetDriveTypeA, то можно узнать, что она во- звращает в eax 3, если имя ЖД и 5, если имя CD. То есть здесь нам надо просто заменить по адресу в файле C877 число 05 на 03.

Посмотрим дальше, может еще что-нибудь есть.


:1000C8DC 895704        mov dword ptr [edi+04], edx
:1000C8DF 894708        mov dword ptr [edi+08], eax

* Reference To: KERNEL32.CreateFileA, Ord:0034h
                         |
:1000C8E2 FF150C700110  Call dword ptr [1001700C]
:1000C8E8 8BF0          mov esi, eax
:1000C8EA 83FEFF        cmp esi, FFFFFFFF
:1000C8ED 752C          jne 1000C91B

Да, вот еще один трюк, попытка создать файл на CD, если бы вы это про- пустили, она бы не заработала, потому что на ЖД можно создать файл. И вы- деленное сравнение, есть ни что иное как проверка создался файл или нет, т.е. если в eax (потои перешедшее в esi) возвратилось FFFFFFFF, вроде как файл не смог создаться, то все нормально. Значит здесь надо заметить в файле по адресу C8ED число 75h (jne,jnz) на EBh(jmp), т.е. на безусловный переход.

Посмотрим может еще что-нибудь есть. Да вроде нет , дальше выход из функции обеспечивающей проверку. Если вы хорошо разбираетесь в этом, то можете увидеть, что функция проверки возвращает eax=1, если проверка уда- лась и eax=0, если не удалась. Вывод: можно в самом начале функции напи- сать mov eax,1 , а затем ret. Это попробуйте сами.

Послесловие

Товарищи программисты. Это не защита это отмазка, любой начинающий сломает ее не трудясь за 3 минуты. Хотите получать деньги, делайте лучше.

Все ругательства отправлять в null
Все остальное на lomovskih@yandex.ru

P.S. Запомните все материалы публикуются только в учебных целях и автор за их использование ответственности не несет!!

P.P.S. Возможно имеют место опечатки, заранее извините!

With best wishes Fess

И да пребудет с вами великий дух bad-сектора.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay