【问题标题】:How I can patch a private method of a delphi class?如何修补 delphi 类的私有方法?
【发布时间】:2012-04-26 17:43:21
【问题描述】:

我已阅读这些问题和答案

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 类的私有方法?

【问题讨论】:

  • AFAIK 这是不可能的,因为私有方法/程序不是 VMT 的一部分,因此不能通过 RTTI 等使用。可能可以破解它,但这需要你拆卸另一个单元然后做一些指针算术加上一些汇编来到达那里......
  • 另见Access a strict protected property of a Delphi class?。 David 提到的类助手。

标签: delphi delphi-xe2


【解决方案1】:

下面概述的解决方案适用于 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 Berlin 开始,这不再有效!类助手不能再访问严格保护、严格私有或私有成员。这个“功能”实际上是 Embarcadero 现在在柏林修复的编译器错误。你运气不好。

【讨论】:

  • 这不是编译器的漏洞吗?万一修好了呢?
  • @David:不幸的是没有。 DCP 包含私有符号,但未在 BPL 中导出。因此编译器会很乐意编译它,但在运行时,由于缺少符号,您的应用程序将无法启动。这就是为什么这是编译器中的一个漏洞。
  • @Stefan:我的立场是正确的。看起来编译器确实在 BPL 中导出了所有私有方法。
  • 它被认为是一个错误,并且从 Delphi 10.1 Berlin 开始,不再可能使用类助手访问私有成员。
  • 好的,还有一个可能的解决方案:TMethod(MethodPtr).Code := @TTest.Foo;
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多