Delphi - 在BPL中取消名称修饰

11

在Delphi中,是否有可能取消混淆像这样的名称?如果可能,我该在哪里获取更多信息?

以下是一个错误消息示例,其中无法在dbrtl100.bpl中找到某个条目,我想知道它无法找到哪个具体函数(单元、类、名称、参数等)。

---------------------------
myApp.exe - Entry Point Not Found
---------------------------
The procedure entry point @Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@IDENTIFIEROption could not be located in the dynamic link library dbrtl100.bpl. 
---------------------------
OK   
---------------------------
我知道它是Dbcommon单元中的GetTableNameFromSQLEx方法(我有带有RTL/VCL源代码的Delphi),但有时我会遇到不可用所有代码的应用程序(是的,客户应该始终购买第三方软件的所有源代码,但有时他们不这样做)。
但是假设这是一个我没有代码或者只有接口文件的示例(BDE.INT是否有人知道?) 它有哪些参数(即可能的重载)? 它返回什么类型?
这个名字重整在任何Delphi版本中都是一样的吗?
- jeroen
编辑1: 感谢Rob Kennedy: tdump -e dbrtl100.bpl 就行了。根本不需要 -um:
C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx
File STDIN:
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)

编辑2::

感谢TOndrej发现了这篇德语EDN文章英文Google翻译)。 该文章描述了格式相当准确,应该可以创建一些Delphi代码来解开这个问题。

可惜作者提到的网站(和电子邮件)现在已经不存在了,但知道这些信息还是很有好处的。

--jeroen

4个回答

10

Delphi中没有提供函数来解析函数名的方法,我也不知道有没有任何记录。 Delphi in a Nutshell指出,“tdump”工具有一个-um选项可以解除它发现的符号。我从未尝试过。

tdump -um -e dbrtl100.bpl

如果这个方法行不通,那么你也可以自己解析,看起来并不是非常复杂的方案。显然,名称以“@”开头,后面跟着单元名称和函数名称,用另一个“@”符号分隔。该函数名称后跟“$qqrx”,然后是参数类型。

参数类型使用类型名称的字符计数进行编码,并按照之前的“@”分隔格式进行排列。

“$”标记函数名称的结束和参数类型的开始。剩下的谜团就是“qqrx”部分了。这由文章Tondrej found揭示。 “qqr”表示调用约定,在这种情况下是寄存器,也称为fastcall。 “x”适用于参数,表示它是常量。

返回类型不需要在混淆的函数名称中进行编码,因为重载无论如何都不考虑返回类型。


谢谢 - 这很有帮助。实际上,-um 全然不必要。这个命令就够了:C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx File STDIN: 00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption) - Jeroen Wiert Pluimers
我认为那是最近的改进。我很确定tdump以前没有做过这个。 - Rob Kennedy

8
如果您拥有C++Builder,请查看$(BDS)\source\cpprtl\Source\misc\unmangle.c——它包含TDUMP、调试器和链接器使用的反名机制的源代码。(C++Builder和Delphi使用相同的命名方案。)

1
太棒了!这是什么时候引入的?我似乎只有2009年和2010年的版本:D2009-Enterprise\source\cpprtl\Source\misc\unmangle.c D2010-Enterprise\source\cpprtl\Source\misc\unmangle.c好的阅读材料 :-) - Jeroen Wiert Pluimers
3
我认为这个问题和BCC本身一样古老。然而,在早期版本中,该文件被称为um.c而不是unmangle.c。 - Moritz Beutel

7

此外,也请参阅此文章(德文)。 我猜测混淆可能是向后兼容的,在后续版本的Delphi中引入了新的混淆方案以支持新的语言特性。


谢谢。我会读德语,所以这不是问题。现在我想接受两个答案 :-) - Jeroen Wiert Pluimers
1
链接已失效。请使用此链接查看德语版本:https://dn.embarcadero.com/print/27758 请使用此链接查看英语版本:https://dn-embarcadero-com.translate.goog/print/27758?_x_tr_sl=de&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp - James L.

0

从Delphi 2007源文件:

function GetTableNameFromSQLEx(const SQL: WideString; IdOption: IDENTIFIEROption): WideString;

这似乎是相同的版本,因为我在我的Windows\System32文件夹中也有相同的.BPL。

源代码可以在[Program Files文件夹]\CodeGear\RAD Studio\5.0\source\Win32\db中找到。

Borland/Codegear/Embarcadero已经使用了这种编码方式一段时间了,但从未详细介绍过.BPL格式。我从来没有对它们很感兴趣,因为我不喜欢在我的项目中使用运行时库。我更喜欢将它们编译到我的项目中,尽管这会导致更大的可执行文件。


其实,我知道是哪个:Delphi 2007 update 3,DBCommon。这更多是针对那些没有源代码或需要寻找源代码的BPLs。我重新措辞了我的问题。抱歉给您带来不便 :-) - Jeroen Wiert Pluimers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接