1. Теперь за форумную активность начисляются биткоины и другие криптоденьги. Подробнее.
    Скрыть объявление
  2. Появилась архивная версия форума arhiv.xaker.name, где собраны темы с 2007 по 2012 год.
    Скрыть объявление

IDR (Interactive Delphi Reconstructor)

Тема в разделе "Инструментарий", создана пользователем Dr. MefistO, 27 дек 2010.

  1. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    [​IMG]

    IDR (Interactive Delphi Reconstructor) – декомпилятор исполняемых файлов (EXE) и динамических библиотек (DLL), написанных на языке Delphi и выполняемых в среде 32х-разрядных операционных систем Windows.

    Программа, прежде всего, предназначена для компаний, занимающихся разработкой антивирусного программного обеспечения. Она также может в значительной мере помочь программистам в восстановлении утраченных исходных текстов программ.

    Текущей версией программы могут обрабатываться файлы (как GUI, так и консольных приложений), скомпилированные компиляторами версий Delphi2 – Delphi2010.

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

    IDR выполняет статический анализ (анализируемый файл не запускается на выполнение), что позволяет безопасно изучать вирусы, трояны и прочие приложения, запуск которых опасен или нежелателен.

    Программа не требует установки и не делает никаких записей в реестр Windows.

    Ниже приведен скриншот главного окна IDR. Посмотреть примеры работы декомпилятора можно на отдельной страничке. Для подробного ознакомления с возможностями IDR имеется справочный файл в формате CHM, который можно загрузить на странице загрузки или непосредственно по этой ссылке.

    Скачать программу можно по ссылке.



    Статьи с использованием IDR:
     
    Последнее редактирование модератором: 28 фев 2013
    27 дек 2010
    5 пользователям это понравилось.
  2. ~|~евто|-|
    ~|~евто|-| Silentium Новичок
    Симпатии:
    162
    Dr. MefistO, не понял, в чем фишка паролить базу знаний, и нигде не писать, как получить пароль %)
     
    27 дек 2010
  3. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    Там писали они, на главной странице! Типа, пишите на мыло с просьбой о пароле.
     
    27 дек 2010
  4. onthar
    onthar Команда форума Админ
    Симпатии:
    396
    Потестил в боевых условиях - DeDe отдыхает. Элементарна в использовании, автодетект версии дельфи нормально работает. Крайне доволен.
     
    31 дек 2010
  5. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    IDR 2.5.2.11 beta

    [​IMG]

    15.07.2011 Обновлена программа до версии 2.5.2.11 beta.

    • В IDC-скрипт добавлена информация по импортируемым функциям (видимо ее отсутствие приводит к нарушениям стека при использовании HexRays);
    • Исправлены баги отображения обработчиков событий в дереве компонент формы (не отображались некоторые имена обработчиков для наследуемых компонент);
    • Добавлена возможность удаления и добавления полей классов.

    Загрузка IDR
     
    16 июл 2011
  6. depict
    depict Новичок
    Симпатии:
    0
    какой пароль к баз данных 2010...:(

    Добавлено через 2 минуты
    есть ли уроки по этой программы..
    в гугле не нашол((
     
    Последнее редактирование: 27 авг 2011
    27 авг 2011
  7. onthar
    onthar Команда форума Админ
    Симпатии:
    396
    Пароль есть только у автора софта.
     
    Последнее редактирование модератором: 2 янв 2012
    27 авг 2011
  8. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    [​IMG]

    Обновлена программа до версии 2.5.2.66 beta.

    • Исправлен баг импорта имен из idp-файла. Добавлено сообщение о несоответствии файлов;
    • Добавлен просмотр содержимого ресурсной строки при двойном клике на перечне элементов юнита (<ResString>);
    • Исправлена эвристика анализатора (некоторые процедуры ошибочно классифицировались функциями);
    • В CodeViewer синим цветом выделены начальные адреса циклических конструкций;
    • Исправлен баг импортера имен;
    • Unicode String отображаются корректно.

    Загрузка IDR

    Добавлено через 32 секунды
    Пароль можно спросить у автора, либо под хайдом прочитать.
     
    Последнее редактирование: 30 авг 2011
    30 авг 2011
  9. ma5ter
    ma5ter Новичок
    Симпатии:
    2
    На гмейле автор не отвечает, кто знает как с ним связаться?
     
    6 окт 2011
  10. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    Ответит обязательно. Просто он очень занятой! Подожди немного.
     
    6 окт 2011
  11. ma5ter
    ma5ter Новичок
    Симпатии:
    2
    Очень профессионально сделанная тулза, респект!

    А сам скрипт где посмотреть можно, а то на странице загрузки нема?
     
    7 окт 2011
  12. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    IDC-скрипт генерит сама программа при нажатии на соотв. пункт меню. Данные скрипты кушает IDA.
     
    7 окт 2011
  13. ma5ter
    ma5ter Новичок
    Симпатии:
    2
    "А-а, Семен Семеныч!" генерит значит ))

    В общем впечатления.
    Проект в иде (6.1) пришлось пересоздавать (при загрузке отключил автоанализ) скрипт отработал нормально, переименовав почти все функции, однако выкатив кучу ошибок в лог:
    Код:
    401C1C: can't rename byte as 'RTTI_401C1C_Class_TObject' because this byte can't have a name (it is a tail byte).
    и еще тыщу подобных, 
    а на последок пару десятков
    4A8BDC: can't rename byte as 'IsIconic' because the name is already used in the program.
    "Maximum length of new names", увеличил до 200 прогнал скрипт еще раз, не помогло, так и не переименовываются (руками - нормально), почитал про IDC функцию вроде все нормально. Забил, попробую в 5.5 позже (Попробовал, та е ерунда).

    Поставил компилятор, потом прошел автоанализом - нашлось еще пара кусков кода. Применил сигнатуры для 2009 дельфи от _servil_

    Теперь сижу не нарадуюсь, вместо байтогавнища на месте объектов, поля пропертей и методов с оригинальными, заметьте, типами. Рулез! Только надо ринейм поправить.
     
    Последнее редактирование: 7 окт 2011
    7 окт 2011
  14. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    Код:
    401C1C: can't rename byte as 'RTTI_401C1C_Class_TObject' because this byte can't have a name (it is a tail byte).
    и еще тыщу подобных, 
    а на последок пару десятков
    4A8BDC: can't rename byte as 'IsIconic' because the name is already used in the program.
    Это выдает, т.к. Ида уже анализировала эти функции и давала им имена, а скрипт присваивал их заново. Это ничего страшного. И будет во всех версиях Иды.
     
    7 окт 2011
  15. ma5ter
    ma5ter Новичок
    Симпатии:
    2
    Ну да, даже если автоанализ отключен при анализе кода могут появится ссылки. Другое не понятно, почему функция
    Код:
    MakeNameEx(0x44FE50, "TRegistry.HasSubKeys", 0x33);
    выдает ошибку
    Код:
    4A329C: can't rename byte as 'TRegistry.HasSubKeys' because this byte can't have a name (it is a tail byte).
    А руками нормально переименовывается (по нажатию N в иде).
    И из-за этого куча меток так и остается с дефолтными именами. В общем буду копать дальше.
     
    7 окт 2011
  16. ma5ter
    ma5ter Новичок
    Симпатии:
    2
    Не переименование скриптом

    В общем помаялся с не переименованием скриптом разнообразных оффсетов в диком количестве.

    Первый вариант связан с попаданием оффсета на границу данных. При применении скрипта в лоб выдают миллион с хвостиком ошибок типа
    решается почти полностью при прогоне MakeNameEx после анализа идой.

    Второй вариант связан с повторением имен, причем именно в скрипте idc
    Для выправления ситуации делаем так:
    1. При открытии файла отключаем автоанализ.
    2. Меняем компилятор на дельфи (на всяк случай)
    3. Применяем исходный idc скрипт, сгенеренный IDR
    4. Выкидываем неверную сигнатуру VC и добавляем сигнатуру bds2007 (более поздней не нашел но и эта много чего ищет)
    5. Пускаем анализ
    6. Прогоняем исходный idc скрипт через программку на awk (ниже) и применяем полученный скрипт, в котором уже нет дублей имен.
    7. Радоваемся!

    Код:
    BEGIN { 
    	FS = "\""
    	print "static main(){" 
    }
    /MakeNameEx\(0x[0-9A-Fa-f]+, ".+",/ {
    	sub(/\W/, "_", $2)
    	if (NAMES[$2] == "") NAMES[$2] = 0;
    	CNT = NAMES[$2]++;
    	if (CNT == 0) CNT = ""; else CNT = "_" CNT
    	print $1 "\"" $2 CNT "\"" $3;
    }
    END { print "}" }
    
    PS. Awk брать на соурсфордже http://gnuwin32.sourceforge.net/packages/gawk.htm пользоваться гну версией (gawk) так как для замены непотребных символов в имени используется \W - гнушный искейп для регекса
     
    Последнее редактирование: 10 окт 2011
    10 окт 2011
  17. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    ma5ter, спасибо, будем применять. Отписался автору программы, может что-то исправит.
     
    10 окт 2011
  18. ma5ter
    ma5ter Новичок
    Симпатии:
    2
    Продолжаем разговор )

    Все написанное выше можно забыть ))

    В общем проблемы были с тем что IDR не проверяет типы данных и может легко в одном скрипте наложить на одну область памяти данные разной длины, например запихать дворд внутрь массива байтов.

    Переделал скрипт awk, теперь он причесывает сгенеренный IDC скрипт для дальнейшего применения по назначению:
    Код:
    BEGIN {
    	COUNTA = 0
    	COUNTS = 0
    	COUNTQ = 0
    	COUNTD = 0
    	COUNTW = 0
    	COUNTB = 0
    }
    {
    	if (match($0, /#include <idc\.idc>/, m)) {
    		print $0 "\nstatic MakeNameForce(ea, name, flags){\n\tauto aa;\n\taa = ea;\n\tif (isTail(GetFlags(aa))) {\n\t\twhile (isTail(GetFlags(aa))) aa--;\n\t\tMakeUnkn(aa, 1);\n\t}\n\tMakeNameEx(ea, name, flags);\n}"
    	}
    	else if (match($0, /static main\(\)\{/, m)) {
    		print "}\n" $0 "\nSetLongPrm(INF_STRTYPE, ASCSTR_PASCAL);"
    	}
    	else if (match($0, /SetLongPrm\(INF_STRTYPE, ASCSTR_PASCAL\);/, m)) {
    		# already set
    	}
    	else if (match($0, /MakeNameEx\(([0-9A-Fa-fx]+), "([^"]*)", ([0-9A-Fa-fx]+)\);/, m)) {
    		name = m[2]
    		if (name == "") {
    			print $0
    		}
    		else {
    			sub(/\W/, "_", name)
    			if (NAMES[name] == "") NAMES[name] = 0
    			CNT = NAMES[name]++
    			if (CNT == 0) CNT = ""; else CNT = "_" CNT
    			print "MakeNameForce(" m[1] ", \"" name CNT "\", " m[3] ");"
    		}
    	}
    	else if (match($0, /MakeArray\(([0-9A-Fa-fx]+), ([0-9A-Fa-fx]+)\);/, m)) {
    		LINESA[COUNTA++] = $0
    	}
    	else if (match($0, /MakeStr\(([0-9A-Fa-fx]+), ([0-9A-Fa-fx]+)\);/, m)) {
    		LINESS[COUNTS++] = $0
    	}
    	else if (match($0, /MakeByte\(([0-9A-Fa-fx]+)\);/, m)) {
    		LINESB[COUNTB++] = $0
    	}
    	else if (match($0, /MakeWord\(([0-9A-Fa-fx]+)\);/, m)) {
    		LINESW[COUNTW++] = $0
    	}
    	else if (match($0, /MakeDword\(([0-9A-Fa-fx]+)\);/, m)) {
    		LINESD[COUNTD++] = $0
    	}
    	else if (match($0, /MakeQword\(([0-9A-Fa-fx]+)\);/, m)) {
    		LINESQ[COUNTQ++] = $0
    	}
    	else if ($0 == "}") {
    		# skip
    	}
    	else {
    		print $0
    	}
    }
    END {
    	for (i = 0; i < COUNTB; i++) print LINESB
    	for (i = 0; i < COUNTW; i++) print LINESW
    	for (i = 0; i < COUNTD; i++) print LINESD
    	for (i = 0; i < COUNTQ; i++) print LINESQ
    	for (i = 0; i < COUNTS; i++) print LINESS
    	for (i = 0; i < COUNTA; i++) print LINESA
    	print "}"
    }


    Краткие пояснения:

    1. Объявлена новая функция MakeNameForce, которая поименует оффсет даже в случае если он не попадает на границу (is a tail byte), для этого она сканирует адреса назад до первой границы и андефайнит текущий блок.

    2. Команды в скрипте отсортированы: сначала переименования и работа с кодом, потом установка типов данных. Причем типы данных устанавливаются в порядке приоритетов от самого короткого - байта - высший приоритет, к самому длинному - массиву - низший приоритет. [Сначала хотел сделать разбор пересекающихся блоков по адресам и выкидывать конфликтующие команды а еще лучше заворачивать их в структуры, но кажется установки типов в таком порядке достаточно для корректного отображения, а этот проект у меня на раз так что возиться дальше лень]
     
    11 окт 2011
  19. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    [​IMG]

    Обновлена программа до версии 2.5.3 beta.

    • Internal buffer overflow bug was fixed (buffer for converting string variables);
    • Idc-script generator severe bugs were fixed (in particular, for Delphi 2010);
    • Repeated names analyzis was added to idc-script generator;
    • Separator '+' in units list was replaced to ';'
    • Possibility to cancel saving class tree in project file was added;
    • It's possible to rebuild class tree repeately;
    • SourceCode content may be copied to Clipboard, temporary file $$$.$$$ not created.

    Загрузка IDR
     
    24 окт 2011
  20. smwed
    smwed Новичок
    Симпатии:
    0
    Чет написал автору IDR, а он молчит. Может кто отсюда из шапки в личку мне кинет пароль для архива базы знаний?
     
    28 ноя 2011

Поделиться этой страницей

Загрузка...