На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Turbo/Borland Pascal: Reverse Engineerin , декомпиляция до исходного кода, успех возможен
    Некоторое время назад мне очень нужно было восстановить одну важную
    программу, написанную на Turbo Pascal. Я написал анализатор
    отладочной информации в исполняемых файлах, скомпилированных
    в Turbo/Borland Pascal. Анализатор сравнительно неплох: удалось
    практически полностью разобрать все структуры и сделать генератор
    исходных файлов с типами данных, переменными и всеми процедурами
    и функциями. У меня есть некоторый опыт в написании эвристических
    алгоритмов и я убежден, что возможно написание восстановителя
    исходного кода из ассемблера. По примерным прикидкам возможно
    восстановление процентов на 60-70, а это уже не мало.

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

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

    Полагаю не одному мне крайне необходимо восстановить старую
    утраченную программу. Быть может Вы знаете кого-то, кто
    захотел бы помочь.
      Мне бы свои часики восстановить, но они под вынь %)
        Дай хоть посмотреть на твой паскалятор!
          Да, мне тоже интересно.
          Покажи, пожалуйста, готовый бинарник.

          P.S. Чтобы прикрепить файл к сообщению, надо зарегистрироваться. Предварительно надо запаковать файлы в ZIP/RAR.
          Для больших файлов есть http://pascal.sources.ru/cgi-bin/incoming.cgi
          Сообщение отредактировано: Romtek -
            Т.к. я выхожу в Интернет на работе, предоставить прогу смогу только через день-два.
              Не страшно, мы подождём.
              Только выкладывай, пожалуйста без вирусов и троянов. Проверь антивирусом.
                Выкладываю прогу, экспериментируйте, только учитывайте, что на больших прогах есть определенный процент неоднозначностей, кроме того в данном варианте нет никакой
                интерпретации ассемблера в исходный код.
                Прикреплённый файлПрикреплённый файлBPRest.rar (187.56 Кбайт, скачиваний: 643)
                  Некоторого успеха ты, определённо, добился:
                  Распознаны имена переменных, правильно определены типы данных и не только.
                  Приведу часть распознанного исходника.
                  ExpandedWrap disabled
                     
                    unit PROGRAM;        { Seg:Ofs = 0000:0000 }
                     
                    interface
                     
                     
                     
                    function IsDigit: Boolean; { near }      { Seg:Ofs = 0000:0000 }
                    function Char2Int: Integer; { near }         { Seg:Ofs = 0000:001F }
                    function Int2Char: Char; { near }        { Seg:Ofs = 0000:0035 }
                    procedure ReplaceValue; { near }         { Seg:Ofs = 0000:0049 }
                    procedure AddValueToList; { near }       { Seg:Ofs = 0000:0083 }
                    procedure Replace; { near }      { Seg:Ofs = 0000:00A8 }
                    procedure Calc; { near }         { Seg:Ofs = 0000:00F1 }
                    procedure X; { near }        { Seg:Ofs = 0000:01E4 }
                     
                    const
                      Arr: array [1..9] of TData; { typed const? }       { Seg:Ofs = 00B9:0052 }
                      itt: Integer; { typed const? }         { Seg:Ofs = 00B9:0064 }
                      Carry: Integer; { typed const? }       { Seg:Ofs = 00B9:0066 }
                      i: Integer; { typed const? }       { Seg:Ofs = 00B9:0068 }
                      str: STRING; { typed const? }      { Seg:Ofs = 00B9:006A }
                     
                    type
                      TData = record
                        ch: Char;
                        value: Char;
                      end;       { Seg:Ofs = 0000:0000 }
                     
                    implementation
                     
                     
                     
                    function IsDigit: Boolean; { near }      { Seg:Ofs = 0000:0000 }
                    begin
                    0000                   enter   0002,00
                    0004                   mov     al,[BP+04]
                    0007                   cmp     al,30
                    0009                   jb      000F
                    000B                   cmp     al,39
                    000D                   jbe     0013
                    000F                   mov     al,00
                    0011                   jmp     SHORT 0015
                    0013                   mov     al,01
                    0015                   mov     [BP-01],al
                    0018                   mov     al,[BP-01]
                    001B                   leave
                    001C                   ret     0002
                    end;


                  Но:
                  • Не выполняет свою основную задачу - восстановление кода на Паскале! ИМХО, если не невозможно - *очень* сложно.
                  • Программы в основном компилируются без отладочной информации, поэтому бесполезно уже пытаться что-то восстанавливать.
                  • Генерируемый программой BPRest код не подлежит компиляции.

                  В заключение могу сказать, что автор сего проекта очень постарался и уже достоин похвалы.
                  Хотя вопрос полноценного реверсинга всё ещё далеко за горами.

                  Добавлено
                  Последний пункт можно улучшить, убрав Hex-код и добавив вначале слово asm и в конце end; ассемблерных блоков.
                  Параметры функций и процедур восстановить можно? Хотя бы типы.

                  P.S.
                  Я сам когда-то дизассемблировал код программ.
                    Тут дело вот в чем:
                    во-первых, основной целью этого проекта было добыть основную информацию о структуре программы (если она есть); во-вторых, отработать модуль дизассемблирования на конкретной задаче (задача получения именно ассемблерного кода заведомо не ставилась, это не более чем промежуточный этап); в-третьих, вспомни вопрос с которого все началось: основная проблема для меня сейчас - это найти формат оверлейных файлов, т.к. программа, ради которой все это затевалось сделана с оверлеями. Пока я не добуду их формат, и как они линкуются - к эвристике приступать дяже не намерен - не срабатывает принцип "цель оправдывает средства" (в моем случае - "затраты времени и сил"). А эвристику написать не так уж сложно, если ставить не абстрактную цель - восстановить текст от А до Я, а добиваться получения некоторого промежуточного кода, по которому можно восстановить действительно ценные алгоритмы.
                        Все эти вещи мною были изучены еще с полгода назад.
                          Добыл исходники TurboPascal'а. Правда шестого, но все равно много интересного. Изучаю. Выявляю типовые блоки кода.

                          Добавлено
                          Есть у кого добрый дизассемблер старых MZ-файлов на TurboPascal или на Delphi? Видел кучу на сях, но нет времени на трансляцию с си на Паскаль :(
                          Взываю к солидарности: полцарства за дизассемблер :))

                          Добавлено
                          Дело в том, что в начале избрал неправильный подход: сначала распознавал отладочную информацию, а затем добывал код выявленных процедур и функций, однако оказалось, что куча nested функций и процедур оказывается за кадром. Обидно...
                          Теперь надо плясать от кода и привязывать к нему отладочную информацию, а уж потом переходить к реверсингу...
                          Посмотрел Borg в дельфевой реализации, мощно, но черезчур много всего, если брать его как дизассемблер за основу - убью кучу времени на его адаптацию; можно обкромсать, но это плохой вариант... :(
                            Нашел толковый дизассемблер, сейчас занимаюсь адаптацией для нужд декомпиляции (недели две это займет). Попутно встрою свой анализатор отладочной информации.
                            Т.о. недели через три начну встраивать эвристику; на простых тестах срабатывает - восстанавливается до 30% кода. Крыша едет от чтения такого кода, но маленькие алгоритмы уже проще понимать.
                            Надеюсь тема в форуме не вымрет :)
                            Но если это и произойдет - сейчас это уже неважно... :))
                            Сообщение отредактировано: Alchemist -
                              Цитата Alchemist, 15.11.04, 07:06
                              Добыл исходники TurboPascal'а. Правда шестого

                              Исходники RTL седьмого, надеюсь, есть?
                                Цитата Alchemist @ 15.11.04, 08:06
                                Добыл исходники TurboPascal'а.

                                Компилятора?
                                или rtl?
                                  Исходники самого "Turbo Pascal 6.0" компилятора. Исходники 7-го RTL тоже где-то имеются, а что, надо?
                                    Цитата Alchemist @ 22.11.04, 07:19
                                    Исходники самого "Turbo Pascal 6.0" компилятора. Исходники 7-го RTL тоже где-то имеются, а что, надо?

                                    Интересно бы посмотреть. А они на чем написаны?
                                      Компилятор TP6: процентов на 10-15 на Паскале, остальное - ассемблер;
                                      RTL7: 25-30 - Паскаль, остальное ассемблер, хотя возможно количество ассемблера меньше - особо не измерял.
                                        Alchemist, Так ты инфу по оверлеям раскопал хоть?
                                          Нет - документации или инфы - ни грамма. Сейчас по исходникам шестого компилятора и файлам оверлейной поддержки седьмого RTL пытаюсь разобраться как их формируют, чтобы определить, как их разбирать. Получается пока плохо. Немного помогает IDA. Раскопать-бы как ее родной дизассемблер на лету оверлеи подключает... :( Ведь с ходу разбирает, что это именно TP-оверлей, подключает его куда положено и правильно переходы корректирует, тьфу...

                                          "Трудно быть глупым"...
                                            Цитата Alchemist @ 22.11.04, 09:45
                                            Компилятор TP6: процентов на 10-15 на Паскале, остальное - ассемблер;

                                            Может быть зальёте в incoming?
                                              Исходники компилятора "TurboPascal 6.0", а также многих других компиляторов, интерпретаторов, трансляторов, дебаггеров, линкеров, ассемблеров и дизассемблеров можно найти на
                                              http://www.exmortis.narod.ru/
                                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0701 ]   [ 14 queries used ]   [ Generated: 23.12.25, 07:41 GMT ]