Turbo/Borland Pascal: Reverse Engineerin
, декомпиляция до исходного кода, успех возможен
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.43] |
|
|
| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Turbo/Borland Pascal: Reverse Engineerin
, декомпиляция до исходного кода, успех возможен
|
Сообщ.
#1
,
|
|
|
|
Некоторое время назад мне очень нужно было восстановить одну важную
программу, написанную на Turbo Pascal. Я написал анализатор отладочной информации в исполняемых файлах, скомпилированных в Turbo/Borland Pascal. Анализатор сравнительно неплох: удалось практически полностью разобрать все структуры и сделать генератор исходных файлов с типами данных, переменными и всеми процедурами и функциями. У меня есть некоторый опыт в написании эвристических алгоритмов и я убежден, что возможно написание восстановителя исходного кода из ассемблера. По примерным прикидкам возможно восстановление процентов на 60-70, а это уже не мало. Но несмотря на свой опыт, я не смог разобраться со структурой оверлейных файлов (не нашел полноценной документации о том, как, к примеру делает связывание оверлея с основным файлом IDA перед дизассемблированием). Это нужно для того, чтобы собрать единый образ программы, дизассемблировать все целиком и на первом этапе раскидать по процедурам и функциям. На втором этапе я смог бы написать декомпилятор. Если кто-то имеет возможность помочь, я готов предоставить свои наработки, а затем взять на себя написание эвристического анализатора кода. Полагаю не одному мне крайне необходимо восстановить старую утраченную программу. Быть может Вы знаете кого-то, кто захотел бы помочь. |
|
Сообщ.
#2
,
|
|
|
|
Мне бы свои часики восстановить, но они под вынь %)
|
|
Сообщ.
#3
,
|
|
|
|
Дай хоть посмотреть на твой паскалятор!
|
|
Сообщ.
#4
,
|
|
|
|
Да, мне тоже интересно.
Покажи, пожалуйста, готовый бинарник. P.S. Чтобы прикрепить файл к сообщению, надо зарегистрироваться. Предварительно надо запаковать файлы в ZIP/RAR. Для больших файлов есть http://pascal.sources.ru/cgi-bin/incoming.cgi |
|
Сообщ.
#5
,
|
|
|
|
Т.к. я выхожу в Интернет на работе, предоставить прогу смогу только через день-два.
|
|
Сообщ.
#6
,
|
|
|
|
Не страшно, мы подождём.
Только выкладывай, пожалуйста без вирусов и троянов. Проверь антивирусом. |
|
Сообщ.
#7
,
|
|
|
|
Выкладываю прогу, экспериментируйте, только учитывайте, что на больших прогах есть определенный процент неоднозначностей, кроме того в данном варианте нет никакой
интерпретации ассемблера в исходный код. Прикреплённый файл BPRest.rar (187.56 Кбайт, скачиваний: 643)
|
|
Сообщ.
#8
,
|
|
|
|
Некоторого успеха ты, определённо, добился:
Распознаны имена переменных, правильно определены типы данных и не только. Приведу часть распознанного исходника. ![]() ![]() 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; Но: В заключение могу сказать, что автор сего проекта очень постарался и уже достоин похвалы. Хотя вопрос полноценного реверсинга всё ещё далеко за горами. Добавлено Последний пункт можно улучшить, убрав Hex-код и добавив вначале слово asm и в конце end; ассемблерных блоков. Параметры функций и процедур восстановить можно? Хотя бы типы. P.S. Я сам когда-то дизассемблировал код программ. |
|
Сообщ.
#9
,
|
|
|
|
Тут дело вот в чем:
во-первых, основной целью этого проекта было добыть основную информацию о структуре программы (если она есть); во-вторых, отработать модуль дизассемблирования на конкретной задаче (задача получения именно ассемблерного кода заведомо не ставилась, это не более чем промежуточный этап); в-третьих, вспомни вопрос с которого все началось: основная проблема для меня сейчас - это найти формат оверлейных файлов, т.к. программа, ради которой все это затевалось сделана с оверлеями. Пока я не добуду их формат, и как они линкуются - к эвристике приступать дяже не намерен - не срабатывает принцип "цель оправдывает средства" (в моем случае - "затраты времени и сил"). А эвристику написать не так уж сложно, если ставить не абстрактную цель - восстановить текст от А до Я, а добиваться получения некоторого промежуточного кода, по которому можно восстановить действительно ценные алгоритмы. |
|
Сообщ.
#11
,
|
|
|
|
Все эти вещи мною были изучены еще с полгода назад.
|
|
Сообщ.
#12
,
|
|
|
|
Добыл исходники TurboPascal'а. Правда шестого, но все равно много интересного. Изучаю. Выявляю типовые блоки кода.
Добавлено Есть у кого добрый дизассемблер старых MZ-файлов на TurboPascal или на Delphi? Видел кучу на сях, но нет времени на трансляцию с си на Паскаль ![]() Взываю к солидарности: полцарства за дизассемблер ) Добавлено Дело в том, что в начале избрал неправильный подход: сначала распознавал отладочную информацию, а затем добывал код выявленных процедур и функций, однако оказалось, что куча nested функций и процедур оказывается за кадром. Обидно... Теперь надо плясать от кода и привязывать к нему отладочную информацию, а уж потом переходить к реверсингу... Посмотрел Borg в дельфевой реализации, мощно, но черезчур много всего, если брать его как дизассемблер за основу - убью кучу времени на его адаптацию; можно обкромсать, но это плохой вариант... |
|
Сообщ.
#13
,
|
|
|
|
Нашел толковый дизассемблер, сейчас занимаюсь адаптацией для нужд декомпиляции (недели две это займет). Попутно встрою свой анализатор отладочной информации.
Т.о. недели через три начну встраивать эвристику; на простых тестах срабатывает - восстанавливается до 30% кода. Крыша едет от чтения такого кода, но маленькие алгоритмы уже проще понимать. Надеюсь тема в форуме не вымрет ![]() Но если это и произойдет - сейчас это уже неважно... ) |
|
Сообщ.
#14
,
|
|
|
|
Цитата Alchemist, 15.11.04, 07:06 Добыл исходники TurboPascal'а. Правда шестого Исходники RTL седьмого, надеюсь, есть? |
|
Сообщ.
#15
,
|
|
|
|
Цитата Alchemist @ 15.11.04, 08:06 Добыл исходники TurboPascal'а. Компилятора? или rtl? |