Delphi Interactive Delphi Reconstructor (IDR) [недавняя обнова]

delphi decompiler

Error13Tracer

Враг народа
Мудрец
Сообщения
148
Реакции
110
Interactive Delphi Reconstructor (IDR)

1607729179329.png


A decompiler of executable files (EXE) and dynamic libraries (DLL), written in Delphi and executed in Windows32 environment.

The program firstly is intended for the companies, engaged by development of anti-virus software. It can also help programmers to recover lost source code of programs appreciably.

The current version of the program can process files (GUI and console applications), compiled by Delphi compilers of versions Delphi2 – Delphi XE4.

Final project goal is development of the program capable to restore the most part of initial Delphi source codes from the compiled file but IDR, as well as others Delphi decompilers, cannot do it yet. Nevertheless, IDR is in a status considerably to facilitate such process. In comparison with other well known Delphi decompilers the result of IDR analysis has the greatest completeness and reliability. Moreover interactivity does work with the program comfortable and (we shall not be afraid of this word) pleasant.

IDR make static analysis (analyzed file is not loaded to memory and executed) that allows to safely investigate viruses, trojans and other malware applications, those which executing is dangerous or is not desirable.

The program does not require any installation activity and does not do any records in Windows registry.

Use Borland C++ Builder 6 to build this project.

IDR dont require any installations, just copy idr.exe, dis.dll, icons.dll, idr.ico and *.bin files to IDR home directory. Message "Cannot Initialize Disasm" means that file dis.dll is absent.

!!! Knowledge bases for various Delphi versions can be found at: https://www.dropbox.com/sh/9ran313nidqtagb/AADl_m_9GVYSiXUviZtDQWQHa?dl=0

https://github.com/crypto2011/IDR

PS: Заметил, что недавно было обновление, решил поделиться
 
Последнее редактирование:

TryAga1n

Наставник
Сообщения
40
Реакции
385
Ни релиза, ни чейнджлолга. Есть у кого-нибудь инфа, что обновилось? А то я в последний день перед смертью экзелаба как раз общался с крипто по поводу одной существенной ошибки, а потом связь прервалась(((
 

Jaa

Мудрец
Сообщения
116
Реакции
286
А где можно скачать 64 битную версию idr, на гитхабе только исходники?
 

_MBK_

Новичок
Сообщения
451
Реакции
118
А где можно найти к нему базы, в частности kb7.bin ?
 

crypto

Мудрец
Сообщения
1
Реакции
431
Привет всем! Давненько тут не появлялся. Спасибо, что не забываете.
IDR на github обновился:
1. Добавлена функция вывода данных о типах (в виде структур) в файл *.h, который можно потом загрузить в IDA и декомпилировать код с помощью HexRays. Досадный минус - приходится корректировать полученный файл при его загрузке в IDA. Очевидный плюс - декомпиляция становится проще и удобнее. У меня был проект, в котором созданный файл содержал порядка 12 тыс. типов, корректировка заняла несколько часов, но эти затраты полностью себя окупают. Если честно, я не пробовал на других проектах. Может быть найдутся желающие что-то добавить в концепт (к примеру, не мешало бы создать еще один файл .idc, который бы содержал прототипы функций, особенно системных).
2. Архивы баз данных перенесены (из-за постоянных жалоб со стороны ребят из dropbox о превышении трафика) на (спасибо
Gideon Vi за ссылку) https://drive.google.com/drive/folders/1IBsO1_O9xGHkPPV9Pnqkq2uoFmuak5C7
 

dermatolog

Ветеран
Сообщения
36
Реакции
6
Признак NORETURN для Halt0 определяется по имени функции? Какая прелесть :whistle:
 
Последнее редактирование:

dermatolog

Ветеран
Сообщения
36
Реакции
6
Проблемы с определением SWITCH по адресу 00406154:
Код:
_Unit1.@VarCmp
00406108        push        esi
00406109        push        edi
0040610A        mov         edi,eax
0040610C        mov         esi,edx
0040610E        mov         eax,dword ptr [edi]
00406110        mov         edx,dword ptr [esi]
00406112        and         eax,0FFF
00406117        and         edx,0FFF
0040611D        cmp         eax,11
00406120>       jbe         0040612E
00406122        cmp         eax,100
00406127>       jne         0040615D
00406129        mov         eax,8
0040612E        cmp         edx,11
00406131>       jbe         00406140
00406133        cmp         edx,100
00406139>       jne         0040615B
0040613B        mov         edx,8
00406140        mov         al,byte ptr [eax+80106C]
00406146        mov         dl,byte ptr [edx+80106C]
0040614C        movzx       ecx,byte ptr [edx+eax*8+801080]
00406154        jmp         dword ptr [ecx*4+40616F]
0040615B        mov         eax,edx
0040615D        cmp         eax,101
00406162>       jne         0040618F
00406164        pop         edi
00406165        pop         esi
00406166        call        AnyCmp
0040616B        push        eax
0040616C        popf
0040616E        ret
0040616F        pop         dword ptr [ecx+40]
00406172        add         byte ptr [esi-64FFBF9F],dl
00406178        popad
00406179        inc         eax
0040617A        add         byte ptr [ebp-26FFBF9F],ch
00406180        popad
00406181        inc         eax
00406182        add         ch,dh
00406184        popad
00406185        inc         eax
00406186        add         byte ptr [edx],al
00406189        inc         eax
0040618A        add         byte ptr [ebp+5F004061],ch
00406190        pop         esi
00406191>       jmp         VarInvalidOp
00406196        cmp         al,dl
00406198        pop         edi
00406199        pop         esi
0040619A        ret
С адреса 0040616F идет откровенный шлак, т.к. на релоки при дизасме никто не смотрит (код из IDA):
Код:
CODE:0040616F jpt_406154      db  8Fh ; Џ OFF32 SEGDEF [CODE,40618F]
CODE:0040616F                                         ; DATA XREF: sub_406108+4C↑r
CODE:0040616F                                         ; jump table for switch statement
CODE:00406170                 db  61h ; a
CODE:00406171                 db  40h ; @
CODE:00406172                 db    0
CODE:00406173                 db  96h ; – OFF32 SEGDEF [CODE,406196]
CODE:00406174                 db  61h ; a
CODE:00406175                 db  40h ; @
CODE:00406176                 db    0
CODE:00406177                 db  9Bh ; › OFF32 SEGDEF [CODE,40619B]
CODE:00406178                 db  61h ; a
CODE:00406179                 db  40h ; @
CODE:0040617A                 db    0
CODE:0040617B                 db 0ADh ;  OFF32 SEGDEF [CODE,4061AD]
CODE:0040617C                 db  61h ; a
CODE:0040617D                 db  40h ; @
CODE:0040617E                 db    0
CODE:0040617F                 db 0D9h ; Щ OFF32 SEGDEF [CODE,4061D9]
CODE:00406180                 db  61h ; a
CODE:00406181                 db  40h ; @
CODE:00406182                 db    0
CODE:00406183                 db 0F5h ; х OFF32 SEGDEF [CODE,4061F5]
CODE:00406184                 db  61h ; a
CODE:00406185                 db  40h ; @
CODE:00406186                 db    0
CODE:00406187                 db    4 ; OFF32 SEGDEF [CODE,406204]
CODE:00406188                 db  62h ; b
CODE:00406189                 db  40h ; @
CODE:0040618A                 db    0
CODE:0040618B                 db 0ADh ;  OFF32 SEGDEF [CODE,4061AD]
CODE:0040618C                 db  61h ; a
CODE:0040618D                 db  40h ; @
CODE:0040618E                 db    0
Да и с 00406162 есть условный переход на 0040618F, по которому у нас надизасмилось не пойми чего:
Код:
0040618A        add         byte ptr [ebp+5F004061],ch
00406190        pop         esi
Да, печально.
 
Последнее редактирование:

dermatolog

Ветеран
Сообщения
36
Реакции
6
В функции на EP куда-то потерялся try/finally:
Код:
...
00800445        push        8005B4
0080044A        push        dword ptr fs:[eax]
0080044D        mov         dword ptr fs:[eax],esp
...
0080059E        mov         dword ptr fs:[eax],edx
008005A1        push        8005BB
008005A6        lea         eax,[ebp-1C]
008005A9        mov         edx,4
008005AE        call        @LStrArrayClr
008005B3        ret
Нет ни 8005B4, ни 8005BB (код из IDA):
Код:
CODE:008005B4
CODE:008005B4 loc_8005B4:                             ; DATA XREF: start+19↑o
CODE:008005B4                 jmp     sub_403A50
CODE:008005B9 ; ---------------------------------------------------------------------------
CODE:008005B9                 jmp     short loc_8005A6
CODE:008005BB ; ---------------------------------------------------------------------------
CODE:008005BB
CODE:008005BB loc_8005BB:                             ; CODE XREF: start+187↑j
CODE:008005BB                                         ; DATA XREF: start+175↑o
CODE:008005BB                 call    sub_403F5C
CODE:008005BB start           endp
К слову сказать IDA определила NORETURN у 403F5C (Halt0) без всяких сигнатур:
Код:
CODE:00403F5C ; Attributes: noreturn
CODE:00403F5C
CODE:00403F5C sub_403F5C      proc near               ; CODE XREF: sub_40407C+6↓j
CODE:00403F5C                                         ; start:loc_8005BB↓p
CODE:00403F5C                 push    ebx
CODE:00403F5D                 push    esi
CODE:00403F5E                 push    edi
CODE:00403F5F                 push    ebp
...
 
Последнее редактирование:

sendersu

Мудрец
Сообщения
301
Реакции
581
@dermatolog откройте пару-тройку багов, потом для них PR
и будет вам слава и история во язицех
 

dermatolog

Ветеран
Сообщения
36
Реакции
6
Я просто пишу про баги в проекте. Я правильно понимаю, что ТС это автор?
 

_MBK_

Новичок
Сообщения
451
Реакции
118
Кстати, есть такое, я сам давно заметил, что IDR дофига кода обрезает. Это как то лечится или это фича?
 

sendersu

Мудрец
Сообщения
301
Реакции
581

dermatolog

Ветеран
Сообщения
36
Реакции
6
Эта пять!
Код:
if (_curAdr == 0x007422A4)
_curAdr = _curAdr;
P.S. Код функции на 1400+ строк откровенно ужасен.
 
Последнее редактирование:
Верх Низ