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

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

  1. Rustem

    Rustem New Member

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

    Просто большинство игр под DirectX.....
     
  2. _DEN_

    _DEN_ DEN

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



    Ты "Вытаскивание 3D-моделей из игрушек Direct3D" сам пишешь?
     
  3. Rustem

    Rustem New Member

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

    _DEN_ DEN

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



    Что же тут непонятного :)



    "Вытаскивание 3D-моделей из игрушек OpenGL" лично мне писать лень. Но я могу тебе рассказать все, что надо для того чтобы самому написать такую софтину.
     
  5. Rustem

    Rustem New Member

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



    Я хочу написать такую софтину. Если нетрудно, расскажи...
     
  6. _DEN_

    _DEN_ DEN

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



    Ты с proxy dll разобрался?
     
  7. Rustem

    Rustem New Member

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

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Вопщем так. Вот упрощенная схема. Жду вопросов.



    1. Мониторим функции glEnableClientState / glDisableClientState. Нас интересуют параметры GL_VERTEX_ARRAY, GL_NORMAL_ARRAY и GL_TEXTURE_COORD_ARRAY. Соответственно надо завести три булика, которые будут хранить эти стейты.



    2. Мониторим glVertexPointer, glNormalPointer и glTexCoordPointer. Запоминаем адреса и типы данных.



    3. Мониторим glDrawArrays и glDrawElements. По параметрам вызовов сохраняем модельки. Чтобы как-то отличать модели между собой, предлагаю юзать адрес из glVertexPointer в качестве айдишника моделей.
     
  9. Rustem

    Rustem New Member

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



    Эх, еще бы по DirectX'у, также разъяснили бы, было бы ВААЩЩЕ супер ;)
     
  10. Rustem

    Rustem New Member

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

    Все просто, как и сказал Voodoo:

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

    Но в общем так:

    1.Перехват _CreateVertexBuffer, _CreateIndexBuffer.

    2. Перехват _Lock - запоминаем параметры

    3. Перехват _Unlock - в принципе уже можно писать данные в выходной файл.

    Кстати удобно сделать логгер, который показывает вызовы нужных методов и их параметры.

    Есть вопросы пишите: fasihov(sobaka)mail(dot)ru

    Сейчас занялся OpenGL....
     
  11. _DEN_

    _DEN_ DEN

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




    И как успехи?
     
  12. NitroCephal

    NitroCephal New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    2
    Адрес:
    Russia-Novosibirsk
    Давно я тут не бывал...

    Случайно вашу тему увидал и меня заинтересовало это. =)

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



    В общем, я расшифровал из нескольких игр форматы моделей, но половину просто разбирая данные о моделе в HEX редакторе, а другую половину с помощью IDA и Softice -искал алгоритм загрузки. Но вот как вы делаете - это круто!



    Только проблема: не имею представления как правильно организовать чтение данных из памяти после перехвата например функций Lock/Unlock в D3D. d3d9.dll уже дизассемблирован и имена нужных методов переименованы в нормальные, так что перехватить могу нужный метод.



    Научите пользоваться Write/ReadProcessMemory и что ещё нужно проделать для чтения из памяти? Ок? =)
     
  13. Rustem

    Rustem New Member

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

    Успехи с OpenGL не очень. Разбираю демку от nVidia - Dawn

    - ну та, которая про лесную фею ;)))



    Получил все вызовы

    glEnableClientState,...glDrawElements.

    Индексный буфер передается в параметре glDrawElements - соответсвенно можно сохранять, но вот вертексный буфер:

    В общем glVertexPoint не вызывается...

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





    NitroCephal Отвечу кратко: весь метод основан на перехвате функций. Статей на этом сайте много. Если не ясно - спрашивай..
     
  14. NitroCephal

    NitroCephal New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    2
    Адрес:
    Russia-Novosibirsk
    ОК, тут и в самом деле много статей... поторопился я с постом... ;) Офигенный сайт!
     
  15. _DEN_

    _DEN_ DEN

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







    Похоже в целях единобразия философия программирования на OpenGL притерпела некоторые изменения :) Судя по всему они используют универсальных подход - glVertexAttribPointer.



    План меняется :)



    При инициальзации мониторь wglGetProcAddress. Тебя интересует вызов с параметром glVertexAttribPointerNV



    Вместо того что возвращает wglGetProcAddress для этой функций верни свою прокси-функцию, которая в свою очередь будет вызывать указанную выше. Ну тут думаю все ясно. Параметры:
    Код (Text):
    1. void glVertexAttribPointerNV
    2. (
    3.   GLuint index,   // ID данных
    4.   GLint size,
    5.   GLenum type,
    6.   GLsizei stride,
    7.   const GLvoid *pointer
    8. );


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



    1. Координаты нормалей лежат в диапазоне [-1 ; 1] и их size = 3

    2. size текстурных координат = 2

    3. size вершин равен либо 3 либо 4 (скорее всего 3) и 99.999% что значения координат вылазят из диапазона [-1 ; 1].
     
  16. _DEN_

    _DEN_ DEN

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



    Во-первых, через те же атрибуты вершин передаются веса для скелетной анимации, но тут не так страшно, я думаю их size будет равен 1.



    Есть и вторая неприятность. Прога может юзать VBO. А это значит что придется дублировать у себя содержимое буферов и следить за тем какой буфер в данный момент активен.



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



    Вот так.
     
  17. Rustem

    Rustem New Member

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

    Rustem New Member

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

    Получил лог с интересующими функциями, и понял, что ничего не понял ;) Есть мнения ???



    glEnableClientState: 00008533

    glVertexAttribPointerNV: 00000000, 00000003, 00001406, 00000000, 0AD40000

    glVertexAttribPointerNV: 00000001, 00000003, 00001406, 00000000, 0AD40060

    glEnableClientState: 00008650

    glEnableClientState: 00008651

    glDrawElements: 00000004, 00000024, 00001403, 04FC8FE0

    glEnableClientState: 00008558

    glVertexAttribPointerNV: 00000000, 00000003, 00001406, 00000000, 0BC43D50

    glVertexAttribPointerNV: 00000001, 00000004, 0000140B, 00000000, 0BC47470

    glVertexAttribPointerNV: 00000003, 00000002, 00001406, 00000000, 0BC49930

    glVertexAttribPointerNV: 00000002, 00000004, 0000140B, 00000000, 0BC4BDF0

    glEnableClientState: 00008652

    glEnableClientState: 00008653

    glDrawElements: 00000005, 00000864, 00001403, 051963F0:

    glDisableClientState: 00008558

    glEnableClientState: 00008558

    glVertexAttribPointerNV: 00000000, 00000003, 00001406, 00000000, 0BC4E2B0

    glVertexAttribPointerNV: 00000001, 00000004, 0000140B, 00000000, 0BC51CE8

    glVertexAttribPointerNV: 00000003, 00000002, 00001406, 00000000, 0BC543B8

    glVertexAttribPointerNV: 00000002, 00000004, 0000140B, 00000000, 0BC56A88

    glDrawElements: 00000005, 000008DC, 00001403, 05197710

    glDisableClientState: 00008558
     
  19. Rustem

    Rustem New Member

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