ライブラリでメソッド フック/迂回を使用しています。
WriteProcessMemory/ReadProcessMemory は Windows API 関数であるため、OS X でのメソッド フック/迂回の解決策は何でしょうか?
編集:
わかりました、ここにもう少し情報を入れて、なぜその質問をしているのかを明確にしましょう。
私のDSharpライブラリの今後の機能には、次のコードがあります。
procedure FreeInstance(Self: TObject);
begin
...
Self.CleanupInstance;
FreeMem(Pointer(Self));
end;
var
FreeInstanceBackup: TXRedirCode;
initialization
...
HookCode(@TObject.FreeInstance, @FreeInstance, FreeInstanceBackup);
finalization
UnhookCode(@TObject.FreeInstance, FreeInstanceBackup);
...
end.
実際には、TObject.FreeInstance メソッドにフックして、すべてのオブジェクトの破棄について通知を受ける必要があります (そうです、誰かがそれをオーバーライドすることを決定し、継承されたものを呼び出さない場合、呼び出されない可能性があります)。
WriteProcessMemory を使用する別のユニットは ReturnTypePatch.pas です。これはQC #98687を修正します。これは、私のようなモッキング ライブラリや Vincent Parrett の Delphi Mocks に必要です (彼は基本的に、私たちがその問題に気付く前にユーザーからその問題を報告していました)。
WriteProcessMemory のさらに別の用途は、DSharp の AOP 部分です。ここでは、基本的にクラスの VMT を、RTTI の TVirtualMethodInterceptor クラスから作成されたプロキシ クラス VMT に置き換えます。TVirtualMethodInterceptor を使用すると、既存のオブジェクトのみをプロキシ化できます。私の実装では、クラス全体に対してこれを行います (つまり、継承されている場合でも、既存および将来のすべてのオブジェクト)。
いずれの場合も、メモリは保護されているため、Move を使用して書き込むことはできません (WriteProcessMemory を CopyMemory の呼び出しで置き換えると、AV が取得されます)。
これらの関数で私が何をしているのかについての十分な情報であることを願っています.OS Xで動作するソリューションを誰かが教えてくれます.