LC_LOAD_DYLIBコマンドをMach-Oバイナリに挿入する方法(OSX)
質問
私はいくつかのコードで放棄ウェアにパッチを当てたいと考えています。
ソフトウェアはカーボンベースであるため、InputManagerを使用できません(少なくとも、使用できるとは思わない)。私のアイデアは、dylib参照をmach-oヘッダーに追加し、初期化ルーチンが呼び出されたときに新しいスレッドを起動することでした。
16進エディタを使用して適切なロードコマンド(LC_ LOAD_DYLIB)を追加して、mach-oヘッダーをいじりました。
otoolは、私が期待するものを報告するので、ファイルが正しくフォーマットされていると確信しています。
Load command 63 cmd LC_LOAD_DYLIB cmdsize 60 name @executable_path/libAltInput.dylib (offset 24) time stamp 1183743291 Fri Jul 6 19:34:51 2007 current version 0.0.0 compatibility version 0.0.0
ただし、バイナリを起動すると次のエラーが表示されます
dyld: bad external relocation length
これが意味することは、LC_ SYMTABまたはLC_ DYNSYMTABセクションを変更する必要があるということだけです...
アイデアはありますか?
解決
あなたが何を達成しようとしているのか完全にはわかりませんが、これを行う最も簡単な方法は、スレッドの開始後にマッハタスクにスレッドを挿入することです。これを行うための優れた情報源(およびそれを行うためのコードの実行)は、ここで見つけることができます: http:// rentzsch .com / mach_inject / 。
注意すべきいくつかの注意事項:
- タスクへのmachポートを取得するために必要なmach task_for_pid()呼び出しは特権が付与されており、呼び出すための承認が必要です。この理由はかなり自明ですが、注入されたコードで何かをリリースすることを計画している場合は、これに注意する必要があります。
- コードは、元のアプリケーションと同じプロセス空間で実行されますが、別のスレッドで実行されます。したがって、アプリケーションに完全にアクセスできますが、スレッドに対応していない場合は、挿入されたコードの外部からのデータの使用と操作に十分注意してください。元のコードが追加を認識していなかったため、明らかにすべてのマルチスレッドの問題がここで増幅されます。
他のヒント
バイナリへのパッチ適用を伴わない最も簡単な解決策は、単にDYLD_INSERT_LIBRARIES環境変数を使用してからアプリケーションを実行することです。
set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib
ダイナミックリンカーがエラーを報告した理由は、Mach-Oファイル形式の多くのフィールドにファイルの先頭からのオフセットとして指定されたアドレスが含まれているため、別のロードコマンドを追加するとすべてのアドレスが無効になるためだと考えています。たとえば、 stroff
エントリを参照してください。 MachORuntime / Reference / reference.html#// apple_ref / c / tag / symtab_command "rel =" nofollow noreferrer "> Mac OS X ABI Mach-Oファイル形式リファレンス。