以下に概説するソリューションは、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 メンバーにアクセスできなくなりました。この「機能」は、実際にはエンバカデロがベルリンで修正したコンパイラのバグでした。あなたは運が悪いです。