4

ライブラリでメソッド フック/迂回を使用しています。

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で動作するソリューションを誰かが教えてくれます.

4

1 に答える 1

10

WriteProcessMemory/ReadProcessMemory に最も直接的に相当するのは、Mach 呼び出し vm_write/vm_read です。HPROCESS の代わりに Mach タスク (task_for_pid で取得できます) が必要です。もちろん、小さな違いがたくさんあります。

Apple はこれらの関数のマンページを親切にも削除し、Xcode docset のいずれにも文書化していないため、少し古くなっている非 Apple Mach/MK/Gnu-Mach 文書、ヘッダー ファイルを処理する必要があります。コメント (かなり良い)、および/またはhttp://www.uninformed.org/?v=4&a=3http://www.phrack.org/issues.html?issue=66&idなどのサードパーティの記事=16 (おそらく URL から、ターゲット ユーザーが誰であるかを推測できます)。しかし、それはかなり簡単です。「メモリ チート ツール」を Windows から Mac に移植すると、低レベルのものを実装するよりも GUI を書き直すのに多くの時間を費やすことになります。

しかし、これはメソッドフックを行う最善の方法ではないかもしれません。特に ObjC メソッドをフックしている場合は、C API の場合も同様です。やりたいことを詳しく説明してください。より良い代替案を提供できます。

于 2012-06-01T19:13:48.860 に答える