Сейчас на форуме: asfa, Rio, _MBK_, Adler (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Исследование приложения Borland Delphi 6.0 - 7.0 в IDA
Посл.ответ Сообщение

Ранг: 4.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2013 04:42 · Поправил: nen777w
· Личное сообщение · #1

Привет!
Набросайте пожалуйста правильных туториалов на тему исследование (реверсинг) приложения написанного на Borland Delphi 6.0 - 7.0 (так говорит PEiD)
Часть функций из делфевых либ IDA распознала а часть говорит что это unknown_libraryname
к тому же я совершенно понятия не имею как генерируются конструкторы/деструкторы Delphi компилятором и как там устроены объекты (компилятора жаль под рукой нет).
Вот это System::__linkproc___ClassCreate() я смутно догадываюсь создание объекта?
Может есть какие то вспомогательные файлы для IDA упрощающие реверсинг делфевых приложений.
з.ы. про DeDe в курсе, очень помогло когда нужно было найти обработчки от контролов.
ВО общем чем больше будет инфомациии на эту тему тем лучше разберусь.
Спасибо.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 27 апреля 2013 08:37
· Личное сообщение · #2

Все ваши темы как-то похожи друг на друга: то ИДА вам не может сделать то, то другое. Вам же обьясняли уже, что ИДА не волшебная палочка, которая все делает за вас, а инструмент, предполагающий знающего и мыслящего пользователя.
Судя по вашим собственным словам, "к тому же я совершенно понятия не имею как генерируются конструкторы/деструкторы Delphi компилятором и как там устроены объекты (компилятора жаль под рукой нет)." вы пока что не один из таких пользователей.
Так что нужно найти время и учиться, а не ждать пока кто-то для вас (такого занятого!) что-то сочинит.

-----
Give me a HANDLE and I will move the Earth.


| Сообщение посчитали полезным: VodoleY, OnLyOnE, verdizela, gazlan, Artem_N, Abraham

Ранг: 4.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2013 11:20
· Личное сообщение · #3

plutos
Я вообще про маны спрашивал о возможно конкретных описаниях реверсинга Delphi программ (вот типа такого: http://blog.0xbadc0de.be/archives/67 (только здесь для С++ компилятора) или вот примерно такого http://www.xakep.ru/magazine/xs/057/012/1.asp (хотя тут ничего такого, но можно найти подход к реверсингу который автор использует)), структуры когда генерируемого Delphi компилятора и все на эту тему. A то что Вы написали - называется почесать свое ЧСВ об меня.

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




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

Создано: 27 апреля 2013 11:28 · Поправил: reversecode
· Личное сообщение · #4

то что вы спрашиваете,называется опытом
и по нему манов нет,
используйте idr, она частично поможет

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

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

Создано: 27 апреля 2013 13:29
· Личное сообщение · #5

nen777w
ИДА создает кашу из программ, написанных на Дельфи, пока вы отделите данные от кода, пройдет немало времени. Охота вам возиться? Обработайте программу в IDR (он не частично помогает, а кардинально), можете создать idc-файл для ИДЫ, если уж так хочется, тогда хоть многие структуры и функции определятся. А вообще приватная версия IDR декомпилирует практически весь код, если хорошо восстановить прототипы (некоторые неясные моменты с типами программа выясняет "на лету" у пользователя), декомпилятор частично работает в последней публичной версии.

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

Ранг: 4.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2013 17:49 · Поправил: nen777w
· Личное сообщение · #6

crypto пишет:
Обработайте программу в IDR (он не частично помогает, а кардинально), можете создать idc-файл для ИДЫ, если уж так хочется, тогда хоть многие структуры и функции определятся. А вообще приватная версия IDR декомпилирует практически весь код, если хорошо восстановить прототипы (некоторые неясные моменты с типами программа выясняет "на лету" у пользователя), декомпилятор частично работает в последней публичной версии.


Супер! Спасибо, сгенерировал IDC и после того как подсунул IDA теперь хоть более менее ясно на что обращать внимание не стоит.
А как получить приватную версию, я так понял что автор IDR Вы?
В той что на сайте есть закладка Source Code, но я так понял она в публичной версии не работает.



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

Создано: 27 апреля 2013 21:01
· Личное сообщение · #7

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



Ранг: 4.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2013 21:22
· Личное сообщение · #8

crypto пишет:
Она работает, только в публичной версии не полный функционал (например, разбираются только простейшие логические конструкции). В приватной версии функционал полный.

А можно как-то получить полную версию?




Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 27 апреля 2013 21:32
· Личное сообщение · #9

crypto пишет:
ИДА создает кашу из программ, написанных на Дельфи


Прекрасно декомпилирует и Delphi и C++ Builder (и многое другое).




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

Создано: 27 апреля 2013 21:42
· Личное сообщение · #10

gazlan
подразумевалось что ida плохо флирт для делфи использует
idr это делает лучше
находить стандартные функции и генерить в idc - лучший вариант,
в остальном как работает idr не знаю

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

Ранг: -4.3 (нарушитель)
Активность: 0=0
Статус: Участник

Создано: 27 апреля 2013 21:47
· Личное сообщение · #11

Новичкам вообще не нужно лезть в IDA Pro,она только ещё больше запутывает и имеет сложный интерфейс.
Пользуйтесь OllyDbg + WinDASM, этого хватает даже для сложных ситуаций




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

Создано: 27 апреля 2013 21:48
· Личное сообщение · #12

LeonoraFF пишет:
OllyDbg + WinDASM

как это спасает от декомпиляции если чел хочет алгос восстановить?
да никак.
поэтому или hexrays или idr или новомодный hopper

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

Ранг: -4.3 (нарушитель)
Активность: 0=0
Статус: Участник

Создано: 27 апреля 2013 21:55
· Личное сообщение · #13

Исходник он все равно не восстановит.Можно выдрать компоненты,классы,ресурсы - но алгоритм всё равно не получишь на паскале. Декомпилятор делфей тут на форуме который выкладывали,он на выходе дает такую кашу что вообще ничего разобрать невозможно.




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

Создано: 27 апреля 2013 21:56
· Личное сообщение · #14

исходники восстановить можно
о чем собственно и разговор
вы просто не в теме



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

Создано: 29 апреля 2013 09:07
· Личное сообщение · #15

LeonoraFF
Все восстанавливается, если немного потрудиться над классами и прототипами. Вот маленький примерчик, созданный за 1 минуту (обработка выхода декомпилятора):

Code:
  1.  ThdTimer::TThreadedTimer.SetEnabled
  2.  004DBC34    push       ebx
  3.  004DBC35    mov        ebx,eax
  4.  004DBC37    cmp        dl,byte ptr [ebx+30]; TThreadedTimer.Enabled:Boolean
  5. >004DBC3A    je         004DBC7B
  6.  004DBC3C    mov        eax,edx
  7.  004DBC3E    mov        byte ptr [ebx+30],al; TThreadedTimer.Enabled:Boolean
  8.  004DBC41    test       al,al
  9. >004DBC43    je         004DBC73
  10.  004DBC45    mov        eax,dword ptr [ebx+2C]; TThreadedTimer.TimerThread:TTimerThread
  11.  004DBC48    cmp        dword ptr [eax+2C],0; TTimerThread.Interval:Integer
  12. >004DBC4C    ja         004DBC5D
  13.  004DBC4E    mov        eax,dword ptr [ebx+2C]; TThreadedTimer.TimerThread:TTimerThread
  14.  004DBC51    cmp        dword ptr [eax+2C],0; TTimerThread.Interval:Integer
  15. >004DBC55    jne        004DBC7B
  16.  004DBC57    cmp        byte ptr [ebx+31],0; TThreadedTimer.AllowZero:Boolean
  17. >004DBC5B    je         004DBC7B
  18.  004DBC5D    mov        eax,dword ptr [ebx+2C]; TThreadedTimer.TimerThread:TTimerThread
  19.  004DBC60    mov        eax,dword ptr [eax+30]; TTimerThread.Event:Longword
  20.  004DBC63    push       eax
  21.  004DBC64    call       kernel32.SetEvent
  22.  004DBC69    mov        eax,dword ptr [ebx+2C]; TThreadedTimer.TimerThread:TTimerThread
  23.  004DBC6C    call       TThread.Resume
  24. >004DBC71    jmp        004DBC7B
  25.  004DBC73    mov        eax,dword ptr [ebx+2C]; TThreadedTimer.TimerThread:TTimerThread
  26.  004DBC76    call       TThread.Suspend
  27.  004DBC7B    pop        ebx
  28.  004DBC7C    ret
  29.  
  30. procedure TThreadedTimer.SetEnabled(AValue:Boolean);
  31. begin
  32.   //004DBC3C
  33.   if (AValue <> Enabled) then
  34.   begin
  35.     Enabled := AValue;
  36.     //004DBC45
  37.     if (AValue) then
  38.     begin
  39.       //004DBC4E
  40.       if (TimerThread.Interval > 0) Or ((TimerThread.Interval = 0) And (AllowZero)) then
  41.       begin
  42.         SetEvent(TimerThread.Event);
  43.         TimerThread.Resume;
  44.       end;
  45.     end
  46.     else
  47.     begin
  48.       TimerThread.Suspend;
  49.     end;
  50.   end;
  51. end;


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

Code:
  1.     if (>= 1) then
  2.     begin
  3.       for lvar_2260 := 0 to N - 1 do
  4.       begin
  5.         lvar_8.Line2d(profs[M].minx - 17, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - (lvar_2260 * 31 + 8), profs[M].maxx + 5, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - (lvar_2260 * 31 + 8));
  6.         lvar_8.Line2d(profs[M].minx - 17, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - (lvar_2260 * 31 + 21), profs[M].maxx + 5, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - (lvar_2260 * 31 + 21));
  7.         lvar_8.Line2d(profs[M].minx - 22, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - (lvar_2260 * 31 + 31), profs[M].maxx + 5, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - (lvar_2260 * 31 + 31));
  8.         lvar_8.Text('Punktart', profs[M].minx - 15, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - 4 - 0.8 - lvar_2260 * 31, 1.8, 0);
  9.         lvar_8.Text('Y (m+NN)', profs[M].minx - 14, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - 14.5 - 0.8 - lvar_2260 * 31, 1.8, 0);
  10.         lvar_8.Text('X (m) ', profs[M].minx - 13, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - 0.8 - 26 - lvar_2260 * 31, 1.8, 0);
  11.       end;
  12.     end;
  13.     for lvar_2260 := ROUND(profs[M].minx) - 5 to ROUND(profs[M].maxx) + 5 do
  14.     begin
  15.       //007F756C
  16.       if (lvar_2260 Mod 50 = 0) then
  17.       begin
  18.         lvar_8.Line2d(lvar_2260, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - N * 31, lvar_2260, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - N * 31 - 1);
  19.         lvar_8.Text(FormatFloat('0', lvar_2260 / 10, CurrencyString) + ' m', lvar_2260 - 0.7, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - N * 31 - 1.2, 1.8, -90);
  20.       end;
  21.     end;
  22.     lvar_8.Line2d(profs[M].minx - 17, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text), profs[M].minx - 17, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - ((- 1) * 31 + 31));
  23.     lvar_8.Line2d(profs[M].minx - 22, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text), profs[M].minx - 22, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - ((- 1) * 31 + 31));
  24.     lvar_8.Line2d(profs[M].maxx + 5, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text), profs[M].maxx + 5, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - ((- 1) * 31 + 31));
  25.     lvar_8.Text('Horizont 0', profs[M].minx - 20, 1000 * (profs[M].Points[profs[M].base1].Place.- profs[M].MinZ) / StrToInt(VScale.Text) - 8, 1.8, -90);




Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 29 апреля 2013 14:33
· Личное сообщение · #16

crypto
Декомпиль работает только в привате?
Редактирование прототипа функции тоже?

-----
старый пень




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

Создано: 29 апреля 2013 15:00
· Личное сообщение · #17

r_e
В паблике неполный функционал (неполный набор инструкций и неполный разбор логических выражений). Редактирование прототипа есть и в паблике (Edit Function)



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 29 апреля 2013 16:16
· Личное сообщение · #18

crypto
Хз. не работает редактирование. Выбираю неопознанную функцию. Говорю Define. Переименовать после этого нельзя. Аргументы поправить вместо знаков вопросов - тоже нельзя. Ни на одну функцию даже частично Src не работает. Всегда ругается Check prototype.
Кстати, DeDe почему-то проименовал все юниты, а вот IDR половину назвал _UnitXX

-----
старый пень




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

Создано: 29 апреля 2013 17:16 · Поправил: crypto
· Личное сообщение · #19

r_e
Пробовал нажать кнопку Edit? И неплохо было бы взглянуть на файл, почему юниты не опознаются.
И экранчик из Деде со всеми обозванными юнитами.
ЗЫ
Мне непонятен подход - нажать конпку и получить исходник. С файлом поработать надо, хотя бы прописать прототипы функций, входящих в исследуемую. Без этого сам понимаешь ни хрена хорошего не получится.


 eXeL@B —› Вопросы новичков —› Исследование приложения Borland Delphi 6.0 - 7.0 в IDA
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати