如何修补delphi类的私有方法?
我已经阅读了这些问题和答案 但我无法解释如何修补位于另一个单元中的类的私有方法 检查此示例,我想修补如何修补delphi类的私有方法?,delphi,delphi-xe2,Delphi,Delphi Xe2,我已经阅读了这些问题和答案 但我无法解释如何修补位于另一个单元中的类的私有方法 检查此示例,我想修补条过程 Unit ThidParty; Interface Type TFoo =Class private procedure Bar; end; 我认为其中的关键是找到一种获取私有方法地址的方法 那么,如何修补delphi类的私有方法呢?下面列出的解决方案适用于delphi西雅图之前的版本。 您可以使用以下方法来破解该
条
过程
Unit ThidParty;
Interface
Type
TFoo =Class
private
procedure Bar;
end;
我认为其中的关键是找到一种获取私有方法地址的方法
那么,如何修补delphi类的私有方法呢?下面列出的解决方案适用于delphi西雅图之前的版本。 您可以使用以下方法来破解该类: Unit1
type
TTest = class
private
procedure Foo;
end;
Unit2
type
TMyTestHelper = class helper for TTest
function GetFooAddress: Pointer;
end;
function TMyTestHelper.GetFooAddress: Pointer;
var
MethodPtr: procedure of object;
begin
MethodPtr := Self.Foo;
Result := TMethod(MethodPtr).Code;
end;
function FooAddress: Pointer;
begin
Result := TTest(nil).GetFooAddress;//don't need to instantiate an object
end;
将返回值从FooAddress
传递到您的一个修补函数,您就成功了
然而,从Delphi 10.1 Berlin开始,这不再有效!类助手无法再访问严格保护、严格私有或私有成员。这个“特性”实际上是一个编译器错误,Embarcadero现在已经在柏林修复了它。您运气不好。AFAIK这是不可能的,因为私有方法/过程不是VMT的一部分,因此无法通过RTTI等进行访问。可以破解此问题,但这需要您拆解另一个单元,然后执行一些指针算术和一些汇编来达到目的…另请参阅。David提到的类助手。这不是编译器中的一个漏洞吗?如果修好了怎么办?@大卫:不幸的是没有。DCP包含专用符号,但未在BPL中导出。因此编译器很乐意编译它,但在运行时,由于缺少符号,应用程序无法启动。这就是为什么这是编译器中的一个漏洞。@Stefan:我被纠正了。看起来编译器真的导出了BPL中的所有私有方法。这被认为是一个bug,从Delphi 10.1 Berlin来看,不再可能使用类帮助器访问私有成员。好的,仍然有一个可能的解决方案:
TMethod(MethodPtr)。代码:=@TTest.Foo代码>