はじめてのSIMBLプラグインを書こうと思ったけど、Dockの気持ちがわからなくて退散
Snow Leopard でも SIMBL が動くというので、かねてより書きたかったプラグインを作ろうと思って見ていた。
やりたいことは、マウスが画面の端に来たときに Dock が一々現れてきてウザイので、「一番端でクリックしたとき」または「ドラッグしながら一番端に動いたとき」のみ Dock を出現させること。
(ちなみに僕は Objective-C は構文ぐらいしか知りません)
SIMBL の公式はここらへん。
調べてみると、どうやら SIMBL プラグインを書くにあたっては、宿主のアプリのバイナリを覗いてフックしたいクラスを調べ、IMP、フォワーディング、ポージングなどという手法を使ってメソッドを乗っ取るのが基本らしい。
- 【コラム】ダイナミックObjective-C (41) インプットマネージャから侵入 | エンタープライズ | マイコミジャーナル
- 【コラム】ダイナミックObjective-C (42) SIMBLでハックを管理 | エンタープライズ | マイコミジャーナル
- 【コラム】ダイナミックObjective-C (43) AspectCocoa (1) - Objective-CとCocoaによるアスペクト指向 | エンタープライズ | マイコミジャーナル
- 【コラム】ダイナミックObjective-C (44) AspectCocoa (2) - IMPによるアスペクト指向の実現 | エンタープライズ | マイコミジャーナル
- 【コラム】ダイナミックObjective-C (45) AspectCocoa (3) - フォワーディングとポージングの利用 | エンタープライズ | マイコミジャーナル
- 【コラム】ダイナミックObjective-C (46) AspectCocoa (4) - AspectCocoaの実例 | エンタープライズ | マイコミジャーナル
- 【コラム】ダイナミックObjective-C (47) AspectCocoa (5) - インプットマネージャとの連携 | エンタープライズ | マイコミジャーナル
- 【コラム】ダイナミックObjective-C (12) ポージングで乗っ取り | エンタープライズ | マイコミジャーナル
で、肝心のバイナリを調べるのに使うのが class-dump というコマンドラインプログラムらしい。
- 【コラム】ダイナミックObjective-C (1) CocoaとObjective-Cと動的なオブジェクト指向 - Cocoaハックの第1歩 | エンタープライズ | マイコミジャーナル
- class-dump - Release Notes
- class-dump-x: class-dump for ObjectiveC 2.0 ABI
今回僕がフックしたいアプリは Dock.app なので、とりあえず class-dump で見てみることにした。
% class-dump /System/Library/CoreServices/Dock.app/Contents/MacOS/Dock /* * Generated by class-dump 3.3 (64 bit). * * class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2009 by Steve Nygard. */ #pragma mark - /* * File: /System/Library/CoreServices/Dock.app/Contents/MacOS/Dock * Arch: Intel x86-64 (x86_64) * * Objective-C Garbage Collection: Unsupported * This file has protected segments that can't be decrypted: * Load command 1, segment encryption: Protected Segment Type 2 (10.6) */
あれ? これはもしかして、お手上げ状態? MacPorts 版の class-dump 3.2 を使うと大量にエラーが出るし、class-dump-x だと
2009-09-09 00:31:48.912 class-dump-x[3591:903] We don't support 64-bit Mach-O files.
とか言われる。
何か良い手はないんだろうか。
ここらへんのソースコードも参考にさせてもらっている。