1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

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

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

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

  1. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Правительство, переименуйте тему в "песочница по hammer of the gods" и удалите это вот мое сообщение. Спасибо.
     
  2. SAS io.sys

    SAS

    Администратор

    Регистрация:
    8 июл 2003
    Сообщения:
    19.653
    @jack7277, лучше пусть автор темы скажет как корректнее назвать. А то переименуем, а он расстроится - не хорошо выйдет.
     
    Dimouse, jack7277 и Pyhesty нравится это.
  3. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    когда, я наберу достаточно данных по реверс-ижиниренгу LE файлов, я создам отдельную песочницу, пока интересуют идеи как можно внести корректно изменения в игры и программы под dos4gw и другие 32битные приложения .386
    я не зря создал кучу хештегов в начале темы, в надежде привлечь к обсуждению тех, кто так же как я перекапывает информацию по
    LE файлам и их дешифровке. hog - просто относительно простой пример, который удобно ломать...
     
  4. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    @Pyhesty, dos4gw тут вообще ни при чем. Это штука, которая включает 32 битный режим проца и передает управление LE файлу, ты ж сам пишешь, что вставлял другой расширитель и всё работало.
     
    Последнее редактирование: 7 июн 2017
  5. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    Огромное количество игр под DOS было выпущено под dos4gw именно под этим названием (dos4gw) их знают,
    компилировались эти программы под средой watcom и эти программы предназначены для работы изначально в среде dos4gw,
    других расширителей они не предполагали, я так понимаю dos4a - это отдельная более легкая не всегда совместимая разработка,
    которая может заменить dos4gw в некоторых случаях - но это не штатный вариант.
    я добавил в заголовок LE =)
    и вчера все же докурил формат LE файла, сегодня постараюсь выложить
     
  6. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Старый дед продолжает вспоминать...
    Как отрезать фулстаб, чтоб остался престаб, чистый LE файл, после этого рядом нужно положить файл dos4gw.exe

     
    tRusty, Dimouse и Pyhesty нравится это.
  7. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    собственно удалось вкурить основную информацию по упрощенному LE файлу
    остановлюсь на основных деталях которые было не очень просто понять
    upload_2017-6-7_23-57-56.png

    я подчеркнул следующие указатели
    (смещения см. по http://unavowed.vexillium.org/pub/doc/LE (полезная и наиболее полная ссылка от jack7277)
    собственно:
    1. 0xC4 начало таблицы описания сегментов
    2. 0x10C начало таблицы со страницами (довольно странная таблица)
    3. 0x03A0 - блок названия программы в списке процессов (в досе процессы?) , так же могли бы процедуры
    для вызова извне по их именам, к счатью их нет, блок достаточно простой
    4. ниже с C4 описание всех трех сегметов 0x10000, 0xB0000, 0xC0000
    важно, что во втором сегменте всего 0xEF данных, он пустой... возможно, можно добавить данных между
    вторым и третьими регистрами
    upload_2017-6-8_0-4-2.png
    5. начиная с 0x3AB начинается магия, как я понимаю, это таблица, размер которой равен количеству страниц памяти
    занимаемой программой и ставится в соответствии следующей таблице (с 0x0643) указывая где в следующей таблице начинается
    новая страница памяти.
    при этом последние четыре байта это какая-то контрольная сумма, пример которой есть даже в описание (видимо настолько не очевидная,
    что потребовался пример), вычисление которой я пока не осознал =)
    6. ну и самый шик - это таблица с 0x0643
    в ней хранятся изменения в указателях самой программе... по хитрому правилу переименовываются указатели на области памяти,
    которые уже на самом деле определены и правильно вычислены линковщиком, при это я совершенно честно проверил: изменяется
    указатель, который совершенно корректно уже определён в теле программы...
    может быть кто-то из гуру и мэтров доса когда-нибудь расскажет в чем сокральный смысл создавать
    вот кусок тела программы, где происходит загрузка адреса начала строки... под указатель выделено 4 байта
    upload_2017-6-8_0-18-4.png
    и аналогичный кусок в магической таблице
    где для переименовывания требуется уже 7 байт... итого расходы только на один указатель 7+4 = 11 байт,
    (а для некоторых 9+4=13 байт) =)))
    upload_2017-6-8_0-19-36.png

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

    итого, можно выделить несколько ключевых частей данного файла (но вообще любого LE)
    (смещения могут отличатся)
    1. с 0x00 хранится заголовок
    2. c 0xC4 хранятся данные по сегментам
    3. с 0x104 хранится информация по страницам памяти в данном случае размером 0x1000 байт
    4. с 0x3AB - хранится таблица начала новых страниц в таблице релоков
    5. c 0x643 - хранится таблица релоков
    6. c 0x279B0 - хранится CODE сегмент 0x01 загружается по смещению 0x10000 и занимает 1-0x95 страницы
    7. c 0xBC9B0 - хранится CODE сегмент 0x02 загружается по смещению 0xB0000 и занимает 0x96ю страницу
    8. с 0xBD9B0 - хранится DATA сегмент 0x03 загружается по смещению 0xC0000 и занимает 0x97-0xA5е страницу

    что не удалось сделать: увеличить размер DATA сегмента просто добавлением ещё одной страницы, даже если её корректно прописать,
    она не появляется, тк DATA сегмент не полный, а загружается только 0xF страниц, остальные не определены....

    собственно следующий шаг, точнее два:
    1. добавить в программу сегмент, пусть даже, который не будет пока использоваться, можно ли его будет разместить
    между вторым и третьим сегментами? и можно ли его будет назвать не по порядку, а номером 4ре? но грузить
    страницы не последовательно с остальными сегментами?...
    пока не ясно, очевидно, что структура файла как будто бы допускает такие вольности, но что будет в реальности.. не понятно...
    2. скорректировать таблицу релокков на этот новый сегмент, ну или точнее интересующую нас часть...
    ----------------------
    я не хочу пытаться пока размещать данные в имеющемся сейчас сегменте данных 0x03, тк его размер достаточно большой и если новых данных окажется достаточно много, то придётся полностью перетряхнуть полностью эту чудную таблицу реллоков, что бы адресоваться конец сегмента...
    в то же время интересно, что достаточно большой, но для нас достаточный кусок с B1000-C0000 памяти не используется, там и можно разместить перевод или любые другие данные...
    собственно буду искать время, что бы вставить сегмент, как будут результаты отпишусь.
    -------------- дальнейший код кодится ---------------
    --- добавлено 8 июн 2017, предыдущее сообщение размещено: 8 июн 2017 ---
    черт!) где звук!) хочу со звуком) ну или под музон)
     

    Вложения:

    Последнее редактирование: 8 июн 2017
    Dimouse нравится это.
  8. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Ненавижу #$%^ сиране релоки, только я лентяй и не догоню чому они 16-битные.



    Причем забавное, отрезанный файл при запуске пишет

    Please insert the Hammer of Gods CD.
     
    Последнее редактирование: 10 июн 2017
    quazatron, Neitan и Pyhesty нравится это.
  9. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    =)))))) короче замузон спасибо ))) но без звука, если бы я не знал структуру файла я бы не догнал)))
    короче я выше постарался отметить этот момент
    "6. ну и самый шик - это таблица с 0x0643
    в ней хранятся изменения в указателях самой программе... по хитрому правилу переименовываются указатели на области памяти,
    которые уже на самом деле определены и правильно вычислены линковщиком, при это я совершенно честно проверил: изменяется
    указатель, который совершенно корректно уже определён в теле программы..."

    фишка в том, что тот указатель который ты видишь, без смещения сегмента D4 68 00 00 =) по адресу 0x50.... что-то там = ) вообще не важен,
    (кстати, заметь, в этом указателе нет смещения сегмента 0xC0000, линковщику минус=), фактически за адрес отвечает тот 16-битный
    указатель, который ты нашёл в таблице по смещению 0x16.... что-то там... эта таблица ппц запаристая, но она переименовывает указатель
    по адресу 0x02EF в кодовом сегменте на указатель в сегменте данных (0x03) 0xD468, если указатель влезает в near запись в таблице 9 байт, если указатель far, то 11 байт....
    эта таблица самая большая проблема при релоке... менять-то её можно, но максимум, что получается адресоваться в текущем адресном пространстве сегмента данных и то не всем, без перелопачивания таблицы....
    вчера пытался перетасовать структуру данных в самом файле, но ещё не доделал, пытаюсь сделать по фен-шую, но иначе никак =)
    попытки решить вопрос адресации в конец сегмента данных успеха не дал... =)

    ps: ушел работать руками ))) собирать мебель) буду вечером)
     
  10. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    hiew умеет LE, надо им глянуть таблицы, еще edump показывает таблицу релоков
     

    Вложения:

    • list.txt
      Размер файла:
      1,3 МБ
      Просмотров:
      535
    Pyhesty нравится это.
  11. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    давай подробнее, как ты приручил hiew к LE?
    у меня не получилось... (((
    чисто использую байтики пока менять...
    дизасемблит какую-то хрень...

    ps: и для меня полнейшая загадка, зачем делать ролоки в сегменте данных (сегмент 0x03)
    это же бред... мне не представить какой механизм их должен подменять, и как это может использоваться в программе...

    Page: 164 ( Object: 3/14 ) Offset: 0002A1EB Length: 7
    07/00 32bit Offset internal 3:0000E23E
    022E

    Page: 165 ( Object: 3/15 ) Offset: 0002A1F2 Length: 248
    07/10 32bit Offset internal 1:00020790
    07AE
    07/10 32bit Offset internal 1:0006EBE0
    07B4
    07/10 32bit Offset internal 1:0007DF46
     
    Последнее редактирование: 11 июн 2017
  12. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Демо версия hiew умеет только PE файлы, а полная версия умеет LE, но я им не особо пользовался надо поискать.
     
    Последнее редактирование: 11 июн 2017
  13. jack7277

    jack7277

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

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    всем привет =)
    извиняюсь, что надолго пропал, но я мучительно изучал в свободное время структуру LE и экспериментировал, что же
    можно с ним сделать, но так что бы не испортить функциональность...
    1. первое, что пытался сделать - это добавить в файл ещё один сегмент, к сожалению, ни под каким соусом этого сделать
    не удалоcь IDA получившиеся файлы открывала корректно, сегмент видела и даже адресовала, но вот dos4gw
    так и не удалось убедить его загрузить
    2. попутно удалось узнать в теле игры версию компилятора watcom 3.2 (или это расширение 32), 1994,
    к счастью компилятор сам вставляет текст о себе в компилированный файл
    upload_2017-6-12_1-38-26.png
    3. попутно было выяснено, что отлепить описание сегментов, от следующей за ним таблицей с описанием
    страниц не получается, не смотря на то, что указатели на таблицу корректны, при этом переместить описание сегментов
    на кратное 0x10 смещение получилось без труда...
    собственно из-за того, что их не удаётся разделить, внутрь так же не получается воткнуть ещё один сегмент (((
    upload_2017-6-12_1-42-52.png
    ps: попутно так же без проблем удалось раздвинуть таблицу смещений страниц реллоков и сами реллоки
    (добавлена ещё одна строка для описания страниц)
    upload_2017-6-12_1-45-59.png
    а тут выровнена таблица реллоков
    upload_2017-6-12_1-47-18.png

    возможно, кто-то задастся вопросом, зачем я запарился какой-то "красотой" вот ведь педант!
    нет, тк было множество неудачных попыток изменить LE, я постарался понять как работает
    разбор LE файла dos4gw и можно ли проводить простейшие действия,
    да и искать начала и концы таблиц намного удобнее...
    разработчикам компилятора самим бы стоило озаботиться о выравниваниях структур данных в файле,
    тк хлама в самом файле и так предостаточно, то пара десятков нулей погоды бы не сделало.
    4.
    так как красивым способом убедить игру, что нужно мне выделить место под текст не удалось,
    была принята запасная попытка - расширить один из сегментов... сегмент кода 01 достаточно большой,
    а вот сегмент 02 начинается с 0xB0000 и занимает всего одну страницу 0x1000, а остальные почти 50кБ должны быть
    свободных... их должно было бы хватить.
    простая проверка замены данных в таблице реллоков подтвердила, что можно адресоваться во второй сегмент без проблем...
    по этому началась правка LE файла
    для того, что бы расширить второй сегмент нужно:
    1. увеличить количество страниц 0x14 (для примера с 0xA5 до 0xA6)
    2. изменить описание в разделе сегментов 0xD0, добавив ещё одну страницу в сегмент 0x02,
    сместить начало в сегменте 0x03
    3. добавить ещё одну страницу в таблице страниц
    4. и самое главное, но не очевидно... сместить таблицу страниц памяти для реллока....
    эта таблица идёт перед таблицей реллоков и содержит на +1 запись больше, чем страниц памяти,
    нужно найти страницу, которую мы вставили и все, что после неё скопировать, таким образом, расширив страницу на одну запись...
    вот это хвост этой таблицы, дальше идёт таблица реллоков
    upload_2017-6-12_1-56-12.png
    5. ну и собственно замена данных во втором сегменте результат - это
    upload_2017-6-12_1-57-13.png


    результат:
    1. реасемблинг LE файла - fail
    2. добавление сегмента данных - fail
    3. расширение текущего сегмента - success
    файл с добавленным сегментом, прикрепил, для тех, кто захочет изучить или посмотреть, что куда смещено...
    ----------------------
    тк потратил довольно много сил и времени на реверс инженеринг, то пока думаю удовлетворюсь результатом,
    места в 50кБ для текста небольшой игры, которой является HoG очень надеюсь, что достаточно,
    предполагаю, что в свободное время ещё вернусь к реасемблинку.
    тк все же он более интересен... и понять почему нельзя полностью перекомпилить дизасм файл...
    ----------------------
    предварительно HoG можно планировать к переводу, нужно только доработать утилиты по выгрузке и загрузке ресурсов,
    а так же посмотреть шрифты...
    ----------------------
    по HoG предполагаю открыть отдельную тему в песочнице, куда выложить утилиты и расширенный LE файл до максимального размера
    второго сегмента.
     

    Вложения:

    • out.zip
      Размер файла:
      389,1 КБ
      Просмотров:
      55
    ipaSoft, kreol, Dimouse и 2 другим нравится это.
  15. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    ну вообще 50кб это какбы очень и очень много так что эпик вин
    надо сценарий попробовать написать и записать крутой видосик по мотивам
     
    Последнее редактирование: 12 июн 2017
  16. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    по просьбе коллег, чуть поясню, как удалось расширить второй кодовый сегмент
    и как, на мой взгляд, это можно делать (хотя не уверен в оптимальности, поверьте, потребовались
    часы и часы вглядывания и сравнивания кусков заголовков, прежде чем удалось правильно расширять
    сегмент, но надеюсь, что тем, кто захочет повторить это удастся быстрее.
    1. нужно тщательное изучить заголовок LE файла, в целом мне удалось понять почти все его значения,
    1.1 за исключением 0x38 - loader size... его изменение ни как не влияло...но на всякий случай я его увеличил
    в конце на 0x100
    1.2 по смещению 0x30 - fixUpSize - кажется оно то же не влияет, тк вся информация есть в указанных в заголовке
    смещениях, но на всякий случай я его корректно так же увеличиваю.
    2. делается программа цифродробилка, которая может перелопачивать файл, без неё вручную так же мне удалось
    несколько раз полностью обработать файл (пока искал в чем проблема), но в целом при написании программы
    приходит некоторое понимание о структуре LE файла.
    во-вторых, такая программа позволяет из раза в раз повторять одни и те же действия с файлом, пока результат
    обработки вручную не совпадёт с машинным вариантом
    в-третьих, это конечно масштабируемость, программа позволит повторить операцию несколько раз
    исходник программы на c# во вложении, он предельно простой, но в голове пришлось по вращать цифрами...
    в целом, все что описано в предыдущем посте - она и совершает...
    ------------------------
    так же во вложении окончательный вариант файла игры с расширенным вторым сегментом до максимум (до 64кБ),
    предполагаю, что дальше буду работать уже с ним в другой теме посвященной переводу игры HoG
    ps: внимание, программа le_tools не является универсальной и почти обязательно потребует доработки под конкретный
    le файл.
     

    Вложения:

    • LE_Tools2.zip
      Размер файла:
      2,3 МБ
      Просмотров:
      59
    • out.zip
      Размер файла:
      389,3 КБ
      Просмотров:
      61
    Neitan, Dimouse и jack7277 нравится это.
  17. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Удалить таблицу релоков из LE файлов без смс скачать торрент бесплатно
    /////////////////////
    В харвестере такая же таблица (секций/сегментов как и в hand of gods)

    2017-06-18_00-08-32.png

    а с варкрафтом1 всё чутка похуже

    2017-06-18_00-11-53.png
     
    Последнее редактирование: 18 июн 2017
    Pyhesty и Neitan нравится это.
  18. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    629
    давай рассказывай, как ты открыл в hiew LE, что бы он был адекватным =)
    кстати, на твоих кадрах - это не таблицы релокков, а сегменты, в первом случае три, во втором две...

    попробовать удалить таблицу?...
    дай мне несколько LE файлов, лучше на внешний сервер и лучше с игрухами

     
  19. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    Второй видосик с отрезанием стаба чуть выше делает из файла LE файл, который все нормально воспринимают, нужно только рядом с ехе файлом положить dos4gw.exe

    насчет кадров/сегментов, я просто логически не разделил две разные мысли )

    Вот варик1, например
    WAR1RUS

    или релиз харвестера
    Release

    В инете полно инструментов типа PE tools, в том числе и для чистки релоков, но нет ничего типа LE tools.
     
    Последнее редактирование: 18 июн 2017
  20. Pyhesty

    Pyhesty

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