Сейчас на форуме: -Sanchez-, Alf, Adler, Rio (+5 невидимых)

 eXeL@B —› Софт, инструменты —› Interactive Delphi Reconstructor (IDR). Миттельшпиль
<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . 24 . 25 . 26 . 27 . 28 ... 47 . 48 . >>
Посл.ответ Сообщение

Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 06 декабря 2009 17:29 · Поправил: crypto
· Личное сообщение · #1

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



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

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

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

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

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


Официальный сайт:
kpnc.org/idr32
[Note] Недоступен после трагической гибели Криса (RIP)

Гитхаб
Github sources

Скачать:
Страница загрузки

Dropbox автора
https://www.dropbox.com/sh/9ran313nidqtagb/AADl_m_9GVYSiXUviZtDQWQHa?dl=0

Актуальная версия программы:

Исполняемый файл
Внимание! Требует наличия вспомогательных файлов и баз знаний!!!

Базы данных качать по
ссылке.

Для работы необходимо скачать базу знаний + последнюю версию программы



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 18 августа 2011 22:31
· Личное сообщение · #2

To All
Есть желающие поучаствовать в написании постпроцессора для декомпилятора? Формат пока в процессе создания, но самому делать не хочется, да и некогда. Просто ищу помощников, хотя некоторые уже свои услуги предлагали и ... пропали.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 августа 2011 09:26
· Личное сообщение · #3

Поясни принцип написания. Выковыривать паттерны в базу или работа с массивами от дизасма? Интерфейс какой то есть для доступа к дизассемблированному коду, или самому в отладчике ковырять? Формат делать не хочется в смысле что вообще делать не хочешь или надо помочь? В общем распиши подробнее, а то так непонятно что требуется вообще.

-----
Yann Tiersen best and do not fuck




Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 19 августа 2011 11:08
· Личное сообщение · #4

PE_Kill
Декомпилятор выводит исходный текст с мусором, который "на лету" достаточно сложно обрабатывать, поэтому хочется, чтобы некий обработчик (постпроцессор) преобразовал его в нормальный текст. Вот пример: полученный текст
Code:
  1. procedure TDlg_Combat_Replay_Options.DrawInterior;
  2. begin
  3.   try
  4.     _eax_ := GetCanvas;
  5.     _ebx_ := GetCanvas;
  6.     _eax_ := _ebx_.Font
  7.     SetFuturistMediumFont(_ebx_.Font);
  8.     _eax_ := _ebx_.Font
  9.     _ebx_.Font.SetColor($FF9F7D);
  10.     _eax_ := _ebx_;
  11.     _ebx_.TextOut(15, 38, 'Options In Use');
  12.   finally
  13.   end;
  14. end;

После постпроцессора должно быть так:
Code:
  1. procedure TDlg_Combat_Replay_Options.DrawInterior;
  2. begin
  3.   try
  4.     SetFuturistMediumFont(Canvas.Font);
  5.     Canvas.Font.Color := $FF9F7D;
  6.     Canvas.TextOut(15, 38, 'Options In Use');
  7.   finally
  8.   end;
  9. end;

То есть нужно удалить мусор (промежуточные присваивания), заменить некоторые значения регистров или локальных переменных, заменить вызовы вроде Font.SetColor на присваивания (SetColor - процедура, сопоставленная свойству Color).
Это в общих чертах, пока у меня нет полного описания формата, потому что еще не все конструкции реализованы, но задача уже может быть поставлена.
Формат я опишу, речь шла о самом постпроцессоре, это я так коротко выразился.




Ранг: 103.3 (ветеран), 8thx
Активность: 0.060
Статус: Участник

Создано: 19 августа 2011 11:36
· Личное сообщение · #5

crypto, ты предлагаешь постпроцессор для текстового представления, я все правильно понял? Это же потребуется парсинг и еще ряд нелепых действий. Если адекватно организовать внутреннее представление кода, то можно избежать "проксирования" через текст. Хотя, в свое время именно этим (долгим) путем действовал с DCU обработкой по наработкам Хмельнова.

PS. Мне жаль, что снова не могу толком помочь, отвергаю билдер всеми фибрами. Каждый раз притягивает к проекту и отдаю отчет, что ты в адеквате, но руки опускаются.



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 19 августа 2011 12:37 · Поправил: crypto
· Личное сообщение · #6

NaumLeNet
Привет! Давненько не пересекались.
Ты правильно понял, именно для текстового представления. Наверное можно сочинить промежуточные пикоды, но на это времени нет. Жаль, что ты так категоричен по отношению к Билдеру, но переписать под Дельфи я не в силах.
ЗЫ
Могу предложить вариант - отдаю тебе исходники и забываю о проекте. А ты делаешь с ними, что хочешь




Ранг: 103.3 (ветеран), 8thx
Активность: 0.060
Статус: Участник

Создано: 19 августа 2011 12:45
· Личное сообщение · #7

crypto пишет:
Могу предложить вариант - отдаю тебе исходники и забываю о проекте. А ты делаешь с ними, что хочешь


С ума сошел? Неужели настолько утомился? Там есть куда шпилить, у тебя вполне адекватный подход. Пульни в личку какие-нибудь non-icq координаты, лучше skype.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 августа 2011 16:26
· Личное сообщение · #8

Эмм. Так у тебя проект на Си? Тогда я тоже пас, хотя уже загорелся.

-----
Yann Tiersen best and do not fuck





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 19 августа 2011 16:38 · Поправил: reversecode
· Личное сообщение · #9

crypto
сделай этот постпроцессор плагином
плагин развивай отдельно и за большие деньги
а для бесплатного использования хватит и такого вывода)

ps ведь основная мотивация что то делать это деньги)



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 19 августа 2011 17:03
· Личное сообщение · #10

reversecode
Дык речь о том, чтобы его кто-то написал, пусть даже в виде плагина, хотя я о них уже высказывался. А для бесплатного использования можно уже остановиться




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 19 августа 2011 17:05
· Личное сообщение · #11

crypto пишет:
пусть даже в виде плагина, хотя я о них уже высказывался

Ну а для этого нужно разработать интерфейс для плагинов.

-----
Лучше быть одиноким, но свободным © $me




Ранг: 133.4 (ветеран), 57thx
Активность: 0.110
Статус: Участник

Создано: 19 августа 2011 21:47
· Личное сообщение · #12

Очередное обновление exe

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



Ранг: 67.4 (постоянный), 6thx
Активность: 0.050
Статус: Участник

Создано: 19 августа 2011 22:08 · Поправил: Kiev78
· Личное сообщение · #13

---



Ранг: 67.4 (постоянный), 6thx
Активность: 0.050
Статус: Участник

Создано: 20 августа 2011 12:00 · Поправил: Kiev78
· Личное сообщение · #14

---



Ранг: 36.1 (посетитель), 11thx
Активность: 0.020
Статус: Участник

Создано: 20 августа 2011 12:28
· Личное сообщение · #15

IDR умеет декомпилировать или пока тока дизассеблирует? При попытке нажать на маленькую пимбу _| выводит сообщение under construction. Может есть секретный тестовый параметр командной строки для декомпилятора?



Ранг: 36.1 (посетитель), 11thx
Активность: 0.020
Статус: Участник

Создано: 20 августа 2011 12:40
· Личное сообщение · #16

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


Декомпилятор на основе чего выводит такой код? Он строит code flow graph(CFG)? Строит data flow graph(DFG)? Умеет ли декомпилер пользоваться инфой о сигнатуре(тип передаваемых параметров и возвр. результата) библиотечных функций?



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 22 августа 2011 15:50
· Личное сообщение · #17

Kiev78
Хм, спасибо, что откликнулся. Но тут проблемы возникают - формата еще нет. Опять же с заменой вызовов вроде Font.SetColor на присваивания SetColor - это еще нужно выяснить (в базе знаний), что SetColor устанавливает значение свойства Color в классе TFont. Можно конечно задать эвристику: если процедура начинается на Set (Get), то это и есть присваивание или взятие значения свойства, но можно промахнуться (если в свойствах прописано "нестандартное" имя).
В любом случае спасибо, буду иметь в виду, что в принципе ты не возражаешь поучаствовать
Jonny
Декомпилировать кое-что может. Пользоваться прототипами умеет и даже требует, чтобы прототипы были в наличии (ну а для библиотечных функций, естественно, прототипы уже есть, могут быть только проблемы с системными вызовами, которые начинаются на '@' - здесь еще много пропусков).



Ранг: 67.4 (постоянный), 6thx
Активность: 0.050
Статус: Участник

Создано: 22 августа 2011 18:20 · Поправил: Kiev78
· Личное сообщение · #18

---



Ранг: 67.4 (постоянный), 6thx
Активность: 0.050
Статус: Участник

Создано: 22 августа 2011 20:40 · Поправил: Kiev78
· Личное сообщение · #19

---




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 августа 2011 20:48
· Личное сообщение · #20

Kiev78 пишет:
Как говорится, регулярные выражения рулят!

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

-----
Yann Tiersen best and do not fuck




Ранг: 67.4 (постоянный), 6thx
Активность: 0.050
Статус: Участник

Создано: 22 августа 2011 21:00 · Поправил: Kiev78
· Личное сообщение · #21

---




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 августа 2011 22:43
· Личное сообщение · #22

Kiev78 пишет:
что-нибудь лучше и проще в реализации, будет интересно выслушать

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

Но это лишь теория, у меня не было желания обсерать твою реализацию. Я лишь оспорил высказывание "Как говорится, регулярные выражения рулят!". Ну и высказал свое мнение об оптимизации. Но, т.к. кроме твоего алго на данный момент нет вообще никакого, то и оптимизировать, да и собственно обсуждать то нечего.

-----
Yann Tiersen best and do not fuck


| Сообщение посчитали полезным: NaumLeNet


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 22 августа 2011 22:51
· Личное сообщение · #23

crypto кстати не раскрыл секрет по какому методу работает его декомпиль
если по аналогии HR то там да, будет CFG, и писать плагин будет проще, регулярки там не нужны вообще
а вот если по аналогии CppSourcer, то скорее всего кроме регулярок небудет никакого выхода из положения



Ранг: 67.4 (постоянный), 6thx
Активность: 0.050
Статус: Участник

Создано: 23 августа 2011 00:17 · Поправил: Kiev78
· Личное сообщение · #24

---




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 23 августа 2011 03:47
· Личное сообщение · #25

Kiev78

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

Я свой вариант решения задачи предложил crypto. Решение за ним. Но на мой взгляд такое разделение задач бессмысленно. Нужно постпроцессор своего кода всегда писать самому, дабы иметь возможность в будущем его дорабатывать и подстраивать под новые элементы декомпилятора. Есть еще вариант (крайний случай так сказать) - нанимать того, кто напишет и отдаст в сорцах на нужном языке. Все остальные варианты ведут в тупик ибо свой проект нужен только себе самому (ну и пользователям), никто не будет тратить свое время на чужой проект (а если и будет то временно а потом эту DLL, плагин или что либо еще не переписать ни доработать ибо сорцы у автора, а автор давно забил на проект).

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 23 августа 2011 10:00
· Личное сообщение · #26

Kiev78 пишет:
P.P.S По мере роста содержимого секций [Replacement] и особенно [Assignment] результат естественно будет увеличиваться.

Я именно про это и говорил. А GPcH прав.

-----
Yann Tiersen best and do not fuck




Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 23 августа 2011 11:03
· Личное сообщение · #27

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



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 26 августа 2011 12:37 · Поправил: crypto
· Личное сообщение · #28

Что-то никак не могу догадаться, может быть спецы по Дельфи помогут?
Есть фрагмент кода:
Code:
  1.  00453EA5    mov        esi,1
  2.  00453EAA    mov        ebx,5EEAF0; gvar_005EEAF0:???
  3.  00453EAF    lea        edx,[ebp-0C]
  4.  00453EB2    mov        eax,esi
  5.  00453EB4    call       IntToStr
  6.  00453EB9    mov        ecx,dword ptr [ebp-0C]
  7.  00453EBC    lea        eax,[ebp-10]
  8.  00453EBF    mov        edx,45430C; 'TCPIP Player Host IP Address '
  9.  00453EC4    call       @LStrCat3
  10.  00453EC9    mov        edx,dword ptr [ebp-10]
  11.  00453ECC    lea        ecx,[ebp-0C]
  12.  00453ECF    mov        eax,dword ptr [ebp-4]
  13.  00453ED2    call       TRegistry.ReadString
  14.  00453ED7    mov        edx,dword ptr [ebp-0C]
  15.  00453EDA    mov        eax,ebx
  16.  00453EDC    call       @LStrAsg
  17.  00453EE1    lea        edx,[ebp-0C]
  18.  00453EE4    mov        eax,esi
  19.  00453EE6    call       IntToStr
  20.  00453EEB    mov        ecx,dword ptr [ebp-0C]
  21.  00453EEE    lea        eax,[ebp-10]
  22.  00453EF1    mov        edx,454334; 'TCPIP Player Player Names '
  23.  00453EF6    call       @LStrCat3
  24.  00453EFB    mov        edx,dword ptr [ebp-10]
  25.  00453EFE    lea        ecx,[ebp-0C]
  26.  00453F01    mov        eax,dword ptr [ebp-4]
  27.  00453F04    call       TRegistry.ReadString
  28.  00453F09    mov        edx,dword ptr [ebp-0C]
  29.  00453F0C    lea        eax,[ebx+28]
  30.  00453F0F    call       @LStrAsg
  31.  00453F14    inc        esi
  32.  00453F15    add        ebx,4
  33.  00453F18    cmp        esi,0B
  34. <00453F1B    jne        00453EAF

Ясно, что это простой цикл, а вот каким должен быть тип переменной gvar_005EEAF0 и каким образом в приведенном фрагменте появилась инструкция
add ebx,4
мне не очень понятно. Я так думаю, что это массив структур вроде
PlayerIPAddress:String;
PlayerName:String;
Так ли это? Меня смущает add ebx,4, как-то оно не на месте (обычно проверка счетчика цикла в Дельфи сразу следует за инкрементом или декрементом переменной цикла).



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 26 августа 2011 12:49 · Поправил: Av0id
· Личное сообщение · #29

5EEAF0 табличка dword'ов размером 40 байт? в [5EEAF0 - 4] есть какое-нибудь значение?



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

Создано: 26 августа 2011 13:49
· Личное сообщение · #30

Av0id
Табличка из 20 dword-ов (нули). [5EEAF0 - 4] = 0, но это другая переменная, она используется.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 26 августа 2011 14:04 · Поправил: PE_Kill
· Личное сообщение · #31

crypto
Code:
  1. type
  2.   TPlayStat = packed record
  3.     PlayerIP : array [1..10] of String;
  4.     PlayerName : array [1..10] of String;
  5.   end;
  6. var
  7.   PlayStat: TPlayStat;
  8.   i : Integer;
  9. begin
  10.   for i := 1 to 10 do
  11.   begin
  12.     PlayStat.PlayerIP[i] := IntToStr(i) + ': 127.0.0.1';
  13.     PlayStat.PlayerName[i] := IntToStr(i) + ': Bill';
  14.   end;
  15. end;


-----
Yann Tiersen best and do not fuck


| Сообщение посчитали полезным: crypto
<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . 24 . 25 . 26 . 27 . 28 ... 47 . 48 . >>
 eXeL@B —› Софт, инструменты —› Interactive Delphi Reconstructor (IDR). Миттельшпиль
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати