Есть игра для виндовс. Нужно портировать ее на 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): int __thiscall sub_448280(int this,int a2,int a3) { int v4; // ST08_4@1 int v5; // eax@1 int v6; // eax@1 int v7; // [sp+0h] [bp-8h]@1 int v8; // [sp+4h] [bp-4h]@1 v7 = this; v4 = a2; v5 = unknown_libname_6(); v8 = sub_448600(a3, v5, v4); v6 = unknown_libname_6(); sub_4482D0(v8, v6); *(_DWORD *)(v7 + 8) = v8; return a2; } вполне читабельный код. на первый взгляд. Подскажите, какие принципиальные сложности могут возникнуть? Что нужно проверить, чтобы убедиться что задуманное возможно? И если возможно, то скажите что примерно нужно будет сделать, а в деталях я сам попытаюсь разобратьсо.
valerko Первая и главная принцпиальная сложность: с плохим знанием дизасма пытаться одолеть 1596 функций практически нереально. Я бы пошел по другому пути: попытался понять общую структуру игры, выделил бы в ней ядро, функции работы с графикой, с музыкой и звуками, ресурсами. Попытался бы понять, как устроены данные. Это для начала, поскольку конкретные советы можно дать, зная что за игра. К примеру, спрайтовая игрушка принципиально отличается от трехмерной; стрелялка принципиально отличается от стратегии и т. д. Еще есть зависимость от языка, на котором она написана: код Мелкософта с оптимизацией сложнее разбирать, чем Дельфи. Не исключен вариант, что движок игры использует интерпретатор, тогда понадобится много времени, чтобы язык интепретатора понять. ЗЫ Прислал бы что ли экзешник, я ьы тебе больше мог сказать. Когда-то этим делом занимался (Болдердаш с Коммодора на РС переносил).
Ну это самое главное и интересное и простое, это я разобрался. Щас мне похоже помогут только конкретные практические советы по ИДЕ. Тот ехешник что я смотрел оказался вроде как ненужен в итоге, и игра может без него работать. Зато другой ехе который типа лаунчера, весит намного меньше и я похоже смогу его разобрать сам, или с нуля его заделать тк понял что он делает. Все функции в игре типа звук графика логика итд. разделены по 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)) ?
Есть команда, цель которой написать продолжение. Они много знают о устройстве игры. Летом была тема на форуме, в проектах, но не помню названия. Имя лидера тоже забыл.
valerko Diablo крутая игрушка. А вообще идея интересная, был бы помоложе и посвободнее во времени, присоединился бы
хы, мне из подобного понравилась тока одна игра: "Zax: The Alien Hunter", типа инопланетный охотник, крушение на поробощённую планету, в джунгли, там всякая всячина, и побегать и пострелять и сетевуха сенпотичная) а вот дябло я пытался постичь, но так и не понял - чем он так нравится большинству?
У них это диабло 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 в Иде может поменть что-нить?
Проще написать аналог с нуля, чем реверсить такие объёмы кода. Потом очень много времени угрохаете, чтобы заставить работать ваши декомпилированные исходники как требуется.
Эта dll импортирует множество функций из других модулей (*.dll ?). Кроме стандартных KERNEL32, USER32, WINMM это, видимо, "диабловские" - D2CMP, D2Common, D2Lang, D2Net, Fog, Storm. IMHO, сначала нужно разобраться с ними, главным образом с D2Common и Fog, так как в d2game.dll используется множество их функций. Не имея представления, что они делают, трудно понять, что делается в самой d2game.dll. Но вообще, все это ОЧЕНЬ неслабая работа!
Переменным или функциям? Я декомпилировал storm.dll, там только несколько раз пришлось в функции поставить первым параметром "this". Надеюсь это единственные ошибки hex-rays'a.. основа игры: d2game.dll - логика, d2common.dll - таблицы и типы данных монстров, мечей, свитков и других объектов. Это все что мне нужно знать, так как в конечном счете я собираюсь только получить компилируемый код, и заменить вызовы системных функций на аналоги WinMobile, ну и переписать dll графики и работы с памятью. Звук и сеть не планируется. Я вижу что 9 человек уже скачали файл. Если вы сталкивались с подобными DLL, то скажите что можно тут сделать? что показывает анализ? Судя по тому что уже сказано, я так понимаю что особых сложностей с первого взгляда не видно, но могут возникнуть при более глубоком анализе, или уже в процессе реверса? И главное хотелось бы узнать чем как и с какими настройками лучше декомпилировать подобного рода DLL. =)
valerko "Блаженны верующие..." ;о) В 1й версии hex-rays'a ошибок более чем достаточно. Что-то потом было исправлено, (если не ошибаюсь, уже выпущена 3я версия), но _здесь_, боюсь, их еще придется повылавливать. _Особых_ действительно не видно, но потребуется очень мелкая и кропотливая работа по вылавливанию мелких ошибок и нестыковок. Относительно специальных настроек hex-rays мало что могу сказать, так как использовал его лишь как вспомогательный инструмент при анализе. И еще. IMHO, конечно, но просто "получить компилируемый код" для портирования вряд ли будет достаточно. С логикой и мелкими деталями работы программы все равно придется разбираться.
Наверное 2 логических варианта есть. 1. Написание эмуля IA32 под ARM 2. Брать опкоды инструкций IA32 и конвертить их под ARM со всеми фиксами функций прорисовки... чтото в этом роде.
-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