15

これらの質問と回答を読みました

外部宣言関数の実装変更(迂回)方法

Delphi でのパッチ ルーチン呼び出し

しかし、別のユニットにあるクラスのプライベート メソッドにパッチを適用する方法がわかりません。

Bar手順にパッチを適用したいこのサンプルを確認してください。

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

プライベートメソッドのアドレスを取得する方法を見つけるキーはどれだと思います。

では、デルファイ クラスのプライベート メソッドにパッチを適用するにはどうすればよいでしょうか。

4

1 に答える 1

23

以下に概説するソリューションは、Delphi Seattle までのバージョンで機能します。クラス ヘルパーを使用して、クラスをクラックできます。

ユニット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パッチ関数の 1 つに渡せば、成功です。

ただし、Delphi 10.1 Berlin 以降では、これは機能しなくなりました。クラス ヘルパーは、strict protected、strict private、または private メンバーにアクセスできなくなりました。この「機能」は、実際にはエンバカデロがベルリンで修正したコンパイラのバグでした。あなたは運が悪いです。

于 2012-04-14T19:31:33.003 に答える