1. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.

Дизассемблирование программ под Dos4gw, LE, реассемблирование

Тема в разделе "Мастерская", создана пользователем Pyhesty, 29 май 2017.

  1. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    # dos4gw, dos/4gw, games, disassemble, reassemble, revers-engineering

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

    из того, что вы можете узнать в текущей теме:
    1. как отделить заголовок и получить исходных LE файл
    2. как дизассемблировать LE файл
    добавлено в 2020: единственный нормальный дизасс LE файла - это IDA версии 4.1 или 4.15... остальные более старшие версии не дизассемблят

    3. как изучить расположение сегментов и положение кодовых сегментов и данных в LE файле

    из того, что не удалось пока решить:
    1. как реассемблировать

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

    Немного истории: собственно решил изучить ресурсы игры hammer of the gods...
    Hammer of the Gods (1994, DOS)
    на предмет возможности перевода, игра очень достойная, но до сих пор не переведена...,
    графические ресурсы хранятся в основном в формате pcx и их изменение не представляет
    проблем. В то же время все текстовые ресурсы хранятся в самом исполняемом файле, в конце

    upload_2017-5-29_22-5-53.png

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


     
    Последнее редактирование: 22 июл 2020
    Corak, SAS, AndyFox и 6 другим нравится это.
  2.  
  3. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    продолжу....
    данный разделитель 0x00 подсказывает, что разработка велась не на asm, а на более высокоуровневом языке...
    на популярном в те времена фортране или C (C++?)
    так как основные ресурсы игры расположены локально в конце файла с их извлечение проблем быть не должно...
    дальнейшая проверка на контроль самой программой целостности (CRC/Хеш) путём замены нескольких букв
    показывает, что проблемы контроля игрой самой себя в принципе нет...
    берем hiew и меняем часть букв что бы удостоверится, что проверок нет...
    upload_2017-5-30_1-15-12.png

    все без проблем, по этому изменить текст путём непосредственного изменения текста в игре возможно...

    следующая проблема очевидна: нельзя менять длину строк... так как после линковки программы все указатели на ресурсы
    внутри exe файла получили абсолютные адреса, и если сместить начало следующей "фразы" или перезатереть разделитель 0x00,
    то программа уже не правильно считает окончание строки или начнёт чтение новой ни с того места...
    я когда разбирал структуру файла hamgam даже не стал это проверять, но раз уж начал эту статью, то решил показать, как это будет выглядеть
    upload_2017-5-30_1-22-43.png

    я затер разделитель между Start и Load (записал "w") в итоге была считана сумма строк, а вот вторая строка считалась верно...

    таким образом становится очевидным, что нужно искать другой более хитрый путь, прямой путь, о котором можно найти очень быстро - это:
    1. дизассемблирование
    2. изменение ресурсов
    3. и последующее реассемблирование игры...
    собственно для обычных игр и программ этот путь достаточно понятен, но вот для игр dos4gw для тех, кто только начинает этот
    путь - сам путь оказывается совершенно не очевидный... и очень запутанный....
    собственно именно по этому (из-за очень запутанного пути дизассемблирования) я и начал эту небольшую тему...
    в надежде, что даже если я не смогу до конца решить эту задачу, то кто-то или поможет или сможет уже прошедшую часть пройти быстрее...

    ............... продолжение набирается..........

    ps: собственно есть второй путь, который я сразу отмёл, но который после того как я углубился в этот вопрос нравится мне больше и больше,
    собственно идея не дизассемблировать программу, а разлинковать её, то есть выделить где происходит обращение по абсолютным адресам ресурсов и изменить адреса на новые... но это отдельная тема...
    может быть кто-то выскажется, что разлинковка более логичный вариант... не знаю...
    pss: не думай те, что у меня депрессивное настроение, потому что я не поставил за всю тему ни одного смайла... оно просто задумчивое...
    --- добавлено 30 май 2017, предыдущее сообщение размещено: 30 май 2017 ---
    собственно следующий шаг:
    1. дизассемблирование
    он разбивается на два:
    1.1 нужно отделить от программы 16-битный заголовок.
    фишка в том, что программа под dos4gw представляет собой смешанный формат 16-битный загрузчик и расширение LE
    (искать в гугле по Linear Executable) по этому, если подсунуть дизассемблеру сразу целый exe файл он его определит как
    16битную прогу и дальше дизасемблирование развалится...
    для отделения заголовка наиболее рекомендую инструмент, который есть в dos4a
    скачать можно здесь
    http://www.old-games.ru/forum/threads/dosbox-zapusk-igr-ispolzujuschix-ehkstender-dos4gw.30854/
    хотя, конечно, же имеет смысл зайти на сайт разработчика и почитать хелп
    заголовок отделяется утилитой sb с ключом /u
    sb /u hamgam.exe
    результатом является 32-битный LE-файл
    для прикрепления заголовка можно воспользоваться той же утилитой, но прикрепится уже расширитель dos4a
    не уверен, что это не скажется на стабильности... но игруха запускается...
    sb /b hamgam.le

    1.2 а вот следующий этап уже более интересен - это дизасемблирование...
    я сразу напишу ответ, но будьте уверены, он не очевиден, для дизасемблирования можно применить версии
    дизассемблера IDA 4.1-4.6, но не старше, более старшие версии не воспринимают корректно формат LE и вы если и
    получите , то не корректный код и не факт, что сможете выделить там ресурсы...
    НИ ОДИН из других дизасссемблеров, которые я смог попробовать (а это около десятка) даже и близко не выдали
    адекватный код - не тратьте время, пробуйте вначале IDA.
    IDA 4.1-4.6 запускается соответственно через dosbox, предварительно устанавливается и вносятся соответствующие изменения
    в autoexec.bat...

    работа на простейшем уровне с IDA не смотря на нафталиновый интерфейс вполне интуитивно понятна - открыть файл,
    выбрать вариант экспорта - asm
    к сожалению, дебагить в IDA не получится (мне на данном этапе не очень и нужно)...

    собственно следующий этап: анализ и изменения ресурсов дизассемблированного файла я опишу завтра...

    ............... продолжение набирается..........
     

    Вложения:

    • HAMGAM.ZIP
      Размер файла:
      517,1 КБ
      Просмотров:
      50
    • HAMGAM_LE.ZIP
      Размер файла:
      389 КБ
      Просмотров:
      50
    Последнее редактирование: 30 май 2017
    ipaSoft, SAS, AndyFox и 6 другим нравится это.
  4. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    nop и Pyhesty нравится это.
  5. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    ок! маякну, вчера вечером пялился в код дюны... он, к счастью, был 16 битный....
    спасибо за видео... идею понял... я себе это чуть по другому представлял, как дойду - напишу...
    --- добавлено 1 июн 2017, предыдущее сообщение размещено: 1 июн 2017 ---
    -------- я чуть отвлёкся... продолжу... -----------
    собственно вопрос дизассемблирования, не знаю, может быть у кого-то он проходит в более
    простом варианте, но я смог испробовав кучу дизасcемблеров разобрать только IDA4.5
    моим критерием проверки было самое главное - это адекватное выделение ресурсов игры в виде строк
    и вот оно бинго!
    upload_2017-6-1_0-33-32.png

    таким образом, уже кардинально решался вопрос с извлечение и заменой ресурсов, их можно было бы менять
    прямо здесь...
    но дальше меня ждало жутчайшее разочарование... ради которого я и завел эту тему...
    3. часть три реассемблинг...
    так вот, программы под dos4gw в те времена компилировались специальным компиляторов и линковались специальным
    линковщиком, потом в них вшивался (или не вшивался) 16ти битный расширитель dos4gw....
    (для кого-то может быть это и очевидно, но до меня не сразу дошло... я пытался подсунуть код tasm, masm, но распространенные
    компиляторы оказались бесполезны... )
    так вот, для разработки используется среда (компилятор) watcom
    http://www.openwatcom.org/download.php
    если кого-то интересуют версии 2000х годов, они на фтп
    ftp://ftp.openwatcom.org/archive/
    собственно были выкачены все версии, в то же время на момент разработки игры 1994 существовала только версия 9-10...
    upload_2017-6-1_0-47-8.png

    watcom ранних версий устанавливается и работает под dosbox, но собственно, раз у нас код на asm
    нас интересует из пакета компилятор
    wcl386.exe
    (wcc386 - это для С, wpp386 - это для плюсов, где-то есть ещё фортран, но я очень надеюсь, что HoG изначально писался на C/C++)
    подсунув wcl386 нас ASM файл сразу пришлось изменить
    upload_2017-6-1_0-53-20.png
    на моём этапе model huge или flat роли не играет... тк затык оказался в другом,
    анализируя ошибки компилятора...
    upload_2017-6-1_0-55-31.png
    варнинги для меня не очень очевидны.. видимо на данном этапе их можно пропустить...
    а вот ошибки в инструкциях заставили задуматься...
    собственно самая первая ошибка, которая не нравится компилятору, это:
    upload_2017-6-1_0-57-30.png

    откровенно, эта ошибка меня сразила... то есть компилятор не может преобразовать инструкцию
    по инкрементированию в памяти...
    при этом спокойно принимает замену
    add dword_ce7f8,1
    но если с inc все более менее ясно, то, что делать со следующим операндом?
    upload_2017-6-1_1-7-41.png

    mov edi, eax
    mov esi, [esi+4]
    push edi
    mov eax, ecx
    shr ecx, 2
    repnz movsd
    mov cl, al
    and cl, 3
    repnz movsb

    это вот этот код..., очевидно, что тут происходит копирование строки до момента пока не встретиться ноль
    почему и как его может не понять компилятор...
    не уже ли нужно менять эту структуру на другую, более громозкую, что бы обеспечить копирование строки...
    к сожалению, в сети не нашел описание команд ассемблера, может быть плохо искал..., а было бы интересно понять,
    чем же можно её адекватно заменить, а может быть просто записть не правильная...
    с другой стороны ida4 разрабатывали в то же время и должны были проверять совместимость, значит должен быть
    компилятор который это переварит...
    но окончательно меня добило следующее...
    upload_2017-6-1_1-16-57.png

    собственно знаковое деление... не понятно, что же он здесь ожидает...

    при этом компилятор смог проглотить 20 000 строк кода, с этими тремя ошибками, к сожалению, не очень понятно, будет ли
    ещё файл запускаемым, если даже удастся решить эти три проблемы (и что же значат варнинги?...)
    но это уже вопрос для разбора завтрашнего дня...
    на текущий момент (и я так вижу, что эта проблема не только у меня) все стопорится на реассемблинге...

    в дальнейшем я предполагаю, все же пробовать watcom 9.5 (если найду)...
    так же очень отличается дизasm код ida4 от ida6... возможно имеет смысл покопать туда...

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

    pssss: так же есть идея, которая была вскользь озвучена в самом начале и повторно показана jack7277 на видео - это релок,
    я возможно не прав, но он замещает часть байт не меняя размер всей программы, при этом смещая область данных на некоторую
    область, которая возможно никогда не понадобится... (че-то с предупреждениями)....
    если это так, то в моём случае - такой области нет... или если я и найду, то она может оказать маленькой...
    при этом нужно помнить, что смещение в любой области данных потребует смещение всех ссылок в коде (что видимо и демонстрируется
    в видео? (поправь jack7277 если я не прав)...
    я думаю, что более перспективно разлинковать файл... и слинковать его заново... рассмотрю этот вопрос отдельно, когда попробую,
    возможно я уделю идеи разлинковки время до того как буду копаться в ассемблере watcom...

    ------------ дальнейший код обмозговывается... ---------------------
     
    Последнее редактирование: 1 июн 2017
    ipaSoft, SAS, AndyFox и 2 другим нравится это.
  6. MisterGrim Very old

    MisterGrim

    Супер-модератор

    Регистрация:
    29 ноя 2007
    Сообщения:
    23.995
    http://old-dos.ru/files/file_1555.html
     
    nop, Dimouse и Pyhesty нравится это.
  7. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    про отрезание 16-битного заголовка было в теме про харвестер или на краклабе поискать надо, в итоге остается 32-битный рабочий LE файл, который прекрасно в 6.4/6.6 IDA я ковырял, не понимаю твоих заморочек именно с 4 версией. Нужно отрезать заголовок, пересобрать файл или рядом положить dos4gw и уже его курочить дальше, чтоб удобно было и смотреть и сразу запускать.
    Надо вспоминать. История один в один также с вариком1 и mean streets, в них огромное количество правок в .ехе файле и руками каждый релок двигать в хексе очень долго я не придумал способа побыстрее и чтоб на 33 шаге еще не рухнул .ехе надо следить же еще ))

    Потом я проглядел, а ты шрифты уже нашел ? А то смысла нет менять текст, если нет шрифта.

    @A.P.$lasH гуру по этим вопросам, опять будет ругаться, что я забыл как вынуть LE и про релоки ))
    --- добавлено 1 июн 2017, предыдущее сообщение размещено: 1 июн 2017 ---
    а мне наоборот легко и просто в плоской модели памяти, а дос модель просто травмирует, все эти блоки по 64кб, система блок-смещение, слава плоской модели )
    --- добавлено 1 июн 2017 ---
    делается глазами в IDA и кнопкой 'a' на начале текстовых данных, а сами данные смотришь в hex-редакторе, смотришь смещение, находишь где оно в ида и делаешь указание, что следующая область до нуля - это текст, например.
     
    nop и Pyhesty нравится это.
  8. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    спасибо за комментарий =)
    слушай, такой вопрос:
    1. в итоге размер файла варика изменяется? или правка происходит таким образом, что бы смещать, только "небольшую" часть данных, а не все данные
    я обратил внимание, что на видео ты заезжаешь на блок с текстом что-то о копирайтах, понятно, что в идеале оно не должно использоваться...
    2. шрифт мне показалось в отдельном файле... (там почему-то несколько файлов с название font... вечером проверю =)
    3. ну и как бы что бы пояснить, почему я так подробно все это описываю, у меня условно короткая память, из-за специфики своей работы, я могу уже через неделю
    не вспомнить, что и как я делал в прошлый раз, что бы по 1000 раз не изобретать велосипед, я записываю... тк когда я только начал свой разбор, то не смог найти,
    простую и понятную инструкцию, куча разрозненных кусков, по этому подумал, что было бы полезно, раз уж все равно записываю - оформить здесь...
    ну и небольшая скидка, тк я это делаю впервые ...

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

     
  9. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    - Можно данные класть или в пределах .ехе файла или даже за его пределами, я в какой-то из тем записывал это, где-то в начале ехе есть поле типа сколько выделять страниц памяти, каждая страница по сколько то там килобайт, я положил все нужные мне данные за .ехе файл, вспомнил в том же харвестере делал так, чтобы фразу "use %s on %s" расширить до "Использовать %s на %s", тоже надо прочитать тему и найти это поле.

    - Шрифт всё же первичен, какой смысл разбирать ехе файл вдоль и поперек если нет шрифта, только если интересно научиться разбирать ехе файлы ))

    - Продолжай подробно описывать, это помогает как самому вернуться к старой теме, так и интересно для других, сам так же делаю.
     
    Pyhesty нравится это.
  10. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    это, кстати, очень красивое решение, нужно это обмозговать... возможно решит кучу проблем в части ожидания багов, когда статические данные налезут на динамические...
     
  11. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    Точно не помню, но похоже вот оно
    http://unavowed.vexillium.org/pub/doc/LE

    `LE Header Information Block Layout`
    смещение от начала файла LE
    +14h 4 байта │ Memory Pages │ Number of memory pages

    там хранится число страниц, которые выделяются в памяти и в которое отображается ехе файл с диска, если сделать к текущим страницам прибавить еще несколько и добить конец ехе файла нулями, я залил несколько килобайт нулей в конец, сделал +1 страницу и мне хватило на весь текст, что я хотел вставить.
     
    Последнее редактирование: 1 июн 2017
    tRusty и Pyhesty нравится это.
  12. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    @Pyhesty, вот я тебе видосик записал

     
    SAS, AndyFox и Pyhesty нравится это.
  13. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    понял, спасибо, сейчас попробую открыть в своей версии ida6...
    -----------------
    ps: я не надолго пропал, но это из-за основной работы =)
    я продолжаю исследовать эту тему и надеюсь скоро найду промежуточное решение
     
    Последнее редактирование: 4 июн 2017
    jack7277 нравится это.
  14. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    Я вот думаю, может купить микрофон и начать видосики записывать с рабочего стола с комментариями.
     
    007007 нравится это.
  15. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Ну а кто тебе запретит? Я бы наверное такие видео посмотрел.
     
  16. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.305
    Я бы порекомендовал переименовать тему. А то зашел понять, зачем кому-то может понадобиться дизассемблировать DOS4GW :)
     
    jack7277 и Pyhesty нравится это.
  17. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    :D я не знаю, может быть я лох) но чувствую, что проще сам dos4gw дизассемблировать) чем исправить программу под него) сегодня напишу кусок по изучению возможности просто добавить страничку памяти... и почему ничего не получилось =)
    и главное сделаю предположение "что делать?"...
    --- добавлено 5 июн 2017, предыдущее сообщение размещено: 5 июн 2017 ---
    Привет!
    так вот насчет Memory pages, что удалось раскопать,
    собственно структура заголовка (наиболее интересные его части следующие):
    upload_2017-6-5_20-42-52.png

    1. по смещению +14h хранится действительно количество страниц A5h
    2. по смещению +28h хранится размер страницы 1000h
    3. по смещению +2Bh хранится размер последней страницы 7EDh
    общий размер A57EDh или 577869 (маловато откровенно говоря... тк размер LE файла 800к, или это только код? тогда увеличения страницы не должно влиять на размер сигмента данных....
    4. по смещению 0x28 - хранится адрес стека! ESP! и (забегая вперед) он начинает строго за сегментом данных 3A340h
    5. по смещение 0x40 хранится адрес таблицы сегментов (их три), адрес таблицы 0xC4 (благо рядом)
    6. в самой таблице:
    0xC4 - размер сегмента кода cs001(ну какой есть, такой есть), размер 094DС0h
    0xF4 - размер сегмента данных 0x3A340h,собственно там где заканчивается этот сегмент данных начинается стек
    отсюда напрашивается вывод, что нельзя добавить количество страниц не сместив адрес стека... При этом, если сместить стек, то сместятся все остальные вызовы? (или нет?... я что т забыл...)
    7. и дальше почему-то перечисляются все страницы по 4 байта... получается, что если я добавляю ещё одну A6 страницу, мне её так же нужно прописать...
    ---------------------------
    это все я понял после того, как поэкспериментировал и попробовал добавить ещё одну страницу и записав в неё данные, данные
    не отобразились, получается, что они просто не считались и не легли в память...
    в то же время данные, которые лежат хотя бы сотней байт выше конца страницы отлично отображаются (но занимают чужое место в области данных)...
    ----------- остальной код ещё набиваю.... ----------------------


     
    jack7277, SAS и Dimouse нравится это.
  18. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    Надо вспоминать и уточнять и самому попробовать вдруг наврал (
     
    Pyhesty нравится это.
  19. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    я пока надеюсь, что раздвинуть сегменты и выделить ещё парочку страниц все же возможно...
    поработаю над этим...
    все же понимания как устроен LE файл все же прибавилось )))
    запасной вариант: разлинковывать кусок данных, где хранится текст и надеяться, что переведенный
    в сумме будет короче исходного, тогда удастся перевод уместить в тот же объём...
    по факту то же что ты делал на видео...
    но поэкспериментировать получится только на выходных....
    будут новости, буду отписываться
    ps: пожелание nop учёл =) все же не будем реассемблить сам дос)
     
    Последнее редактирование: 5 июн 2017
  20. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.022
    Посыпаю голову всем подряд, обманул неосознанно.

    http://www.old-games.ru/forum/threads/pesochnica-tex-murphy-mean-streets.67553/

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

    Только там файл не 32-битный ((
     
    Последнее редактирование: 6 июн 2017
    Pyhesty нравится это.
  21. Pyhesty

    Pyhesty

    Переводчик

    Регистрация:
    2 май 2017
    Сообщения:
    357
    уже поздно) придётся искать как добавить страницу в 32битный LE файл )
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление