AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi XE's DCP format: Auslesen einiger Basisinformationen
Tutorial durchsuchen
Ansicht
Themen-Optionen

Delphi XE's DCP format: Auslesen einiger Basisinformationen

Ein Tutorial von Memnarch · begonnen am 6. Mai 2015 · letzter Beitrag vom 20. Sep 2022
Antwort Antwort
Benutzerbild von Memnarch
Memnarch
Registriert seit: 24. Sep 2010
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
 
hathor
 
#2
  Alt 6. Mai 2015, 12:26
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

Geändert von hathor ( 6. Mai 2015 um 22:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#3
  Alt 6. Mai 2015, 13:22
Das ist aber komischer Delphi Source Code.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

 
Delphi 7 Enterprise
 
#4
  Alt 6. Mai 2015, 13:24
Das ist doch FlexT
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch
 
#5
  Alt 6. Mai 2015, 13:40
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.

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

Ein DCP-File beginnt mit MagicBytes.
Find dass die Bezeichnung "Signatur" in meinem Blogpost auch recht passend ist.
  Mit Zitat antworten Zitat
hathor
 
#6
  Alt 6. Mai 2015, 22:08
Das ist aber komischer Delphi Source Code.
Natürlich ist das kein Pascal, sieht aber besser aus!
Miniaturansicht angehängter Grafiken
www.delphipraxis.net_2015-05-06_23-06-20.jpg   code_www.delphipraxis.net_2015-05-06_23-04-59.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#7
  Alt 20. Sep 2022, 22:19
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)

Geändert von himitsu (21. Sep 2022 um 18:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 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