首页 > 其他分享 >窥探 Delphi 的 dcp文件

窥探 Delphi 的 dcp文件

时间:2024-06-12 18:14:28浏览次数:22  
标签:包含 Delphi BPL 窥探 单元 dcp 字符串 DCP

之前我猜测 Delphi里的 dcp类似 java里的 maven 的 pom.xml,经过测试 发现,和猜想的才不多,既包含了pom.xml 的信息,又包含了本bpl的信息;测试如下:


在本文中,我将展示如何从 Delphi 的 DCP 文件中读取一些非常基本的信息。这包括要链接的 BPL 名称、所需的 DCP 和包含的单元。在过去的几周里,我编写了一个 Project-Analyzationtool,它能够完全解开所有单元依赖关系并修复搜索路径。但是,要做到这一点,我也必须与 DCP 合作。一些搜索并没有透露太多(除了和我相同的问题)。我知道从 XE 到 XE8 的情况可能已经发生了变化,但我希望这篇文章仍然有助于让 XE 以外的任何人开始。

因此,让我们开始我们的肮脏工作。为了分析 DCP,我创建了一个名为 TestPackage.bpl 的新包。它只需要 RTL,并且有 2 个空单元:MyUnit 和 Foo.OtherUnit。这应该可以完成实验的工作。拿起你选择的十六进制编辑器并研究它。您将看到如下内容:

image

您会注意到的是,流以 4 个 AnsiChars “PKX0” 开头。所有 DCP 似乎都以它开头,所以我将其声明为我们的 DCP 签名。您可能会在加载文件时验证这一点,以确保您拥有 DCP。在第 3 行,您将看到“TestPackage.bpl”。这是链接器将链接到的 BPL 的名称。在处理具有后缀的 BPL 时,这是必需的。例如,对于 VCL150.bpl,仅存在 VCL.dcp。在这里,您可以找到最终的 BPL 名称。通过比较不同的 DCP,您会注意到 BPL-Name 始终从同一位置(字节 33)开始。因此,我们的前 32 个字节肯定是某种标头。让我们仔细看看:

image

我已经概述了我已经分析过的领域并在这里进行了描述。如前所述,Red-Field 是我们的签名。绿色和蓝色包含数字,这些数字根据包含的单位数量和所需的 DCP 而变化。通过摆弄,您会注意到绿色是所需的 DCP 数量,蓝色是包含的单元数量。等等,我们必须单位,为什么它告诉我有 3 个?很简单,包的 DPK 文件(在本例中为 TestPackage.dpk)也包含在此列表中。橙色框仅包含标头后面的 BPL-Name 的长度(以 Bytes 为单位)(不包括终止的 NULL-Character)。总而言之,我们的标题在 Delphi 中是这样的:

image

但是等等,还有更多!

image

在我们的 BPL 名称之后,我们会注意到“RTL”。这是因为它后面直接跟着一个零终止字符串列表,其中包括所需 DCP 的名称。在我们的例子中,它只是“RTL”。因此,要获取所需 DCP 的列表,只需根据标头中注明的所需 DCP 数量,在零终止字符串之后读取零终止字符串。之后,将出现包含的单元列表,并带有自己的标题。总而言之,此列表的每个元素都包含一个 60 字节的 Blob,我还没有调查过。每个块后面有 2 个以零结尾的字符串。第一个字符串是我们的 Unit-Name,第二个字符串似乎是某种 NameSpace。当单位未带点时,第二个字符串始终为空,仅由 NULL 字符组成。但是,当您的单位像“Foo.OtherUnit”一样点缀时,它将包含“Foo”。这种模式适用于“Foo.Bar.MyUnit”等单位,其中命名空间为“Foo.Bar”。我用绿色/棕色和蓝色/橙色突出显示了这些字段。因此,要在此处获取包含的单元列表,您只需跳过 60 个字节,并根据标头中包含的单元数为每个元素读取 2 个字符串。最后一个元素始终是 Package-DPK 单元。因此,如果你做对了所有事情,你可以得到这样的输出:

image

这里需要注意的是:最后一个条目,即 DPK-Entry,似乎有一个长度为 61 的 Header。我只是在这里循环了 60 字节的模式,这就是为什么我在姓氏前面有一个额外的字符。您可能想跳过那个。

我希望这篇文章能让你开始了解 Delphi 的 DCP-File。

标签:包含,Delphi,BPL,窥探,单元,dcp,字符串,DCP
From: https://www.cnblogs.com/del88/p/18244447

相关文章

  • delphi property中default的含义
    delphiproperty中default的含义首先看个案例TPerson=classpublishedpropertyAge:IntegerreadFAgewriteSetAgedefault20;end;我们创建一个TPerson类给其一个属性,然后使用了default20关键字,按照我们的理解应该是这个age属性的默认值就是20;其实这个d......
  • delphi 实现登陆窗体 与 主窗体的过程,启动窗口
    登录窗体:typeTfrmLogin=class(TForm)btn1:TButton;procedurebtn1Click(Sender:TObject);private{Privatedeclarations}public{Publicdeclarations}end;varfrmLogin:TfrmLogin;implementation{$R*.dfm}procedureTfrm......
  • 发布 CapstoneDelphi 项目(反汇编引擎 SDK)
    lsuper发布的,以下为他的发布内容:最近遇到一个需要反编译PE32/32+的需求,搜了下GH发现全能的Capstone,不过上面Delphi的实现都比较古老(如Capstone4Delphi)且对不同平台支持的不好,遂借五一基于官方稳定版4.0.2手搓了一个,顺带练练手交叉编译等;经过陆续完善,补全官方所有的tes......
  • delphi Image32 之 快速入门
     官方快速入门,加上了一些注解[从WORD粘贴后失去了样式]TImage32类是关键。TImage32 对象包含单个图像,所有图像操作都作用于此对象。usesImg32; //引用单元...img:=TImage32.Create; //创建TImage32对象//执行一些其它操作img.Free; //用完了要释放图像存储......
  • delphi 图形图像处理 Image32
    delpher 越来越少了,但不能掩盖它的优秀,很外前看到了Image32,但发现用它的人很少,这段时间整理了它的资料,重新组合了一个DEMO,也可以说是个小工具,分享出来。----下面的内容不能直接从WORD中复制过来,只能一点点粘贴,Image32 关于Image32说明文档是这样描述的:  用Delphi......
  • Delphi 2010 新增功能之: IOUtils 单元(1): 初识 TDirectory.GetFiles
    用IOUtils单元下的TDirectory.GetFiles获取文件列表太方便了;下面的例子只是TDirectory.GetFiles的典型应用...unitUnit1;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,StdCtrls;type TForm1=......
  • Spring Bean实例化:从源码窥探生命之源
    1.引言在Spring框架中,Bean的生命周期是一个至关重要的概念,它涉及了Bean的创建、初始化、使用以及销毁等多个阶段。其中,Bean的实例化作为生命周期的起点,具有举足轻重的地位。以下将对Spring中Bean的实例化过程进行深度解析,结合源码分析,提供更深入的理解。2.Bean实例化的......
  • GDCPC2024
    按照赛后写的顺序。I\(a_x\gea_y+a_z\)代表有两个必须的条件是\(a_x>a_y\)和\(a_x>a_z\),发现这虽然不是一种偏序,但是它仍然具有传递性,所以建一张DAG后toposort。从最后的点开始依次确定值。时间复杂度\(O(n+m)\)。#include<bits/stdc++.h>#defineintlonglong#def......
  • delphi 三层源码框架
    一,框架简介1,本套源码主要是用来开发企业应用系统如:erp,mes,hrms,进销存等制造业内部应用系统;跟网上常见的delphi中间件相比,功能更丰富,开发便捷。若用来开发一些几千上万的高并发,垮平台,实时高效的系统,可能需要自己优化下代码。(交流微信173713873)2,此框架服务端没有使用任何第三......
  • [SDCPC2023] Colorful Segments 线段树转移DP
    Codeforces链接​  洛谷题目链接#[SDCPC2023]ColorfulSegments##题面翻译**【题目描述】**考虑数轴上的$n$条线段,其中第$i$条线段的左端点为$l_i$,右端点为$r_i$。每一条线段都被涂上了颜色,其中第$i$条线段的颜色为$c_i$($0\lec_i\le1$)。颜色共有两种,$c_i......