CHAIKA

Главная | Регистрация | Вход
Вторник, 23.04.2024, 14:49
Приветствую Вас Гость | RSS
Меню сайта
Категории каталога
Мои статьи [51]
Справка по системе [59]
Запись [11]
Flash-накопители [21]
Закачка [35]
Игры [29]
Защита [76]
Локальная сеть [35]
WEB-master [44]
Восстановление [40]
Portable Soft [18]
Оптимизация [34]
Анонимайзер [4]
Ноутбуки [44]
Нетбуки [8]
Система - установка [21]
Деньги в интернете [19]
WINDOWS 7 [35]
Новые статьи [13]
Цифровое видео [26]
Мини-чат
200





Главная » Статьи » Игры

Исследование Star-Force: VENOM
Исследование Star-Force: VENOM
v1.00

Прошел почти год с выхода первых Казаков, год как я полагаю не сидения сложа руки, и вот перед нами очередная игра от компании Russobit-M - Venom. Codename: Outbreak, также использующая систему защиты Star-Force.

Что представляет из себя защита?
По сравнению с Казаками налицо следующие усовершенствования: защита прочно обосновалась уже на трех прерываниях - INT0, INT1, INT3, соответственно затруднена не только отладка, но запуск игры с SoftICE, отладочные регистры DRx стали не только обнуляться, но и использоваться(!) самой защитой, часть данных одной из DLL настраиваются самой Star-Force, функции, сокрытые в _DllDispatch теперь тоже выполняются на своеобразном псевдокоде.

Запуск с SoftICE
Для запуска игры с SoftICE необходимо перед передачей управления собственно игре вернуть отладчику обработку INT1 и INT3. Для этого мы воспользуемся той же методикой, что и в прошлый раз: добавим к импорту файла Venom.exe свою DLL (vnm.dll), которая получив управление после starforce.dll (а так теперь называется главная DLL с защитой) перенастроит необходимые прерывания (см. исходник). Причем старые обработчики, принадлежащие Star-Force нужно сохранить, они нам еще пригодятся.

Снятие дампа
Дамп исполняемого файла в этой версии Star-Force удобно получить с помощью той же самой vnm.dll - когда управление будет у нее надо просто зациклить программу. Все, можно снимать дамп, например PEditor'ом.

Восстановление импорта
Импорт Venom'a защищен так же, как и импорт Казаков, только вот защищенных функций стало на порядок больше. Становится очевидно, что процесс восстановления нужно автоматизировать. Наиболее очевидное решение: написать программу, преобразующую код из импорта к первоначальному виду, и идентифицирующую его. Наиболее простое решение: преобразовать системные DLL таким образом, чтобы после всех видоизменений, внесенных Star-Force, код оставался элементарно идентифицируемым. Вот этим путем мы и пойдем.

Добавим к следующим системным DLL (т.к. Star-Force защищает только их функции) kernel32.dll, user32.dll, advapi32.dll по новой секции, и заменим в них таблицу экспорта. Экспорт ссылается на нашу секцию, а она в свою очередь содержит переходы на реальные функции.
Например:

push real_addr
ret

Когда Star-Force этот код преобразует, он станет выглядеть примерно так:

mov eax,real_addr
xchg eax,[esp]

То есть реальный адрес перед нами, и нам совершенно безразлично, какими ухищрениями защита видоизменяла код.

Важно!
Чтобы Windows загрузилась с видоизмененными библиотеками, следует помнить что
1) размер добавляемых секций должен быть обязательно выровненным
2) user32.dll и advapi32.dll сначала грузятся в память kernel32.dll по адресу, отличному от ImageBase, поэтому в процедуре перехода на реальный адрес нужно это предусмотреть, например так:

call $+5
pop eax
xor ax,ax
add eax,real_addr
push eax
ret

Настроив таким образом весь импорт на реальные адреса путем простого копирования из одной ячейки памяти в другую wink , снова воспользуемся утилитой ImportList by Boris и получим нормальную секцию импорта. Помещаем ее в дамп.

Восстановление данных .BSS
Получив казалось бы нормальный дамп с восстановленным импортом, обнаруживаем, что дальше показа фона главного меню он не идет. Сравнение с оригиналом показало, что в нашем дампе не инициализировались некоторые значения секции .BSS библиотеки verender.dll, т.к. по всей видимости их должна была инициализировать Star-Force. Поскольку эти значения - это различные константы, адреса конкретных функций этой DLL и т.п., то мы можем безболезненно скопировать их (32h*4 байт) и жестко вшить в дамп. Для этого добавим к нему новую секцию (VA=548000h), содержащую в начале эти 30h*4 байт, а затем код (который теперь является новым EntryPoint'ом) такого вида:

mov edi,0200A7EB0 ; Листинг из Hiew wink
mov esi,000548000
mov ecx,000000030
repe movsd ; Копирование 30h*4 байт
mov eax,020109688
mov d,[eax],0200FB438 ; Оставшиеся 2*4 байт
mov eax,02010954C
mov d,[eax],02026EF0C
push 00048DC04
retn

Теперь мы имеем практически полностью работоспособный дамп. Можно загружать игру, играть, выбирать в меню. Нельзя только стартовать новую миссию. На нашем пути вновь встал _DllDispatch.

Восстановление кода _DllDispatch
Идея перехвата сокрытого кода в памяти осталась прежней - ловушка на обращение к секции кода. Только реализация будет иная. В момент вызова _DllDispatch INT1 и INT3 обрабатываются SoftICE'ом; для корректной работы _DllDispatch возвращаем обработку этих прерываний Star-Force. Поскольку INT3 использовать мы уже не можем, станем обрабатывать INT6 (Invalid Opcode), а секцию кода будем перезаписывать значением 0FFh. Когда ловушка сработает, обработку INT1 и INT3 можно вновь вернуть SoftICE'у для удобства дальнейшей отладки.
Все, код найден? Найден псевдокод! В этом состоит одно из главных отличий от Казаков - защищаемая функция (а в Venom'е защищается всего лишь одна функция) выполняется на псевдокоде. Псевдокод несложный: отдельные его операции размежеваны значением 0F4h, значения между ними после нескольких преобразований в движке псевдокода превращаются в адрес памяти, содержащий элементарные операции, например mov ebx,[eax] или push dword ptr [ebx], т.е. регистры не используются напрямую в тех местах, где это касается логики работы защищенной функции - такая вот виртуальная минимашина. Если очередной разделитель отличен от 0F4h, идет call в основной код игры.
Наиболее очевидное решение: написать декомпилятор для этого псевдокода. Наиболее простое решение: встроить в дамп прямо сам псевдокод с его движком. Так мы и сделаем. Добавляем найденные 2 Kb псевдокода к нашей секции в дамп.
Понаблюдав за работой псевдокодового движка, мы замечаем, что
1) указатель на текущую интерпретируемую инструкцию псевдокода передается через стек
2) переход на интерпретирующую процедуру стоит непосредственно перед самым первым 0F4h псевдокода
Таким образом, чтобы корректно передать управление на псевдокод мы должны положить в стек адрес первого 0F4h псевдокода и прыгнуть на jmp стоящий перед ним, благо у нас есть ~10 байт. Значит пишем по адресу 473E48h нашего дампа (где раньше стоял вызов _DllDispatch) код:

mov eax,548116h ; Адрес первого 0F4h в нашем дампе
push eax
sub al,5
jmp eax

И пара штрихов в самом псевдокоде: подкорректируем значение указателя стека, хранящееся по адресу 549065h на 98F19Ch, и запретим пересылки в регистр DS, чтобы не получить сюрпризов на других операционных системах. Для этого ставим два nop'а по адресу 548772h и три по адресу 5486A2h.
Все, EXE-файл готов. И не забудьте пожалуйста удалить starforce.dll, зачем занимать лишнее место на диске? ;))

Исходный текст vnm.dll
vnm.asm (5K) - исходный текст, предназначен для компилирования как DLL в TASM 5.0

Заключение
Я очень надеюсь, что разработчики Star-Force уже приготовили для нас новые подарки, и нам не придется скучать, купив новые игры от Russobit-M. Если у Вас возникли какие-либо вопросы - пишите, я с удовольствием Вам отвечу.

ASMax
asmax@imail.ru

Категория: Игры | Добавил: chaika2 (04.05.2009)
Просмотров: 1311 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
  • Все для веб-мастера
  • Программы для всех
  • Мир развлечений
  • Деревенька
  • Районная сеть Чайка.Net










  • Помогло? Скажи спасибо!

    Статистика

    Онлайн всего: 3
    Гостей: 3
    Пользователей: 0

    Copyright MyCorp © 2024 |