10

いくつかのコードで放棄されたソフトウェアにパッチを適用しようとしています。

ソフトウェアはカーボン ベースなので、InputManager は使用できません (少なくとも、使用できるとは思いません)。私のアイデアは、マッチョ ヘッダーに dylib 参照を追加し、初期化ルーチンが呼び出されたときに新しいスレッドを起動することでした。

適切なロード コマンド (LC_LOAD_DYLIB) を追加するために、hexeditor を使用して mach-o ヘッダーをいじりました。

otool は私が期待するものを報告するので、ファイルが正しくフォーマットされていることはかなり確信しています。

ロードコマンド 63
          cmd LC_LOAD_DYLIB
      cmdsize 60
         name @executable_path/libAltInput.dylib (オフセット 24)
   タイムスタンプ 1183743291 2007 年 7 月 6 日金曜日 19:34:51
      現在のバージョン 0.0.0
互換バージョン 0.0.0

ただし、バイナリを起動すると、次のエラーが表示されます

dyld: 外部再配置の長さが正しくありません

これは、LC_SYMTAB または LC_DYNSYMTAB セクションを変更する必要があることを意味していると推測できます...

誰にもアイデアはありますか?

4

2 に答える 2

5

何を達成しようとしているのか完全にはわかりませんが、これを行う最も簡単な方法は、おそらく、開始後にマッハタスクにスレッドを挿入することです。これを実行すること(およびそれを実行するためのコードを実行すること)に関する優れた情報源は、http://rentzsch.com/mach_inject/にあります。

注意すべきいくつかの注意事項:

  1. タスクへのマッハポートを取得するために必要なマッハtask_for_pid()呼び出しが特権化され、呼び出すための承認が必要になります。この理由はかなり自明ですが、コードが挿入されたものをリリースすることを計画している場合は、これに注意する必要があります。
  2. コードは、元のアプリケーションと同じプロセススペースで実行されますが、別のスレッドで実行されます。したがって、アプリケーションに完全にアクセスできますが、スレッドに対応していない場合は、挿入されたコードの外部からのデータの使用と操作に十分注意してください。元のコードが追加内容を認識していなかったため、明らかにすべてのマルチスレッドの問題がここで増幅されます。
于 2008-11-07T19:03:38.497 に答える
3

バイナリにパッチを適用しない最も簡単な解決策は、DYLD_INSERT_LIBRARIES環境変数を使用してから、アプリケーションを実行することです。

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

ダイナミックリンカがエラーを報告した理由は、Mach-Oファイル形式の多くのフィールドにファイルの先頭からのオフセットとして指定されたアドレスが含まれているため、別のロードコマンドを追加するとすべてのアドレスが無効になるためだと思います。たとえば、 Mac OS XABIMach-Oファイル形式リファレンスsymoffのおよびstroffエントリを参照してください。

于 2010-01-02T07:04:58.920 に答える