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

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

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

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

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

  1. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    Слушай, а ведь не получается указать в файле конкретный указатель,
    то есть нахожу ссылку на строку в таблице релоков (в частности на NewGame 0xD468)
    указывают вместо этой ссылке любую другую
    upload_2017-6-19_22-54-58.png

    а месте где собственно происходит вызов указываю абсолютный адрес 0xD4680C00
    upload_2017-6-19_22-55-58.png


    и не работает (((
    у меня идей нет... может быть на уровне ядра указатели не грузятся?...

     
  2. jack7277

    jack7277

    Переводчик

    Регистрация:
    23 май 2004
    Сообщения:
    1.108
    Среди релокных байтиков:
    07 00 EF 02 03 D4 68

    07 - указывает на то, что это 32-битное смещение
    00 - указывает на то, что это Internal reference
    EF - не понял
    02 03 D4 68 - собственно сам указатель?

    хотя...
    If Bit 5 of relocation addres type equal 0
    ---For internal reference ------
    +4h 1 │Ind│ Specify Target segment number.

    получается значение 03 указывает на сегмент 3 ?
     
    Последнее редактирование: 21 июн 2017
    Pyhesty нравится это.
  3. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    в моих LE бывает 2 случая 07 00 - указатель будет 16битный и 07 10 - указатель будет 32 битный
    EF 02 - это смещение в пределах страницы, например кодовый сегмент - это 95h страниц, начало новой страницы
    в пределах таблицы релоков указывается в таблице выше (таблица таблицы релоков как я её называю =),
    для того, что бы вычислить правильную позицию изменяемого указателя, нужно понять в какой странице он лежит,
    и добавить 02EF - получится позиция изменяемого указателя 03 - это сегмент на который нужно сослаться, в нашем
    случае смещение третьего сегмента 0x0C0000, это число нужно добавить к указателю 68D4h
    если указатель больше 0xFFFF, то применяют 32битный указатель, все то же самое, но в конце будет полноценное смещение
    без базового адреса сегмента... к примеру, 07 10 EF 02 03 D4 68 04 00 - это была бы смена указателя на 0468D4+0C0000
    как-то так...
    что бы все декодировать нужно разбирать обе таблицы... ((( немного муторно, но придётся это освоить...
    при этом, я попробовал этот релок заменить на аналогичный, что бы он ничего не менял, а в сегменте кода указать правильный адрес
    с правильным сегментом - но данные он не нашёл и выдал нули... что говорит, что указатель совсем не загрузился.... таким образом,
    у меня сомнения, что в LE можно удалить в принципе таблицу релоков, придётся научиться работать с ней.


     
  4. jack7277

    jack7277

    Переводчик

    Регистрация:
    23 май 2004
    Сообщения:
    1.108
    няня? ((

    2017-06-21_11-14-31.png
     
  5. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    не-не
    upload_2017-6-21_12-0-1.png
     

    Вложения:

    jack7277 нравится это.
  6. jack7277

    jack7277

    Переводчик

    Регистрация:
    23 май 2004
    Сообщения:
    1.108
    Надо редактор LE полноценный пилить иначе тот же варик1 или текса мерфи рехнешься руками делать.

    ftp://ftp.tenberry.com/ftp/pub/lxexe.doc
     
    Последнее редактирование: 21 июн 2017
    Pyhesty нравится это.
  7. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    возьмёшься?
    я пока тулсы к HoG оформляю... =) отдельного LE редактора пока не будет..

     
  8. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
    MZ для DOS4G состоит из собранных в один файл исполняемых файлов MZ, BW (DOS16M .ext), MZ-LE(MZ-PE). Тулза для dos32a неправильно вынимает LE. Его надо вынимать вместе с MZ заголовком.
    В моем LE очень удачно страницы лежат друг за другом. Можно грузить одним куском. Думаю, в большинстве так же.

    В самом LE есть несколько отличий от LX:
    PAGE OFFSET SHIFT - на самом деле кол-во байт в последней странице. codesize = <MODULE # OF PAGES - 1>*<PAGE SIZE>+<PAGE OFFSET SHIFT>
    Object Page Table - 4 байтные виртуальные адреса страниц. В отличие от LX нет размера страницы в файле. Все страницы кроме последней <PAGE SIZE>.

    Еще из интересного:
    DATA PAGES OFFSET - указывает на начало страниц в файле начиная от MZ заголовка.

    В общем, пока не вижу препятствий для добавления объекта(сегмента) или расширения последнего. Заалигнить последнюю страницу, добавить новую, поправить кол-во страниц <MODULE # OF PAGES> и размер последней <PAGE OFFSET SHIFT>, дописать объект, дописать его страницы, дописать его релоки (пока 0 записать в таблицу релоков), поправить все оффсеты в заголовках и <DATA PAGES OFFSET>.

    До релоков пока не дошел, но ниже приведу ссылку на LE->PE конвертер. Там конвертятся. DOS4G, кстати, заявляет поддержку PE. Как вариант, можно тупо конвертнуть LE в PE и вставить MZ-PE вместо MZ-LE.

    http://unavowed.vexillium.org/pub/doc/LE
    LX - Linear eXecutable Module Format Description - EDM2
    SEP94: Examining OS/2 2.1 Executable File Formats
    DOS/32A Home Page - исходники dos32a. sb/sbind.asm, dos32a/loader.asm
    Boomerang: DOS4GWBinaryFile.cpp Source File
    flat assembler - View topic - format binary as "LE"
    flat assembler - View topic - [fasmg] le2pe: experimental DOS LE EXE to PE EXE converter - конвертер LE->PE.

    Что у меня пока есть:
    gemresedit/le.rb at master · mypasswordisqwerty/gemresedit · GitHub

    log
     
    Solanacean, AS23, Pyhesty и 2 другим нравится это.
  9. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    офигенно! спасибо!
    постараюсь как вернётся нормальное зрение покопать в этом направлении =)
    в частности интересно попробовать конвертацию, что бы в дальнейшем без проблем
    (как обычно) производить переводы!

    "В общем, пока не вижу препятствий для добавления объекта(сегмента) или расширения последнего. Заалигнить последнюю страницу, добавить новую, поправить кол-во страниц <MODULE # OF PAGES> и размер последней <PAGE OFFSET SHIFT>, дописать объект, дописать его страницы, дописать его релоки (пока 0 записать в таблицу релоков), поправить все оффсеты в заголовках и <DATA PAGES OFFSET>."

    по такому варианту добавить ещё одну страницу не удалось ((( тк всё делалось вручную (правда в несколько попыток) возможно была какая-то ошибка при копировании блоков данных.
    в частности: "Заалигнить последнюю страницу, " последняя страница имеет больший размер, чем записано в исполняемом файле, остаток последней страницы видимо по умолчанию добиваются нулями (неопределенными значениями), после нулевой страницы идёт кеш... но я могу ошибаться, но именно последнюю страницу трогать мне показалось нельзя, тк адресация идёт в программе и за неё...
    но возможно я что-то уже забыл...
    --- добавлено 10 дек 2017, предыдущее сообщение размещено: 10 дек 2017 ---
    "Что у меня пока есть:
    gemresedit/le.rb at master · mypasswordisqwerty/gemresedit · GitHub"
    в двух словах - на чем это написано и как запускать? я там вижу такие функции, как замена текста...
    оно реально функционирует?..
    =) извини, но я любитель, а не программист)
     
    bjfn нравится это.
  10. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
    Это библиотека на ruby для работы с ресурсами.

    Вот примеры скриптов с ее использованием:
    game-utilities/vodka.rb at master · old-games/game-utilities · GitHub
    game-utilities/vdv.rb at master · old-games/game-utilities · GitHub
    game-utilities/slh_pack.rb at master · old-games/game-utilities · GitHub
    game-utilities/bnimg.rb at master · old-games/game-utilities · GitHub

    Сейчас, собсно, добавляю туда поддержку LE.
    --- добавлено 11 дек 2017, предыдущее сообщение размещено: 10 дек 2017 ---
    Ну так да. Прежде чем добавлять новую страницу в новый сегмент, надо этот сегмент выровнять по размеру страницы. Добить нулями до размера страницы. После этого можно добавлять страницу нового сегмента.
    --- добавлено 11 дек 2017 ---
    Ошибся я с таблицей страниц. Не виртуальные адреса там, а оффсеты страниц в файле и флаги. Как в http://unavowed.vexillium.org/pub/doc/LE в самом конце описано.
    Сделал релоки. Мне тоже попались только 7го типа и без списков оффсетов.

    log
     
    Pyhesty нравится это.
  11. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
  12. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    офигенно, постараюсь найти время, что бы повторить вариант с добавлением ещё одного сегмента
    я правильно понимаю. что с той ПО, что по ссылке можно попробовать расширить файл LE?
     
  13. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
    Да. Сегмент я добавил и он грузится. Но, пока релоки не доделаю, поюзать его не получится. Ибо непонятно куда этот сегмент загрузится. Релоки я повставлять попробовал уже - работают.
    Еще (безотносительно моего софта) в LE можно безболезненно расширить сегмент кода. С сегментом данных не получится, т.к. после данных из файла в памяти лежит ближний хип и стек. Туда нельзя писать ничего - потрется.
     
    Pyhesty нравится это.
  14. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    Аналогично, вот и мне удалось расширить только сегмент код, последний сегмент (данных?) никак не расширялся...
    но точно не помню...
     
  15. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
    Не, расширить-то его можно. Но новая страница из файла попадет не в конец сегмента, а в середину. Туда, где заканчиваются оригинальные данные. А это место используется под неинициализированные данные и хип. Оно уже используется прогой, и нашу страницу перезапишут.
     
    Pyhesty нравится это.
  16. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
  17. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
    Оффтоп про строки в exe.

    Передо мной впервые встала задача вытащить ВСЕ строки из exe файла. Поразмыслив, я решил, что задача в большинстве случаев тривиально решается через релоки. А главное - автоматизируема. Большинство компилеров положит строки в сегмент данных, а в сегменте кода будет читать их по адресу и заведет релоки.
    Для нахождения всех строк нам понадобятся 2 функции. Первая - для автоматического распознавания строк. Она читает данные на которые указывают релоки и пытается вычислить строку (минимальный размер, печатные символы, 0 в конце). Вывод дорабатывается ручками - удаляем весь мусор. Вторая функция ищет конкретное значение на которое указывает релок. Для ручного поиска пропущенных строк.
    Обе функции возвращают нам позицию строки в файле и все релоки, указывающие на эту позицию. Храним все это в конфиге.
    Для замены строк расширяем exe, добавляем переведенные строки, и по конфигу перебиваем релоки со старых строк на новые.

    Вот сижу и думаю... То ли это я такой умный, то ли все уже давно так делают, один я дебил...
     
    jack7277 и Pyhesty нравится это.
  18. Pyhesty

    Pyhesty

    Регистрация:
    2 май 2017
    Сообщения:
    607
    Привет!
    огромное спасибо! за софт! правда попробовать смогу только на новогодних праздниках =)

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

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

    про извлечение строк: вот так у меня выглядят извлеченные строки из hog.exe:
    извлеченные строки

    а вот так они выглядели в дизассемблере

    в дизассемблере


    Так вот, насколько я помню, было несколько проблем:
    первая, внутри строк присутствуют служебные символы: в частности перевода строки, а так же %d %s для форматирвоанного вывода
    вторая, это динамическая сборка текста, и именно эта проблема оказывается более сложной, тк она завязана на логическое формирование строки. То есть при построении строки часть берется одной строки, потом в зависимости от контекста другой.
    третья: большая часть текста мусорная... но не всегда понятно можно ли её выкинуть

    Обратную сборку я предполагал делать используя данные по реллокам взятые из дизассемблера.
    И да, перенеся все измененные строки в расширенные второй сегмент.

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

    И соглашусь, было бы просто отлично иметь универсальную программу для начала по извлечению текста,
    а так же по его обратному размещению в файл, если не завязываться как я на листинг дизассемблера, а
    использовать описанный вами метод - то такая программа могла бы стать универсальной =)))
     
    jack7277 и bjfn нравится это.
  19. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
    Да. Я вчера пока писал экспортер строк уже понял, что это тоже самое, что сдернуть строки из дазасма с оффсетами, а потом при импорте пересчитать релоки.
    В целом, неплохо экспортер справился. При минимальной длине в 3 символа мусора даже было не много. При 2 - много.
    Проблемы со служебными символами у меня не было (библиотека поддерживает несколько типов ескейперов). А с форматированными строками разбираться не мне - я тупо кодер.

    Про универсальную тоже думал. Можно легко создать прогу, угадывающую строки с импортом и экспортом измененных. Проблемы две:
    Кто-то должен очень внимательно отфильтровать строки, что б не испортить релоки указывающие на код.
    И строки короче 3 символов надо будет экспортить вручную.

    log
     
    jack7277 и Pyhesty нравится это.
  20. bjfn

    bjfn

    Переводчик

    Регистрация:
    14 июн 2010
    Сообщения:
    268
    А про 16-битные я не подумал. Там-то релоки указывают на значения сегментов в коде, а не данных. Там строки искать не получится, к сожалению...
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление