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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0826 ]   [ 15 queries used ]   [ Generated: 23.12.25, 05:59 GMT ]