Вытаскивание 3D-моделей из игрушек Direct3D

Тема в разделе "WASM.DirectX", создана пользователем Rustem, 22 янв 2006.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приветствую!!!



    Хочу вытащить модельку и засунуть в свою программу



    На ум приходит 2 метода:

    1. Использовать готовые вытаскиватели (DragonUnpacker ...)

    2. Проследить за вызовами методов Direct3D, непосредственно выводящих на экран, а потом сохранить данные в файл



    Первый метод не катит. Для второго:

    Написал шпиона, который показывает интерфейсы и вызовы из Direct3D, если надо скину его исходники.

    Какие у кого мысли...
     
  2. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Извиняюсь за возможные неточности, писал с мобильника, уточнить не мог.

    Первая идея - перехватить ID3DDevice9->CreateVertexBuffer и функции создания mesh'ей, для создания списка объектов, и в каждом объекте перехватить функции Unlock для VertexBuffer'ов и UnlockVertexBuffer для mesh'ей. После этого можно их уже сохранять. Способ туповатый, но должен работать.
     
  3. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
  4. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приблизительно так и предполагал.

    А какие из функции создания мешей????



    PS. В свое время вытаскивал музыку из демок, использующих dsound, как оказывается там все было просто ;)
     
  5. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    D3DXCreateMesh

    D3DXCreateMeshFVF

    D3DXCreateNPatchMesh

    D3DXCreatePatchMesh

    D3DXCreatePMeshFromStream

    D3DXCreateSPMesh

    D3DXLoadMeshFromX

    D3DXLoadMeshFromXInMemory

    D3DXLoadMeshFromXof

    D3DXLoadMeshFromXResource

    D3DXLoadPatchMeshFromXof

    D3DXLoadSkinMeshFromXof



    Это перечислено в DirectX SDK, но мне кажется список можно сократить...

    А как часто используются собственно mesh'и?
     
  6. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Добавить особо нечего к тому что упомянул Voodoo



    Лучше конечно сразу отслеживать функции из d3d, а не лезть на более низкий уровень с буферами...



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



    Возможно возникнет и вопрос как сопоставить данным вытащенным из буферов, например, соотвествующие им текстуры.
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Для начала советую разобраться в ресурсах - тогда будет понятно, какой формат моделей используется.

    Кстати, что за игра?
     
  8. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Общее решение искать интереснее :)
     
  9. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Игра очень интересная - SexyBeach Demo ;) ~25MB



    Можно спокойно слить с ag.ru
     
  10. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Про текстуры - интереснее. Не ловить же любую последовательность SetTexture/DrawPrimitive... Хотя можно. Создаем список текстур, смотрим, и каким примитивам применяются. Учитываем. Приемлемо.
     
  11. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Меня заломало его ставить когда был: большой, с защитой, и на японском :)
     
  12. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Кстати, если автор не против - исходники перехватчика в студию.
     
  13. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Автор не против....

    Просто на днях придумал один класный метод (может конечно и не первый, но дошел сам) получения адресов виртуальных таблиц. В новой версии его и буду использовать.

    Кстати метод след.

    1. Вызываем в цикле QueryInterface( ,X,)

    ,где Х-IID нашего перехватываемого интерфейса.

    2. Вызываем Release



    Потом патчим эту таблицу предварительно сохранив. Пока не проверял, но надеюсь будет работать...Как сделаю, выложу

    Пока старая

    Про игру: да на японском ж)

    Защиты нет.

    Сильно похоже на использование .X формата

    Написана под direct3d immediate mode

    [​IMG] 1438763519__core.rar
     
  14. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Млят, написан на ассемблере, а все вместе в 50 кб не влазит ;)

    [​IMG] _371091288__loader.rar
     
  15. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Сейчас выложу шпиона, написанный специально для ломаемой игры. Тот же принцип, просто перехватываемые функции другие...

    [​IMG] 1811233357__d3dim7spy.rar
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    А что ты имеешь в виду под виртуальными таблицами? Если таблицу виртуальных методов классов, то они либо в явном виде лежат в области данных, либо (в рассматриваемом случае интерфейсов DirectX) встречаются как косвенные вызовы в коде программы (типа

    call dword ptr [eax+NNN]). Самое сложное во втором случае - разобраться, какой интерфейс юзается. А методы интерфейса можно легко определить по заголовкам (*.h). Я, например, завел себе базу данных для таких случаев и по смещению NNN без труда нахожу нужный метод.
     
  17. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Выразился неправильно. Конечно имел в ввиду таблицу виртуальных методов.

    Понятно, что таблица лежит в данных или где-то там еще.

    А вот таблица какого интерфейса???

    По мойму можно без базы данных.

    Динамически получить адрес таблицы через QueryInterface, а потом делать что надо
     
  18. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Например, любого интерфейса DirectX. В программе будет храниться только ссылка на указатель на интерфейс. Какой конкретно метод вызывается (call dword ptr [eax+NNN]), надо еще определить. Вот для этого и существуют заголовочные файлы.

    Пример:

    call dword ptr [eax] - QueryInterface

    call dword ptr [eax+4] - AddRef

    call dword ptr [eax+8] - Release

    ...
     
  19. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    В исходниках, которые я выложил. Есть файл db.inc

    В них как раз и содержится имена интерфейсов и методов.

    Был получен путем парсинга h-файлов из DirectX SDK скриптом на перле (за помощь в написании скрипта большое спасибо IceStudent'у)

    Просто не было ясно какая именно база.



    Надо бы поподробнее обсудить саму технологию вытаскивания-

    перехватываемые методы и.т.п
     
  20. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Rustem



    Интересует Вытаскивание 3D-моделей из игрушек OpenGL ?