декомпиляция игры в IDA Pro Hexrays

Тема в разделе "WASM.RESEARCH", создана пользователем valerko, 14 ноя 2008.

  1. valerko

    valerko New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2008
    Сообщения:
    12
    Есть игра для виндовс. Нужно портировать ее на PocketPC под ARM-архитектуру.

    Все это планирую сделать при помощи правки сорцев, адаптации их для покета и сборки под АРМ. Но сорцев нет.

    Решил попробовать дизасм. и декомпилировать оригинальные exe и dll. В дизасме плохо разбираюсь.

    Сделал попытку прочитать файл .exe. Вот результаты:

    1596 функций. Из которых около 25% опознанных стандартных типа _strncpy.
    Дизасм. problems: 8561 Штук

    среди них:

    Can't find name
    Can't disassemble
    Already data or code
    Execution flows beyond limits
    Failed to trace the value of the stack pointer
    Attention! Probably erroneous situation
    Decision to convert to instruction/data is made by IDA
    The decision made by IDA was wrong and rolled back
    ------


    Взятая наугад функция удачно декомпилировалась:

    Код (Text):
    1. int __thiscall sub_448280(int this,int a2,int a3)
    2. {
    3.   int v4; // ST08_4@1
    4.   int v5; // eax@1
    5.   int v6; // eax@1
    6.   int v7; // [sp+0h] [bp-8h]@1
    7.   int v8; // [sp+4h] [bp-4h]@1
    8.  
    9.   v7 = this;
    10.   v4 = a2;
    11.   v5 = unknown_libname_6();
    12.   v8 = sub_448600(a3, v5, v4);
    13.   v6 = unknown_libname_6();
    14.   sub_4482D0(v8, v6);
    15.   *(_DWORD *)(v7 + 8) = v8;
    16.   return a2;
    17. }
    вполне читабельный код. на первый взгляд.

    Подскажите, какие принципиальные сложности могут возникнуть? Что нужно проверить, чтобы убедиться что задуманное возможно? И если возможно, то скажите что примерно нужно будет сделать, а в деталях я сам попытаюсь разобратьсо.
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    valerko
    Первая и главная принцпиальная сложность: с плохим знанием дизасма пытаться одолеть 1596 функций практически нереально.
    Я бы пошел по другому пути: попытался понять общую структуру игры, выделил бы в ней ядро, функции работы с графикой, с музыкой и звуками, ресурсами. Попытался бы понять, как устроены данные. Это для начала, поскольку конкретные советы можно дать, зная что за игра. К примеру, спрайтовая игрушка принципиально отличается от трехмерной; стрелялка принципиально отличается от стратегии и т. д. Еще есть зависимость от языка, на котором она написана: код Мелкософта с оптимизацией сложнее разбирать, чем Дельфи. Не исключен вариант, что движок игры использует интерпретатор, тогда понадобится много времени, чтобы язык интепретатора понять.
    ЗЫ
    Прислал бы что ли экзешник, я ьы тебе больше мог сказать. Когда-то этим делом занимался (Болдердаш с Коммодора на РС переносил).
     
  3. valerko

    valerko New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2008
    Сообщения:
    12
    Ну это самое главное и интересное и простое, это я разобрался. Щас мне похоже помогут только конкретные практические советы по ИДЕ.

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

    Все функции в игре типа звук графика логика итд. разделены по 25 длл-кам, общим весом около 3мб, функций около 5000 наверное. А игра старая, спрайтовая, использует Директ3Д.

    Щас разбираю ДЛЛ которая открывает файлы с ресурсами. Она была сделана на с++. Там даже есть ссылки на какую-то дебуг-информацию, и указаны пути к .cpp файлам сорцев. (ни .pdb и .cpp этих у меня нет..)
    Декомпилировал, создал проект в вижл студио. Попробовал собрать. Разбираюсь с ошибками.

    вопросы такие:
    1) IDA Pro 5.1 намного хуже новых версий в данном случае?
    2) у некоторых функций с типом __userpurge ошибка. Заменяю на __stdcall и все ок. Я правильно делаю?
    3) Hex-rays сделал дефайн: #define __MKOADD__(x, y) invalid_operation // Generate overflow flag for an addition
    можно ли просто заменить на #define __MKOADD__(x, y) ((x)+(y)) ?
     
  4. Rustem

    Rustem New Member

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

    valerko New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2008
    Сообщения:
    12
    "Диaбло II". Я хочу видеть эту угруху на экране своего кпк.
     
  6. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    Есть команда, цель которой написать продолжение. Они много знают о устройстве игры. Летом была тема на форуме, в проектах, но не помню названия.
    Имя лидера тоже забыл.
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    valerko
    Diablo крутая игрушка. А вообще идея интересная, был бы помоложе и посвободнее во времени, присоединился бы :)
     
  8. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    хы, мне из подобного понравилась тока одна игра: "Zax: The Alien Hunter", типа инопланетный охотник, крушение на поробощённую планету, в джунгли, там всякая всячина, и побегать и пострелять и сетевуха сенпотичная)
    а вот дябло я пытался постичь, но так и не понял - чем он так нравится большинству?
     
  9. valerko

    valerko New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2008
    Сообщения:
    12
    У них это диабло 1, но все равно спасибо. Там кстати storm.dll почти такой-же как в д2. может пригодится..

    Попробовал сегодня собрать одну длл...И понял что у меня сейчас нехватает опыта.(мой первый декомпайл -)
    У кого есть опыт работы с hex-rays посмотрите плиз что можно сделать я этим файлом. Все остальные такого же типа, но попроще.
    http://yandex.ru/yandsearch?text=d2game.dll
    или вот http://slil.ru/26337374
    и еще я его прикрепил на всякий случай.

    У меня hex-rays делает кучу глупых ошибок типа v1=*(DWORD*)v2++ +1;, хотя в асме просто один inc. Я все это исправил, но пришлось закоментить несколько асемблерных вставок, и еще экспорт для длл-функций переделать осталось. Это очень долго будет. Может есть какойто способ облегчить это дело? В настройках Kernel options в Иде может поменть что-нить?
     
  10. Lux_In_Tenebris

    Lux_In_Tenebris New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2008
    Сообщения:
    13
    Проще написать аналог с нуля, чем реверсить такие объёмы кода. Потом очень много времени угрохаете, чтобы заставить работать ваши декомпилированные исходники как требуется.
     
  11. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Переменным надо устанавливать нужные типы. Изучи кнопку Y.
     
  12. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Эта dll импортирует множество функций из других модулей (*.dll ?). Кроме стандартных KERNEL32, USER32, WINMM это, видимо, "диабловские" - D2CMP, D2Common, D2Lang, D2Net, Fog, Storm.
    IMHO, сначала нужно разобраться с ними, главным образом с D2Common и Fog, так как в d2game.dll используется множество их функций. Не имея представления, что они делают, трудно понять, что делается в самой d2game.dll.

    Но вообще, все это ОЧЕНЬ неслабая работа!
     
  13. valerko

    valerko New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2008
    Сообщения:
    12
    Переменным или функциям? Я декомпилировал storm.dll, там только несколько раз пришлось в функции поставить первым параметром "this". Надеюсь это единственные ошибки hex-rays'a..

    основа игры: d2game.dll - логика, d2common.dll - таблицы и типы данных монстров, мечей, свитков и других объектов. Это все что мне нужно знать, так как в конечном счете я собираюсь только получить компилируемый код, и заменить вызовы системных функций на аналоги WinMobile, ну и переписать dll графики и работы с памятью. Звук и сеть не планируется.

    Я вижу что 9 человек уже скачали файл. Если вы сталкивались с подобными DLL, то скажите что можно тут сделать? что показывает анализ?
    Судя по тому что уже сказано, я так понимаю что особых сложностей с первого взгляда не видно, но могут возникнуть при более глубоком анализе, или уже в процессе реверса?
    И главное хотелось бы узнать чем как и с какими настройками лучше декомпилировать подобного рода DLL. =)
     
  14. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    valerko
    "Блаженны верующие..." ;о)
    В 1й версии hex-rays'a ошибок более чем достаточно. Что-то потом было исправлено, (если не ошибаюсь, уже выпущена 3я версия), но _здесь_, боюсь, их еще придется повылавливать.

    _Особых_ действительно не видно, но потребуется очень мелкая и кропотливая работа по вылавливанию мелких ошибок и нестыковок.
    Относительно специальных настроек hex-rays мало что могу сказать, так как использовал его лишь как вспомогательный инструмент при анализе.

    И еще. IMHO, конечно, но просто "получить компилируемый код" для портирования вряд ли будет достаточно. С логикой и мелкими деталями работы программы все равно придется разбираться.
     
  15. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Наверное 2 логических варианта есть.
    1. Написание эмуля IA32 под ARM
    2. Брать опкоды инструкций IA32 и конвертить их под ARM со всеми фиксами функций прорисовки...
    чтото в этом роде.
     
  16. valerko

    valerko New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2008
    Сообщения:
    12
    -The Wine developers released version 1.0 of Wine, after 15 years of development, on June 17, 2008

    на данный момент тема здесь http://wasm.ru/forum/viewtopic.php?pid=283529