Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DCU decompiler

499 views
Skip to first unread message

alexey kolosov

unread,
Dec 15, 1999, 3:00:00 AM12/15/99
to
* Оригинал написан в $CRACK$.TALKS
* Скопировано в PVT.CRACK.WHERE
* Скопировано в RU.HACKER
* Скопировано в RU.DELPHI
·[ hi, all!

ищется декомпилятор DCU-файлов

·[ bit

... infection soon sets in...

Roman Melyohin

unread,
Dec 21, 1999, 3:00:00 AM12/21/99
to
Чего твоpишь, alexey ?

Среда Декабрь 15 1999 09:17, alexey kolosov писал all:

ak> ищется декомпилятор DCU-файлов

2all & you: это как в анекдоте - тебе 6 полос на тpассе или 8?
HЕТУ декомпилеpа dcu, и навеpное не бyдет до появления
искyсственного интеллекта....

[With best regards, Frippy иЗвиHиТЕ зА HеРоВHый ПочЕРк!]
e-mail: pro...@mail.ru


Alexey Tomin

unread,
Dec 22, 1999, 3:00:00 AM12/22/99
to
День добрый, Roman!

> ak> ищется декомпилятор DCU-файлов
>
>2all & you: это как в анекдоте - тебе 6 полос на тpассе или 8?
> HЕТУ декомпилеpа dcu, и навеpное не бyдет до появления
>искyсственного интеллекта....

Есть, но код генерит примерно такой

procedure TMyClass.SomeMethod;
begin
asm
.....
end;
end;

VCL- это же "obj с оберткой"- а дизасемблер- это несложно.

--
WBR, Alexey, AKA a...@null.ru.

Dmitriy Goldobin

unread,
Dec 23, 1999, 3:00:00 AM12/23/99
to
Hi!

> 2all & you: это как в анекдоте - тебе 6 полос на тpассе или 8?
> HЕТУ декомпилеpа dcu, и навеpное не бyдет до появления
> искyсственного интеллекта....

Hет абсолютно никаких препятствий к написанию полноценного декомпилера
DCU и даже EXE. Это связано с особенностями дельфевого кодогенератора,
он темплэйтный и преобразование конструкций языка в код однозначно и
обратимо. Например, в отличие от полноценных кодогенераторов, конструкции
for i:=1 to 10 do и i:=1;while i <= 10 do ... Inc(i) генерят абсолютно
разный код.
Другое дело, что его написание абсолютно коммерчески невыгодно (не
буду этого доказывать, поверьте на слово), а писать только для того
чтобы показать свою круть вряд-ли кто-либо будет. А полуручная
декомпиляция в нормальный исходник (не асм), который после компиляции
дает байт в байт тот же dcu за исключением таймстампов занимает около
недели на 2000 строк.

Bye.

Alexey Tomin

unread,
Dec 23, 1999, 3:00:00 AM12/23/99
to
> Hет абсолютно никаких препятствий к написанию полноценного декомпилера
>DCU и даже EXE. Это связано с особенностями дельфевого кодогенератора,
>он темплэйтный и преобразование конструкций языка в код однозначно и
>обратимо. Например, в отличие от полноценных кодогенераторов, конструкции
>for i:=1 to 10 do и i:=1;while i <= 10 do ... Inc(i) генерят абсолютно
>разный код.

Не совсем. Для версии 2.0 уже не так- он там хитрит много...
Может цикл вообще выкинуть.

> Другое дело, что его написание абсолютно коммерчески невыгодно (не
>буду этого доказывать, поверьте на слово), а писать только для того
>чтобы показать свою круть вряд-ли кто-либо будет. А полуручная

Подобные вещи обычно студентами (как курсовики) пишутся ;)

Другое дело, что реально нужен только "dcu -> (asm в оболочке pas)" -
позволит переносить DCU из одной 32х-версии в другую.

Немного оффтопика: первый компилятор Modula-2 (для PDP-11)
был написан студентами Вирта (судя по заголовкам модулей библиотек).
Ошибок, кстати, в нем было много, но зато один студент основал
borland а другой (если не ошибаюсь) JPI (ныне TopSpeed/Clarion).

И снова топик:

Поиск по Альтависте "+dcu +decompile" дал ссылку на torry

http://www.torry.ru/tother.htm
DCP Decompiler v1.0
By Dmitriy Goldobin. The simple utility for decompiling Delphi Compiled
Package (.DCP) file into a Delphi Package (.DPK) source file. Also (in verbose
mode) generating some additional information aboud contained units.

Вроде как не то- он только заголовок дает?

И еще одну:

http://home.mira.net/~ilan/bookmarks.html
которая ссылается на
DCU online decompiler
http://www.ems.ru/~gold/dcu2pas.htm

Но этот ярлык недоступен
The requested URL /~gold/dcu2pas.htm was not found on this server.

Разбиратся лень- если кому надо- покопайтесь.

Alexey Tomin

unread,
Dec 23, 1999, 3:00:00 AM12/23/99
to
Вот оно:
http://www.ems.ru/~gold/exe2dpr.html

--------------------------------------------------------------
If you lose your Delphi 1.0-4.0 or C++Builder 3.0 project sources, but have an
executable file, then this tool can rescue part of lost sources.
Rescuer produces all project forms and data modules with all assigned
properties and events. Produced event procedures don't have a body (it is not
a decompiler), but have an address of code in executable file.

For C++Builder executables Rescuer make Delphi-compatible sources.

In most cases, I think, Rescuer saves 50-90% of your time to projects
reconstruction.

...

You can download demo version, that produces only 3 forms or/and data modules
from project.

If you would like to register Rescuer, you can do the registration online on
the Internet. See additional information in demo archive.

Registration fee: $39.
--------------------------------------------------------------

Дал ему (для затравки) программу с одной формой и кучей кода.
Получил только dfm, интерфейс и заглушки вида

procedure TForm1.FormPaint(Sender: TObject);
begin
// Address $44F4AC
end;

Оно только RTTI читает- бестолковка!
Хотя м.б. за $39 будет и код восстанавливать?

Dmitriy Goldobin

unread,
Dec 23, 1999, 3:00:00 AM12/23/99
to
Hi!

> DCP Decompiler v1.0
> By Dmitriy Goldobin. The simple utility for decompiling Delphi Compiled
> Package (.DCP) file into a Delphi Package (.DPK) source file. Also (in
verbose
> mode) generating some additional information aboud contained units.
>
> Вроде как не то- он только заголовок дает?

Исходник полный! Hо исходник не DCU, а DPK, что и написано :)) Вещь
абсолютно
бесполезная, публиковалась только чтобы продемонстрировать возможные размеры
EXE, не помню уж кому я это доказывал :)

> DCU online decompiler
> http://www.ems.ru/~gold/dcu2pas.htm

А это тоже я, года 2 назад. Hачал писать декомпилер сразу как онлайн-сервис,
дабы тестеров немеряно было. Потом забросил.

Bye.


Tolik Tentser

unread,
Dec 23, 1999, 3:00:00 AM12/23/99
to
Hi, Dmitriy Goldobin!

В чреве акулы, пойманной 23 Dec 1999 14:46:25 +0300,
дети капитана Гранта нашли письмо на тему 'Re: DCU decompiler':

> Hет абсолютно никаких препятствий к написанию полноценного декомпилера
>DCU и даже EXE.

=8-()
Что-то я даже дизассемблера ни разу не видел, который бы дал код на
ассемблере, способный скомпилироваться в работоспособную программу.
При размере кода хотя-бы в килобайт - два.


>Это связано с особенностями дельфевого кодогенератора,
>он темплэйтный и преобразование конструкций языка в код однозначно и
>обратимо.

Бред.
Кодогенератор у них совершенно общий с C Builder. Со всеми отсюда
вытекающими последствиями.

>Например, в отличие от полноценных кодогенераторов, конструкции
>for i:=1 to 10 do и i:=1;while i <= 10 do ... Inc(i) генерят абсолютно
>разный код.

А с какой радости они должны генерировать одинаковый ???
Это совсем разные по логике программы, безотносительно, что ты
подразумеваешь. Скажем, для for при неиспользовании внутри цикла
переменной цикл может быть сгенерирован и по её убыванию

> Другое дело, что его написание абсолютно коммерчески невыгодно (не
>буду этого доказывать, поверьте на слово),

=8-()
Чушь. Спрос был бы дикий. Чего бы стоила возможность порыться в
исходниках Word`а. Или хотя-бы Delphi IDE.

>А полуручная
>декомпиляция в нормальный исходник (не асм), который после компиляции
>дает байт в байт тот же dcu за исключением таймстампов занимает около
>недели на 2000 строк.

Жутко хочу посмотреть на эти 2000 строк. Просто не могу передать как
хочу. Покажешь ?

В общем сильно хочу аргументации тезиса о реальности восстановления
исходника по EXE.

= Иконку в system tray (где часы) вставляют функцией Shell_NotifyIcon =

Bye ...
Тенцер А.Л.
to...@katren.nsk.ru
ICQ 15925834

Dmitriy Goldobin

unread,
Dec 23, 1999, 3:00:00 AM12/23/99
to
Hi!

> Produced event procedures don't have a body (it is not a decompiler), but

^^^^^^^^^^^^^^^^^^^^^^


> Дал ему (для затравки) программу с одной формой и кучей кода.
> Получил только dfm, интерфейс и заглушки вида
>
> procedure TForm1.FormPaint(Sender: TObject);
> begin
> // Address $44F4AC
> end;
>
> Оно только RTTI читает- бестолковка!

на другое и не претендовало. Это и есть парсер rtti.
насчет 'бестолковки' - в *.crack считается очень полезной тулзой :)

> Хотя м.б. за $39 будет и код восстанавливать?

см. подчеркнутое.

Bye.

Dmitriy Goldobin

unread,
Dec 23, 1999, 3:00:00 AM12/23/99
to
Hi!

> > Hет абсолютно никаких препятствий к написанию полноценного декомпилера
> >DCU и даже EXE.
>
> =8-()
> Что-то я даже дизассемблера ни разу не видел, который бы дал код на
> ассемблере, способный скомпилироваться в работоспособную программу.
> При размере кода хотя-бы в килобайт - два.

Я видел :)

> >Это связано с особенностями дельфевого кодогенератора,
> >он темплэйтный и преобразование конструкций языка в код однозначно и
> >обратимо.
>
> Бред.
> Кодогенератор у них совершенно общий с C Builder. Со всеми отсюда
> вытекающими последствиями.

Значит и с билдером та же история. Дельфевый кодогенератор от D4 у меня
в исходниках. В D5 мало что поменялось.

> >Например, в отличие от полноценных кодогенераторов, конструкции
> >for i:=1 to 10 do и i:=1;while i <= 10 do ... Inc(i) генерят абсолютно
> >разный код.
>
> А с какой радости они должны генерировать одинаковый ???
> Это совсем разные по логике программы, безотносительно, что ты
> подразумеваешь. Скажем, для for при неиспользовании внутри цикла
> переменной цикл может быть сгенерирован и по её убыванию

В watcom она и из while уберется. И код будет абсолютно идиентичен.

> > Другое дело, что его написание абсолютно коммерчески невыгодно (не
> >буду этого доказывать, поверьте на слово),
>
> =8-()
> Чушь. Спрос был бы дикий. Чего бы стоила возможность порыться в
> исходниках Word`а.

Спрос был бы. А денег не было бы. :) Первая копия будет куплена пиратами.
А остальные потенциальные пользователи имеют соответствующий менталитет,
чтобы не покупать, когда можно взять на халяву. Можно конечно всякими
мошенничествами заняться - типа продавать защиту от декомпилера, но
мне это неинтересно.

> или хотя-бы Delphi IDE.
что интересного в Delphi IDE??? Он почти весь в сырцах, не хватает лишь
мелочей типа libmain, которые и самому дописать не проблема.

> >А полуручная
> >декомпиляция в нормальный исходник (не асм), который после компиляции
> >дает байт в байт тот же dcu за исключением таймстампов занимает около
> >недели на 2000 строк.
>
> Жутко хочу посмотреть на эти 2000 строк. Просто не могу передать как
> хочу. Покажешь ?

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

Bye.


Tolik Tentser

unread,
Dec 24, 1999, 3:00:00 AM12/24/99
to
Hi !

> > Что-то я даже дизассемблера ни разу не видел, который бы дал код на
> > ассемблере, способный скомпилироваться в работоспособную программу.
> > При размере кода хотя-бы в килобайт - два.
> Я видел :)

Название ?

> > Кодогенератор у них совершенно общий с C Builder. Со всеми отсюда
> > вытекающими последствиями.
> Значит и с билдером та же история. Дельфевый кодогенератор от D4 у меня
> в исходниках. В D5 мало что поменялось.

=8-()
Во блин.
Ты часом не в Инпрайзе работаешь ???? %-)

> Спрос был бы. А денег не было бы. :) Первая копия будет куплена пиратами.
> А остальные потенциальные пользователи имеют соответствующий менталитет,

Ну да, первый бы декомпилировал - компилировал под своим копирайтом :-)

> > или хотя-бы Delphi IDE.
> что интересного в Delphi IDE??? Он почти весь в сырцах, не хватает лишь
> мелочей типа libmain, которые и самому дописать не проблема.

=8-()
Я полагаю, что писатели экспертов для IDE тебе бы памятник воздвигли
нерукотворный за сорцы.

> > Жутко хочу посмотреть на эти 2000 строк. Просто не могу передать как
> > хочу. Покажешь ?
>
> Пришли _маленький_ dcu, любой версии по твоему усмотрению, но маленький,
> тратить кучу времени на доказательства я не хочу. И еще чтобы он левыми
> dcu не пользовался, потому-что нужны все линкующиеся к нему dcu. Потом
> опубликуем здесь два исходника и сравним.

Высылаю (мылом).
От D5
Использует Registry, Classes, SysUtils, Windows
жду исходника ;-)

--
Bye ...
Тенцер А.Л.
to...@katren.ru
ICQ 15925834

Max Rusov

unread,
Dec 24, 1999, 3:00:00 AM12/24/99
to
Hello, Dmitriy.

> Hет абсолютно никаких препятствий к написанию полноценного декомпилера

>DCU и даже EXE. Это связано с особенностями дельфевого кодогенератора,


>он темплэйтный и преобразование конструкций языка в код однозначно и
>обратимо

Ну это уж ты загнул. Что, и при включенной оптимизации тоже обратимо?

Всяческих благ,
McSim.


ed

unread,
Dec 24, 1999, 3:00:00 AM12/24/99
to
> > Hет абсолютно никаких препятствий к написанию полноценного
декомпилера
> >DCU и даже EXE. Это связано с особенностями дельфевого
кодогенератора,
> >он темплэйтный и преобразование конструкций языка в код однозначно и
> >обратимо
>
> Ну это уж ты загнул. Что, и при включенной оптимизации тоже обратимо?

если процессор понимает,
то и делфи-источник наваять можно (и это однозначтно!)

(просто никакая оффициальная софт-фирма не возмется за это,
т.к. это с какой-то стороны противозаконно!)


--
ed
/autechre's music almost as if it were a living organism/


Dmitriy Goldobin

unread,
Dec 24, 1999, 3:00:00 AM12/24/99
to
Hi!

> > Hет абсолютно никаких препятствий к написанию полноценного декомпилера
> >DCU и даже EXE. Это связано с особенностями дельфевого кодогенератора,
> >он темплэйтный и преобразование конструкций языка в код однозначно и
> >обратимо
>
> Ну это уж ты загнул. Что, и при включенной оптимизации тоже обратимо?

Где ты там оптимизацию видел? :) В D1 из оптимизации было только сокращение
jmp до short jmp и отслеживание содерджимого es:di. В D2 добавилось отсле-
живание остальных регистров. В D3 добавилось прогнозирование содержимого
регистров, но какое-то доморощенное. Далее до D5 включительно ничего не
менялось. Ни пайплайна ни подстройки под предсказание переходов, которые
так затрудняют жизнь декомпилера, там нет.

Bye.


Dmitriy Goldobin

unread,
Dec 24, 1999, 3:00:00 AM12/24/99
to
Hi!

> > > Что-то я даже дизассемблера ни разу не видел, который бы дал код на
> > > ассемблере, способный скомпилироваться в работоспособную программу.
> > > При размере кода хотя-бы в килобайт - два.
> > Я видел :)
> Название ?

IDA. Правил и удачно компилил и по сотне кил кода.

> > > или хотя-бы Delphi IDE.
> > что интересного в Delphi IDE??? Он почти весь в сырцах, не хватает лишь
> > мелочей типа libmain, которые и самому дописать не проблема.
>
> =8-()
> Я полагаю, что писатели экспертов для IDE тебе бы памятник воздвигли
> нерукотворный за сорцы.

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

> > > Жутко хочу посмотреть на эти 2000 строк. Просто не могу передать как
> > > хочу. Покажешь ?
> >
> > Пришли _маленький_ dcu, любой версии по твоему усмотрению, но маленький,
> > тратить кучу времени на доказательства я не хочу. И еще чтобы он левыми
> > dcu не пользовался, потому-что нужны все линкующиеся к нему dcu. Потом
> > опубликуем здесь два исходника и сравним.
>
> Высылаю (мылом).
> От D5
> Использует Registry, Classes, SysUtils, Windows
> жду исходника ;-)

Вообще-то я бы не назвал его таким уж маленьким, я больше часа провозился,
для доказательства imho достаточно было пары деклараций да пары процедур.
Hу да ладно, вот исходник, теперь жду твой для тщательного сравнения :)
------
unit uRegistry;

interface

uses Registry, Classes;

type
TSettings = class
private
FRegistryPath: String;
FLocalPath: String;
FRegistry: TRegistry;
function GetPath( IsGlobal: Boolean = True ): String;
procedure SetLocalPath( const Value: String );
procedure SetPath( const Value: String );
public
property Path: String read FRegistryPath write SetPath;
property LocalPath: String read FLocalPath write SetLocalPath;
procedure SaveBinary( Name: String; var Data; Size: Integer;
IsGlobal: Boolean = True );
function GetBinary( Name: String; var Data; Size: Integer;
IsGlobal: Boolean = True ): Boolean;
procedure SaveString( Name: String; Value: String; IsGlobal:
Boolean = True );
function GetString( Name: String; IsGlobal: Boolean = True ):
String;
procedure SaveStrings( Name: String; Strings: TStrings; Count:
Integer;
IsGlobal: Boolean = True );
procedure GetStrings( Name: String; Strings: TStrings;
IsGlobal: Boolean = True );
procedure SaveParams( Name: String; Params: TStrings; SkipIf: Char
= '!' );
procedure GetParams( Name: String; Params: TStrings );
end;

var
Settings: TSettings;

implementation

uses SysUtils, Windows;

procedure TSettings.SaveStrings( Name: String; Strings: TStrings;
Count: Integer; IsGlobal: Boolean = True );
var
sPath: String;
I: Integer;
SaveCount: Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal ) + '\' + Name;
with FRegistry do try
DeleteKey( sPath );
if Count > 0 then SaveCount := Pred(Count)
else SaveCount := Strings.Count - 1;
if SaveCount > Strings.Count-1 then SaveCount := Strings.Count-1;
if SaveCount > 0 then begin
OpenKey( sPath, True );
for I := 0 to SaveCount do begin
WriteString( Format( 'Line%d', [I] ), Strings[I] );
end;
end;
finally
Free;
end;
end;

procedure TSettings.GetStrings( Name: String; Strings: TStrings; IsGlobal:
Boolean );
var
sPath: String;
KeyNames: TStringList;
I: Integer;
begin
FRegistry := TRegistry.Create;
KeyNames := TStringList.Create;
Strings.Clear;
sPath := GetPath( IsGlobal );
sPath := sPath + '\' + Name;
with FRegistry do try
OpenKey( sPath, False );
GetValueNames( KeyNames );
for I := 0 to KeyNames.Count-1 do begin
Strings.Add( ReadString( KeyNames[I] ) );
end;
finally
KeyNames.Free;
Free;
end;
end;

procedure TSettings.SaveString( Name: String; Value: String; IsGlobal:
Boolean );
var
sPath: String;
I: Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try
OpenKey( sPath, True );
WriteString( Name, Value )
finally
Free;
end;
end;

function TSettings.GetString( Name: String; IsGlobal: Boolean ): String;
var
sPath: String;
I: Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try
try
OpenKey( sPath, False );
Result := ReadString( Name );
except
Result := '';
end;
finally
Free;
end;
end;

function TSettings.GetPath( IsGlobal: Boolean ): String;
begin
if (FLocalPath = '') or IsGlobal then Result := FRegistryPath
else Result := FRegistryPath + '\' + FLocalPath;
end;

procedure TSettings.SetLocalPath( const Value: String );
begin
FLocalPath := Value;
end;

procedure TSettings.SetPath( const Value: String );
begin
FRegistryPath := Value;
end;

function TSettings.GetBinary( Name: String; var Data; Size: Integer;
IsGlobal: Boolean ): Boolean;
var
sPath: String;
I: Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try
OpenKey( sPath, False );
Result := ReadBinaryData( Name, Data, Size ) = Size;
finally
Free;
end;
end;

procedure TSettings.SaveBinary( Name: String; var Data; Size: Integer;
IsGlobal: Boolean );
var
sPath: String;
I: Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try
OpenKey( sPath, True );
WriteBinaryData( Name, Data, Size );
finally
Free;
end;
end;

procedure TSettings.GetParams( Name: String; Params: TStrings );
var
sPath: String;
S: String;
I: Integer;
begin
FRegistry := TRegistry.Create;
Params.Clear;
sPath := GetPath( True ) + '\' + Name;
with FRegistry do try
OpenKey( sPath, False );
GetValueNames( Params );
for I := 0 to Params.Count-1 do begin
S := Params[I];
Params[I] := S + '=' + ReadString( S );
end;
finally
Free;
end;
end;

procedure TSettings.SaveParams( Name: String; Params: TStrings;
SkipIf: Char );
var
sPath, S: String;
I: Integer;
SaveCount: Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( True ) + '\' + Name;
with FRegistry do
try
DeleteKey( sPath );
SaveCount := 0;
for I := 0 to Params.Count-1 do
if Params.Names[I][1] <> SkipIf then
Inc(SaveCount);
if SaveCount > 0 then begin
OpenKey( sPath, True );
for I := 0 to Params.Count-1 do begin
S := Params.Names[I];
if S[1] <> SkipIf then
WriteString( S, Params.Values[S] );
end;
end;
finally
Free;
end;
end;

initialization
Settings := TSettings.Create;

finalization
Settings.Free;

end.
------

Bye.


Tolik Tentser

unread,
Dec 24, 1999, 3:00:00 AM12/24/99
to
Hi !

> > > > Жутко хочу посмотреть на эти 2000 строк. Просто не могу передать как
> > > > хочу. Покажешь ?
> > >
> > > Пришли _маленький_ dcu, любой версии по твоему усмотрению, но
маленький,
> > > тратить кучу времени на доказательства я не хочу. И еще чтобы он
левыми
> > > dcu не пользовался, потому-что нужны все линкующиеся к нему dcu. Потом
> > > опубликуем здесь два исходника и сравним.
> >

> Вообще-то я бы не назвал его таким уж маленьким, я больше часа провозился,
> для доказательства imho достаточно было пары деклараций да пары процедур.
> Hу да ладно, вот исходник, теперь жду твой для тщательного сравнения :)

[Исходник скипнут]

На, сравнивай, хотя сравнивать особо нечего, все один в один (на первый
взгляд). Ты выиграл, однозначно.

Но КАК ????
(с) Ватсон

Расскажи, как ты то делаешь ?
И EXE так умеешь ?????

Я всю жизни считал, что это невозможно. Расскажешь ? Или коммерческая тайна
?

=== uRegistry.pas BEGIN ===

unit uRegistry;

interface

uses Registry, Classes;

type
TSettings = class
private
FRegistryPath : String;
FLocalPath : String;
FRegistry : TRegistry;

function GetPath( IsGlobal : Boolean = TRUE ) : String;
procedure SetLocalPath(const Value: String);
procedure SetPath(const Value: String);


public
property Path : String read FRegistryPath write SetPath;
property LocalPath : String read FLocalPath write SetLocalPath;

procedure SaveBinary(Name: String; var Data; Size: Integer;
IsGlobal : Boolean = TRUE);
function GetBinary(Name: String; var Data; Size: Integer;
IsGlobal : Boolean = TRUE): Boolean;
procedure SaveString( Name, Value : String; IsGlobal : Boolean = TRUE );
function GetString( Name : String; IsGlobal : Boolean = TRUE ) : String;


procedure SaveStrings( Name : String; Strings : TStrings;

Count : Integer; IsGlobal : Boolean = TRUE );


procedure GetStrings( Name : String; Strings : TStrings;

IsGlobal : Boolean = TRUE );
procedure SaveParams(Name: String; Params: TStrings; SkipIf: Char = '!');


procedure GetParams(Name: String; Params: TStrings);
end;

var
Settings : TSettings;

implementation

uses SysUtils, Windows;

procedure TSettings.SaveStrings( Name : String; Strings : TStrings;

Count : Integer; IsGlobal : Boolean = TRUE );


var
sPath : String;
I : Integer;
SaveCount : Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal ) + '\' + Name;
with FRegistry do try
DeleteKey( sPath );
if Count > 0 then SaveCount := Pred( Count )

else SaveCount := Pred( Strings.Count );
if SaveCount > Pred( Strings.Count ) then SaveCount :=
Pred( Strings.Count );


if SaveCount > 0 then begin

OpenKey( sPath, TRUE );


for I := 0 to SaveCount do begin
WriteString( Format( 'Line%d', [I] ), Strings[I] );
end;
end;
finally
Free;
end;
end;

procedure TSettings.GetStrings( Name : String; Strings : TStrings; IsGlobal
: Boolean );
var
sPath : String;
KeyNames : TStringList;
I : Integer;
begin
FRegistry := TRegistry.Create;
KeyNames := TStringList.Create;
Strings.Clear;
sPath := GetPath( IsGlobal );
sPath := sPath + '\' + Name;
with FRegistry do try

OpenKey( sPath, FALSE );
GetValueNames( KeyNames );
for I := 0 to Pred( KeyNames.Count ) do begin
Strings.Add(ReadString(KeyNames[I]));


end;
finally
KeyNames.Free;
Free;
end;
end;

procedure TSettings.SaveString( Name, Value : String; IsGlobal : Boolean );


var
sPath : String;
I : Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try

OpenKey( sPath, TRUE );


WriteString( Name, Value );
finally
Free;
end;
end;

function TSettings.GetString( Name : String; IsGlobal : Boolean ) : String;
var
sPath : String;
I : Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try
try

OpenKey( sPath, FALSE );


Result := ReadString( Name );
except
Result := '';
end;
finally
Free;
end;
end;

function TSettings.GetPath( IsGlobal : Boolean ) : String;
begin

if ( FLocalPath = '' ) or IsGlobal then Result := FRegistryPath


else Result := FRegistryPath + '\' + FLocalPath;
end;

procedure TSettings.SetLocalPath(const Value: String);
begin
FLocalPath := Value;
end;

procedure TSettings.SetPath(const Value: String);
begin
FRegistryPath := Value;
end;

function TSettings.GetBinary(Name: String; var Data; Size: Integer;
IsGlobal: Boolean): Boolean;


var
sPath: String;
I: Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try

OpenKey(sPath, FALSE);
Result := ReadBinaryData(Name, Data, Size) = Size;
finally
Free;
end;
end;

procedure TSettings.SaveBinary(Name: String; var Data; Size: Integer;
IsGlobal: Boolean);


var
sPath : String;
I : Integer;
begin
FRegistry := TRegistry.Create;
sPath := GetPath( IsGlobal );
repeat
I := Pos( '\', Name );
if I > 0 then begin
sPath := sPath + '\' + Copy( Name, 1, I - 1 );
Delete( Name, 1, I );
end;
until I = 0;
with FRegistry do try

OpenKey(sPath, TRUE);
WriteBinaryData(Name, Data, Size);
finally
Free;
end;
end;

procedure TSettings.GetParams(Name: String; Params: TStrings);


var
sPath : String;
S: String;
I : Integer;
begin
FRegistry := TRegistry.Create;
Params.Clear;

sPath := GetPath(TRUE) + '\' + Name;
with FRegistry do try
OpenKey(sPath, FALSE);
GetValueNames(Params);
for I := 0 to Pred(Params.Count) do begin
S := Params[I];
Params.Strings[I] := S + '=' + ReadString(S);


end;
finally
Free;
end;
end;

procedure TSettings.SaveParams(Name: String; Params: TStrings;
SkipIf: Char);


var
sPath, S : String;
I: Integer;
SaveCount : Integer;
begin
FRegistry := TRegistry.Create;

sPath := GetPath(TRUE) + '\' + Name;


with FRegistry do
try
DeleteKey( sPath );
SaveCount := 0;

for I := 0 to Pred(Params.Count) do


if Params.Names[I][1] <> SkipIf then
Inc(SaveCount);
if SaveCount > 0 then begin

OpenKey( sPath, TRUE );
for I := 0 to Pred(Params.Count) do begin


S := Params.Names[I];
if S[1] <> SkipIf then

WriteString(S, Params.Values[S]);


end;
end;
finally
Free;
end;
end;

initialization
Settings := TSettings.Create;

finalization
Settings.Free;

end.

=== uRegistry.pas END ===

Dmitriy Goldobin

unread,
Dec 24, 1999, 3:00:00 AM12/24/99
to
Hi!

> На, сравнивай, хотя сравнивать особо нечего, все один в один (на первый
> взгляд). Ты выиграл, однозначно.
>
> Но КАК ????
> (с) Ватсон
>
> Расскажи, как ты то делаешь ?

Полная аналогия с java. Там почему-то никого не удивляют декомпилеры,
хотя отличие только в том, что delphi компилит для процессора x86, а
java для некоего пока несуществующего процессора со своей собственной
системой команд, так называемый pcode. Но от этого суть дела не меняется,
что в java 'push1, push0, call proc, pop2', что в delphi
'push 1, xor eax,eax push eax, call proc, add esp,8'

> И EXE так умеешь ?????

exe не так. Теряются все имена кроме published members. Типы теряются и
восстанавливаются только частично по контексту. Допустим если в переменную
заносятся 0 и 1 то это может быть и Integer и Boolean и Ordinal. Если в
в другом месте к ней что-либо прибавляется, то Boolean отпадает, если еще
в одном месте она умножается - отпадает Ordinal. То есть при активном
использовании переменной ее тип определяется почти однозначно.

> Я всю жизни считал, что это невозможно. Расскажешь ? Или коммерческая
тайна
> ?

Хмм. Декомпилил борландовый dcc32 (вручную на C). Построил таблицы - какие
конструкции языка в какие варианты кода транслируются. Далее дело техники.

Bye.

Tolik Tentser

unread,
Dec 25, 1999, 3:00:00 AM12/25/99
to
Hi, Dmitriy Goldobin!

В чреве акулы, пойманной 24 Dec 1999 22:09:47 +0300,

дети капитана Гранта нашли письмо на тему 'Re: DCU decompiler':

>Полная аналогия с java. Там почему-то никого не удивляют декомпилеры,


>хотя отличие только в том, что delphi компилит для процессора x86, а
>java для некоего пока несуществующего процессора со своей собственной
>системой команд, так называемый pcode. Но от этого суть дела не меняется,
>что в java 'push1, push0, call proc, pop2', что в delphi
>'push 1, xor eax,eax push eax, call proc, add esp,8'

Мдя.
Ну в Java (Foxpro, ets ...) оно понятно - там кодогенераторы очень
простые. Похоже Инпрайзовская реклама насчет крутости ихнего
компилятора несколько преувеличена.

Тогда чего я в этой жизни не понимаю, объясни ? Почему по сих пор
компоненты "в dcu" не "элегантным движением превращаются ...,
превращаются ..." (с). Короче, в элегантные шорты ? Все дружно правят
DCU, вместо того, чтобы просто декомпилировать их. Или это ты один в
мире умеешь ?

>> И EXE так умеешь ?????

>exe не так. Теряются все имена кроме published members.

Ну это само собой. Но код восстанавливается вместе с классами и т.п. ?
Естественно, в предположении, что версия компилятора известна.

>Типы теряются и
>восстанавливаются только частично по контексту. Допустим если в переменную
>заносятся 0 и 1 то это может быть и Integer и Boolean и Ordinal. Если в
>в другом месте к ней что-либо прибавляется, то Boolean отпадает, если еще
>в одном месте она умножается - отпадает Ordinal. То есть при активном
>использовании переменной ее тип определяется почти однозначно.

:-)
Пока программер придерживается хорошего стиля.
Integer(SomeOrdinal) * 2

>Хмм. Декомпилил борландовый dcc32 (вручную на C). Построил таблицы - какие
>конструкции языка в какие варианты кода транслируются. Далее дело техники.

Ну ты крут. Больше и добавить-то нечего. А довести до ума и продавать
не пробовал ? Я-таки придерживаюсь мнения, что покупали бы. Хотя,
теперь - даже и не знаю, что из жизненных аксиом осталось незыблемым.
:-)

Anatoly Podgoretsky

unread,
Dec 25, 1999, 3:00:00 AM12/25/99
to
"Tolik Tentser" <to...@katren.nsk.ru> wrote in message
news:qc096sk3i2ad3n7iv...@4ax.com...
> Hi, Dmitriy Goldobin!

>
> >Полная аналогия с java. Там почему-то никого не удивляют декомпилеры,
> >хотя отличие только в том, что delphi компилит для процессора x86, а
> >java для некоего пока несуществующего процессора со своей собственной
> >системой команд, так называемый pcode. Но от этого суть дела не меняется,
> >что в java 'push1, push0, call proc, pop2', что в delphi
> >'push 1, xor eax,eax push eax, call proc, add esp,8'
>
> Мдя.
> Ну в Java (Foxpro, ets ...) оно понятно - там кодогенераторы очень
> простые. Похоже Инпрайзовская реклама насчет крутости ихнего
> компилятора несколько преувеличена.
>
> Тогда чего я в этой жизни не понимаю, объясни ? Почему по сих пор
> компоненты "в dcu" не "элегантным движением превращаются ...,
> превращаются ..." (с). Короче, в элегантные шорты ? Все дружно правят
> DCU, вместо того, чтобы просто декомпилировать их. Или это ты один в
> мире умеешь ?

Я думаю не один, но Дмитрий давно этим занялся и глубоко вник, выставлял
даже давно Online декомпилятор, но потом ушел в подполье. Другие наверно там
же. :-)

> >> И EXE так умеешь ?????

> >exe не так. Теряются все имена кроме published members.
>
> Ну это само собой. Но код восстанавливается вместе с классами и т.п. ?
> Естественно, в предположении, что версия компилятора известна.

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

> >Типы теряются и
> >восстанавливаются только частично по контексту. Допустим если в
переменную
> >заносятся 0 и 1 то это может быть и Integer и Boolean и Ordinal. Если в
> >в другом месте к ней что-либо прибавляется, то Boolean отпадает, если еще
> >в одном месте она умножается - отпадает Ordinal. То есть при активном
> >использовании переменной ее тип определяется почти однозначно.
>
> :-)
> Пока программер придерживается хорошего стиля.
> Integer(SomeOrdinal) * 2

Ну требуется ручная доводка, лучше интеррактивная.

> >Хмм. Декомпилил борландовый dcc32 (вручную на C). Построил таблицы -
какие
> >конструкции языка в какие варианты кода транслируются. Далее дело
техники.

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

> Ну ты крут. Больше и добавить-то нечего.

Весьма

>А довести до ума и продавать
> не пробовал ? Я-таки придерживаюсь мнения, что покупали бы. Хотя,
> теперь - даже и не знаю, что из жизненных аксиом осталось незыблемым.
> :-)

Думаю с продажей вознукнут серьезные проблемы

--
С уважением
Анатолий Подгорецкий
http://nps.vnet.ee

Andrew Eremin

unread,
Dec 25, 1999, 3:00:00 AM12/25/99
to
Привет Ed!

24 Dec 99 14:03, ed wrote to All:

e> если процессор понимает,
e> то и делфи-источник наваять можно (и это однозначтно!)
e> (просто никакая оффициальная софт-фирма не возмется за это,
e> т.к. это с какой-то стороны противозаконно!)
Хм, сyществyют контоpы занимающиеся восстановлением исходников по
готовомy *.exe стоимость такой 'декомпиляции' обходиться в >$500 за каждyю
линию исходника и все абсолютно законно. Источник: PC World за 1998г.

Best regards
Andrew
Go to http://www.andy.capital.ru/freestuff/

... Людям свойственно думать,а некоторым это даже нравиться.

Alex

unread,
Dec 25, 1999, 3:00:00 AM12/25/99
to
Уж очень зачотелось вот на это ответить :

>Привет Ed!
>
>24 Dec 99 14:03, ed wrote to All:
>
> e> если процессор понимает,
> e> то и делфи-источник наваять можно (и это однозначтно!)
> e> (просто никакая оффициальная софт-фирма не возмется за это,
> e> т.к. это с какой-то стороны противозаконно!)
> Хм, сyществyют контоpы занимающиеся восстановлением исходников по
>готовомy *.exe стоимость такой 'декомпиляции' обходиться в >$500 за каждyю
>линию исходника и все абсолютно законно. Источник: PC World за 1998г.
>

/\ /\ /\ /\ /\ /\ /\ /\
ну что ребята срубим бабки с тех, кто не могёт соурсер юзать?:-)

Dmitry Pestov

unread,
Dec 25, 1999, 3:00:00 AM12/25/99
to
Hello Dmitriy.

24 Dec 99 22:09, Dmitriy Goldobin wrote to All:

DG> Полная аналогия с java. Там почему-то никого не удивляют декомпилеры,
DG> хотя отличие только в том, что delphi компилит для процессора x86, а
DG> java для некоего пока несуществующего процессора со своей собственной
DG> системой команд, так называемый pcode. Hо от этого суть дела не
DG> меняется, что в java 'push1, push0, call proc, pop2', что в
DG> delphi 'push 1, xor eax,eax push eax, call proc, add esp,8'
Выходит, что все заверения на счет высокоэффективного компилятора не очень
соответствуют реальному положению дел? Или может быть сегодня и не имеет
смысла связываться с этим, т.е. я хочу спросить крепко ли будет заметна
разница по быстродействию и объему кода в случае доведения до ума
компиляторя (теоретического, конечно, я не думаю, что что-то изменится
в будущем)? И еще, мне кажется, что декомпилятор дцу имел бы и
коммерческий успех (на западе, естественно).


Dmitry


Vladislav Irdullin

unread,
Dec 25, 1999, 3:00:00 AM12/25/99
to
·--------·==│ │==·--------·
│ Пpивет, Dmitriy !
│ 23 Dec 99 14:46:25 Dmitriy Goldobin -> All :


DG>> 2all & you: это как в анекдоте - тебе 6 полос на тpассе или 8?
DG>> HЕТУ декомпилеpа dcu, и навеpное не бyдет до появления
DG>> искyсственного интеллекта....
DG> Hет абсолютно никаких пpепятствий к написанию полноценного декомпилеpа
DG> DCU и даже EXE.
есть паpа пpепятствий:

1. в EXE - ты не узнаешь имен всех символов (функций, пpоцедуp, пеpеменных)
2. в DCU - ты не узнаешь имен символов, не опpеделенных в секции interface, но
имеющихся в implementation


│ Пока, Dmitriy !
│ Vladislav 333:1/286.111@hacknet
----------· ·-----------


Boris Cybin

unread,
Dec 25, 1999, 3:00:00 AM12/25/99
to

Пpивет to...@katren.nsk.ru!
24 Дек 1999 Пт в 21:08
to...@katren.nsk.ru писал[a|o] к All:

t> Hа, сравнивай, хотя сравнивать особо нечего, все один в один (на
t> первый взгляд). Ты выиграл, однозначно.
Действительно - фантастика.
t> Hо КАК ????
t> (с) Ватсон
Толик, или ты отладочную информацию не отключил, или вы сговорились
пошутить ;)
t> Расскажи, как ты то делаешь ?
t> И EXE так умеешь ?????
Hе, это точно не получится... ;(
t> Я всю жизни считал, что это невозможно. Расскажешь ? Или коммерческая
t> тайна ?

t> === uRegistry.pas BEGIN ===

t> === uRegistry.pas END ===

С уважением, Boris


Dmitriy Goldobin

unread,
Dec 26, 1999, 3:00:00 AM12/26/99
to
Hi!

>Мдя.
>Ну в Java (Foxpro, ets ...) оно понятно - там кодогенераторы очень
>простые. Похоже Инпрайзовская реклама насчет крутости ихнего
>компилятора несколько преувеличена.

Именно. Слегка :)

>Тогда чего я в этой жизни не понимаю, объясни ? Почему по сих пор
>компоненты "в dcu" не "элегантным движением превращаются ...,
>превращаются ..." (с). Короче, в элегантные шорты ? Все дружно правят
>DCU, вместо того, чтобы просто декомпилировать их. Или это ты один в
>мире умеешь ?

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

> А довести до ума и продавать
>не пробовал ? Я-таки придерживаюсь мнения, что покупали бы. Хотя,
>теперь - даже и не знаю, что из жизненных аксиом осталось незыблемым.


1. Кому может понадобиться декомпилер? Людям по определению
нечестным, кому защиту сломать, кому кусок кода или просто идею спереть,
кому просто перекомпилить со своими копирайтами. Такие люди никогда
не купят того, что можно взять на варезных сайтах. А там он появится
очень быстро в силу своей полезности для пиратов. Процент людей кому
декомпилер нужен для дела - потерянные исходники восстановить, исправить
ошибку в древней неподдерживаемой программе - ничтожно мал. Я уже
провел эксперимент с exe2dpr - покупало около 1/10000 из тех кого она
заинтересовала, после покупки пиратами (сломать демку так и не смогли)
продажи сразу же практически прекратились.

2. Возможно кто-либо напишет декомпилер из спортивного интереса. Я
уже как-то вышел из возраста, когда бы я написал декомпилер только
чтобы потешить свое самолюбие. Теперь мне достаточно осознания
того, что я могу написать :)

3. Возможен еще вариант - написать декомпилер, но не продавать, a брать
деньги за разовую декомпиляцию. Hо для этого и не нужно писать полный
декомпилер. Я например и без него справляюсь :-)

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

Bye.

Dmitriy Goldobin

unread,
Dec 26, 1999, 3:00:00 AM12/26/99
to
Hi!

>Выходит, что все заверения на счет высокоэффективного компилятора не очень
>соответствуют реальному положению дел?

Hе соответствуют. Они попытались перенести хорошие для своего времени
принципы кодогенерации из tp на 32-битную платформу.

> Или может быть сегодня и не имеет
>смысла связываться с этим, т.е. я хочу спросить крепко ли будет заметна
>разница по быстродействию и объему кода в случае доведения до ума

>компиляторя (теоретического, конечно, я не думаю, что что-то изменится

Разница была бы раза в полтора по размеру и раза в полтора-два по
скорости. Hо тут надо учесть, что реальная скорость большинства
приложений, которые 90% своей жизни проводят в системных вызовах
практически не изменилась бы. Заметно было бы только на чисто
вычислительных задачах типа паковки, шифрации etc, но кто это делает
на Delphi? То же самое и с размером - если большую часть екзешника
займут данные и ресурсы, то размер тоже практически не изменится.

Bye.

Dmitriy Goldobin

unread,
Dec 26, 1999, 3:00:00 AM12/26/99
to
Hi!

>1. в EXE - ты не узнаешь имен всех символов (функций, пpоцедуp, пеpеменных)

Я уже писал про это. Hо хотя бы имена классов и всех их published
деклараций
узнаю. Кроме того все имена из стандартных дельфевых dcu.

>2. в DCU - ты не узнаешь имен символов, не опpеделенных в секции interface,
но
>имеющихся в implementation

Скажу больше - могу потерять имена приватных полей даже и в interface, но
это
уж как повезет. :-) См пример декомпидяции в письме к Tolik Tentser

Опять аналогия с java. Используется множество антидекомпилерных штучек,
которые корежат все nonpublic имена в классах. Hо как правило это почти не
мешает разобраться с декомпилированным текстом.

Bye.

Tolik Tentser

unread,
Dec 26, 1999, 3:00:00 AM12/26/99
to
Hi, Dmitriy Goldobin!

В чреве акулы, пойманной 26 Dec 1999 00:38:23 +0300,

дети капитана Гранта нашли письмо на тему 'Re: DCU decompiler':

>Скажем так, декомпилить обычно стоит дороже чем купить исходники у


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

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

>1. Кому может понадобиться декомпилер? Людям по определению
>нечестным, кому защиту сломать, кому кусок кода или просто идею спереть,
>кому просто перекомпилить со своими копирайтами. Такие люди никогда
>не купят того, что можно взять на варезных сайтах. А там он появится
>очень быстро в силу своей полезности для пиратов. Процент людей кому
>декомпилер нужен для дела - потерянные исходники восстановить, исправить
>ошибку в древней неподдерживаемой программе - ничтожно мал. Я уже
>провел эксперимент с exe2dpr - покупало около 1/10000 из тех кого она
>заинтересовала, после покупки пиратами (сломать демку так и не смогли)
>продажи сразу же практически прекратились.

:-(

Dmitriy Goldobin

unread,
Dec 26, 1999, 3:00:00 AM12/26/99
to
Hi!

> t> Hо КАК ????
> t> (с) Ватсон
> Толик, или ты отладочную информацию не отключил, или вы сговорились
> пошутить ;)

не отключил. Ho без отладочной информации получилось бы то же самое, только
1. не совпадали бы номера строк с оригиналом.
2. вместо имен локальных переменных в процедурах были бы I,J,K..., остальные
имена были бы те же.

Bye.


Tolik Tentser

unread,
Dec 27, 1999, 3:00:00 AM12/27/99
to
Hi !

> Толик, или ты отладочную информацию не отключил, или вы сговорились
> пошутить ;)

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

А насчет пошутить - я еще долго сидел и думал, кто мог дать Дмитрию текст
модуля. Никто, однако, круг людей имевший к нему доступ сильно невелик. :-)

Alex Gapeeff

unread,
Dec 27, 1999, 3:00:00 AM12/27/99
to
Wanna die with me, Tolik ???

Thursday December 23 1999 16:34, Tolik Tentser annoying All:

TT> =8-()
TT> Что-то я даже дизассемблера ни разу не видел, который бы дал код на
TT> ассемблере, способный скомпилироваться в работоспособную программу.
TT> При размере кода хотя-бы в килобайт - два.
А IDA как же ?


Alex.


Alexey Popov

unread,
Dec 28, 1999, 3:00:00 AM12/28/99
to
Привет, Dmitriy!

Пятница Декабрь 24 1999 22:09, Dmitriy Goldobin написал All:

>> Я всю жизни считал, что это невозможно. Расскажешь ? Или

>> коммерческая тайна ?
DG> Хмм. Декомпилил борландовый dcc32 (вручную на C). Построил таблицы -
DG> какие конструкции языка в какие варианты кода транслируются. Далее
DG> дело техники.

Блин, ну ты монстр!
Я тоже всю жизнь считал, что это невозможно.

_________________________
Alexey Popov (Alex Ghost)
http://aghost.da.ru
mailto:agh...@bigfoot.com


Gene Feudorov

unread,
Dec 29, 1999, 3:00:00 AM12/29/99
to
>> Я всю жизни считал, что это невозможно. Расскажешь ? Или
>> коммерческая тайна ?
DG> Хмм. Декомпилил борландовый dcc32 (вручную на C). Построил таблицы -
DG> какие конструкции языка в какие варианты кода транслируются. Далее
DG> дело техники.

> Блин, ну ты монстр!
> Я тоже всю жизнь считал, что это невозможно.

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

Dmitriy Goldobin

unread,
Dec 29, 1999, 3:00:00 AM12/29/99
to
Hi!

> > Я тоже всю жизнь считал, что это невозможно.
>
> да невозможно, невозможно:)) нас тут побасёнками кормят,
> а мы и уши равесили:) так бы уже биль с борей разорились бы давно:)
> для меня тоже декомпилить не вопрос, я и без таблиц обойдуся.
> у меня чисто просто дело техники:)

Ты сам себе противоречишь. Я доказывал, что декомпиляция возможна,
ты вроде как это подтвердил. Тогда непонятно в чем именно побасенки
заключаются. Если в декомпиляции dcc32, то в чем ты здесь видишь
проблемы? Вот его кусок, похоже на правду?

void Gen_TryStartup( Target *target )
{
int reg, regMask;

if( (reg = Gen_AllocStorageReg( REG_ALL )) != -1 ) {
regMask = storageToMask1[reg];
Gen_CmdRegReg( 0x33, reg ); // xor reg, reg
Gen_Byte( 0x55 ); // push ebp
Gen_Byte( 0x68 ); // push offset
target
Get_OffsetLocal( 0, target );
Gen_ByteByteByte( 0x64, 0xFF, 0x30 + regMask ); // push fs:[reg]
Gen_ByteByteByte( 0x64, 0x89, 0x20 + regMask ); // mov fs:[reg], esp
Gen_FreeStorage( reg );
}
else {
Gen_Byte( 0x55 ); // push ebp
Gen_Byte( 0x68 ); // push offset
target
Gen_OffsetLocal( 0, target );
Gen_Byte( 0x64 ); // push fs:[0]
Gen_ByteByteDWord( 0xFF, 0x35, 0 );
Gen_Byte( 0x64 ); // mov fs:[0], esp
Gen_ByteByteDWord( 0x89, 0x25, 0 );
}
gen_StackBase -= 12;
}

Bye.

0 new messages