我如何修补delphi类的私有方法?

我已经阅读了这些问题和答案

How to change the implementation (detour) of an externally declared function

Patch routine call in delphi

但我不能想像如何修补一个类的私人方法,位于不安的单位.

检查这个样本我想修补Bar程序.

Unit ThidParty;
Interface
   Type
      TFoo =Class
        private
           procedure Bar;
       end;

我认为哪个关键是找到一种方式来获取私有方法的地址.

那么,我如何修补delphi类的私有方法

解决方法

下面列出的解决方案适用于Delphi Seattle的版本.
您可以使用 class helper来破解课程:

单元1

type
  TTest = class
  private
    procedure Foo;
  end;

单元2

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柏林开始,这不再奏效了!班级助理员不能再访问严格的受保护,严格的私人或私人会员.这个“功能”实际上是Embarcadero现在在柏林修复的编译器错误.你没有运气.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...