Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi XE's DCP format: Auslesen einiger Basisinformationen (https://www.delphipraxis.net/184987-delphi-xes-dcp-format-auslesen-einiger-basisinformationen.html)

Memnarch 6. Mai 2015 08:36

Delphi XE's DCP format: Auslesen einiger Basisinformationen
 
Hi,
Da ich kürzlich für ein internes Projekt ein bisschen in die DCPs von Delphi XE gucken musste(und ich die Frage schon Öfter bei Google, ohne Antwort, gefunden habe), wollte ich mal meine Erkenntnisse mit euch teilen. Bisher war es mir möglich folgendes auszulesen:

TargetBPL mit der gelinkt wird(für Name.dcp heißt die BPL mitunter z.B. Name150.bpl)
RequiredDCPs
Contained units

Link zu meinem Blog-Artikel:
http://memnarch.bplaced.net/blog/?p=110

Ich scheine auch schon rauszuhaben, wie ich an die aufgelisteten Exports komme, das ist hier aber noch nicht enthalten.

MFG
Memnarch

hathor 6. Mai 2015 12:26

AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
 
Wozu brauchst Du Kenntnisse über DCP-Files?

Vielleicht kannst Du mit folgenden Zeilen was anfangen...
Ein DCP-File beginnt mit MagicBytes.

Delphi-Quellcode:
Delphi Compilied Package (vv. 2.0-8.0,2005-2010,XE1-XE7), Kylix (vv. 1.0-3.0)(DCP.rfh):
Class: Executable and Object, Status: Guess Work, Last change: 09.02.2015 12:54:12

data
  0x0000 array[4]of Char Magic

%$IF (Magic='PKG4');
//Delphi3.0 package
const
  Ver=4;
descr ('Borland Delphi 3.0 package file.')
%$ELSIF (Magic='PKG5');
//Delphi5.0 package
const
  Ver=5;
descr ('Borland Delphi 5.0 package file.')
%$ELSIF (Magic='PKG6');
//Delphi6.0 package?
const
  Ver=6;
descr ('Borland Delphi 6.0 package file?')
%$ELSIF (Magic='PKG7');
//Delphi6.0 7.0 package
const
  Ver=7;
descr ('Borland Delphi 6.0 or 7.0 package file.')
%$ELSIF (Magic='PKG9');
//Delphi 2005 package
const
  Ver=9;
descr ('Borland Delphi 2005 package file.')
%$ELSIF (Magic='PKX0');
//Delphi 2006 MSIL and later versions package
const
  Ver=10;
descr ('Borland Delphi 2006 MSIL package file.')
%$ELSE
assert 0; //fail
%$END

%$IF not defined MSIL;
const
  MSIL=0;
%$END


descr (NL,
  'Info Src: Partially reconstructed by me (Alexei Hmelnov (mailto:alex@monster.icc.ru)).',NL)

type

PUnitData ^TUnitData near=ulong
TUnitData struc
  ulong Magic
  ulong FileSize
  raw[] at &@.Magic; Data
ends:[@:Size=@.FileSize]

TUnitInfo(NXX) struc
  PUnitData pData
  ulong F
  ulong FT
  ulong bplCode//bplOfs0
 %$IF Ver>4; //Not checked for D4
  ulong bplBSS //bplOfs1
 %$END
  ulong bplData
 %$IF (Ver>=9)or MSIL;
  ulong X
 %$END
  array[@:NXX] of ulong XX
  PChar Name
 %$IF Ver>=9;
  PChar Name1
 %$END
ends:autoname=('unit_',@.Name);

TUnitTbl(Cnt,NXX) array[@:Cnt]of TUnitInfo(@:NXX)
PUnitTbl(Cnt,NXX) ^TUnitTbl(@:Cnt,@:NXX) near=ulong

type
TDCPHdr(NXX) struc
 %$IF MSIL;
  ulong X0
 %$END
  long nRequires
  long nContains
  ulong SzContains
  PUnitTbl(@.nContains,@:NXX) pContains
  ulong Flags
 %$IF Ver>5; //Not checked for D6
  ulong Sz2
  ulong szBplName
 %$IF MSIL;
  ulong X1
  ulong X2
 %$END
 // array[@.szBplName+1]of Char,<0; BplName
  PChar BplName
 %$IF MSIL;
  PChar BplVer
 %$END
 %$ELSE
  PChar BplName
  word X
  byte Y
 %$END
  array[@.nRequires] of PChar Requires
ends

%$IF (Ver>=10);
 //They forgot to change the DCP signature when the format was changed in Delphi XE,
 //so we have to detect the size by other means
 %$IF MSIL;
 const
   NXX=6;
 %$ELSIF DataAt(4,TDCPHdr(5)).pContains^:Size=DataAt(4,TDCPHdr(5)).SzContains;
 const
   NXX=5;
 %$ELSE
 const
   NXX=8;
 %$END
%$ELSE
const
  NXX=0;
%$END

data

0x0004 TDCPHdr(NXX) Hdr

Stevie 6. Mai 2015 13:22

AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
 
Das ist aber komischer Delphi Source Code. :stupid:

Union 6. Mai 2015 13:24

AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
 
Das ist doch FlexT

Memnarch 6. Mai 2015 13:40

AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
 
Zitat:

Zitat von hathor (Beitrag 1300426)
Wozu brauchst Du Kenntnisse über DCP-Files?

Proketabhängigkeitsanalyse mit berücksichtigung von gelinkten Packages. Hab hier jetzt ein IDE-Plugin welches in unserer Firmenumgebung dabei hilft, Suchpfade zu korrigieren bzw fehlende einzufügen. Etwas aufwändiger als es klingt.

Zitat:

Zitat von hathor (Beitrag 1300426)
Vielleicht kannst Du mit folgenden Zeilen was anfangen...

Da ich die Struktur jetzt kenne, grob ja, jeder andere wohl eher weniger wenn es um das Strukturverständnis geht

Zitat:

Zitat von hathor (Beitrag 1300426)
Ein DCP-File beginnt mit MagicBytes.

Find dass die Bezeichnung "Signatur" in meinem Blogpost auch recht passend ist.

hathor 6. Mai 2015 22:08

AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Stevie (Beitrag 1300436)
Das ist aber komischer Delphi Source Code. :stupid:

Natürlich ist das kein Pascal, sieht aber besser aus!

himitsu 20. Sep 2022 22:19

AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
 
Bei den Russen findest du noch eine etwas brutalere Version von dem FlexT-Zeugs
http://hmelnov.icc.ru/geos/scripts/W...howR?DCU32.RFI

Ansonsten gibt es ein älteres Projektchen aus DCU32INT, was wohl aus diesem RFI generiert wurde (einige ältere und andere Dinge ala Kylix weggelassen)
https://github.com/rfrezino/DCU32INT...r/DCP.pas#L126

bzw.
https://www.delphipraxis.net/48587-dcp-format.html


Das Auslesen von Required und Contains ist schon recht einfach. (die Definition des FileHeaders und des Records für die Contains findest du hier in der kurzen RFI aus der #2)
Die zusätzlichen Unit-Infos sind perverser, aber die brauchtest du ja nicht. (deren Definition in der großen FlexT)

Bei mir hab ich nun auch das Kylix rausgeworfen und hab mir die Infos der FlexT zusammengefasst.
(eine Definition der Records mit allen Versionen und nicht je Version nebeneinander und Sonderfälle von Uraltversionen auch weg)



Achtung:
beim Lesen mit dem "aktuellen" Format folgen die Contains direkt auf den Requires und die Uses direkt nach den Contains,
aber falls sich das Format mal ändert (neue Werte angehängt)
solltest du besser die Adressen auslesen.
* Contains-Start und -Länge steht im FileHeader (TDCPHdr.pContains)
* und die jeweiligen UnitDefinitionen sind in den Contains-Items verlinkt (TUnitInfo.pData)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz