iPod touch (1G)にAndroidを入れてみた


iPod touch/iPhone向けAndroidである、iDroidを入れてみました。
iPhone 2G/3Gのように、もうすぐCydiaからBootlaceを入れるだけで簡単インストールできるようになるのかもしれないけど、それを待たずに手動で。

環境

  • MacBookPro / MacOS X 10.6.5 (+ DeveloperTools)
  • iPod touch 1G (OS 3.1.3)
    • redsn0wで3.1.2のFWを読み込ませてJailBreak済み, OpenSSHインストール済み

iDroidのイメージを配置

http://www.idroidproject.org/wiki/Releases/
からiPod touch 1G用のイメージ( http://idroid.nickpack.com/iDroid/official/iDroid-Project/IPT1G/iDroid-1.0.3-MoJo-IPT1G.tar.gz )を落とす。

中にあるinroadおよびfirmwareを/private/var/にscpで放り込む。

% cd iDroid-1.0.3-MoJo-IPT1G
% scp -r idroid firmware root@192.168.0.7:/private/var/

INSTALLファイルのExtraction of firmwareセクションに従って、タッチスクリーンのファームウェアを配置する。

CydiaでBootlaceを入れてあれば、IDroid→(i)ボタン→Extract Multitouch Firmwareを実行すると、zephyr2.bin が/private/var/firmware 内に抽出されるので簡単。

ついでに/private/var/sdcard というディレクトリを切って、その中にmp3ファイル等を入れておけば、iDroidからSDカードとして閲覧できるらしい。野良アプリもここにapkを置いて入れることになる。

openiBootのインストールの準備

まず、Mac OS Xに必要なライブラリ(libusb、readline)をそろえる。

続きを読む

Logicool MX5500に付属のBluetoothドングルをLinuxで使う

Logicool MX5500等、Logicoolの一部のワイヤレスキーボードやワイヤレスマウスのレシーバー(USBドングル)は、USB Bluetoothアダプタとして使用することができるようになっています。

このUSBドングルはちょっと特殊で、単純にPCに接続しただけだとHIDモードとなり、あたかもUSBに直接キーボードとマウスを接続したように見せかける仕組みになっています。(設定を簡単にする意図? あと、こうしないとPCのBIOS画面等で操作できないというものあるでしょう。)

Windowsでは、付属のソフトウェア(Bluetooth接続アシスタント)でその他の機器をBluetoothで接続できるモード(HCIモード)に切り替えることができ、この設定をして初めて一般的なBluetoothアダプタとして機能するようになります。


Linux(具体的には Fedora 12)でも、単純に接続しただけだとHIDモードとなるため、Bluetoothアダプタとしては使用できませんでした。せっかくなので、これをHCIモードに切り替えるための方法を調べたので、メモしておきます。

続きを読む

1linerでstraceやltrace

だいぶ前に書いた、引数に指定したC言語のコードを実行するスクリプト、ce。

何となく作ってみた。Cでワンライナー(1liner)っぽいものが書けます。

これを拡張して、ltraceやstraceが簡単に実行できるようにしてみました。

Binary Hacksのお伴にいかがでしょう。


コードは CodeRepos に置いてあります。→ http://coderepos.org/share/browser/lang/shellscript/misc/ce

使い方

ceコマンド自体の使い方は、上記の記事か、ce -h でヘルプを参照してください。


今回の拡張で、-L オプションを付けると、与えたコードを即 ltrace できるように。

 % ce -L -m 'exit(1)' 2>&1 | tail -2
exit(1 <unfinished ...>
+++ exited (status 1) +++

と、exit(1)すると(glibcの)exitを呼んでいて、戻ってこないことが分かる。まあ当然ですね。


今度は -S オプションを付けて strace してみると、

 % ce -S -m 'exit(1)' 2>&1 | tail -1
 exit_group(1)                     = ?

というわけで、glibcのexitは名前そのままにexitシステムコールを呼ぶのではなく、exit_groupシステムコールを呼ぶのだということが分かります。*1
(なおexit_groupは同じプロセスのスレッドも終了させるシステムコール。)

他にも、ライブラリではsigaction()なのにsigactionシステムコールではなくrt_sigactionシステムコールを呼んだりとか、必ずしも名前通りのシステムコールを呼んでいないのが調べられたりします。

*1:ちなみにexit(2)のMANPAGEにも、ちゃんとそう書いてあります。

VMWare FusionでFedora 11のsudoが遅い

VMWare Fusion上でFedora 11をインストールしてみたところ、sudoコマンドが異様に遅い。


tcpdumpしてみたところ、自ホスト名をDNSルックアップに行ってしまい、そのままタイムアウト待ちになるのが原因の模様。


/etc/hosts に

127.0.0.1 localhost.localdomain localhost 自ホスト名 自ホスト名.localdomain

と自ホスト名を書き加えておいたところ、DNSを見に行くことは無くなり、sudoも高速になりました。

MacBook Pro + Fedora 11で無線LANを使うには

MacBook Pro (15"、Penryn搭載の2008年2月モデル) に Fedora 11をBoot Campでインストールしたときの備忘録。

ndiswrapper (WindowsNICドライバのインターフェースをLinux上に実装したもの)を使って、Windows用のドライバで無線LAN(Broadcom 4328を搭載)を使えるようにするための手順です。

0. lspci で無線LANのモデルを確認

私の環境では

# lspci | grep Network
0b:00.0 Network controller: Broadcom Corporation BCM4328 802.11a/b/g/n (rev 05)

と表示されました。

1. まずはrpmfusionのレポジトリを使えるようにする。

http://rpmfusion.org/Configuration にあるリンクからFedora 11用のfreeレポジトリとnon freeレポジトリをそれぞれクリックしてPackage Installで開けばOK。

2. ndiswrapperをインストー
# yum install ndiswrapper

で、rpmfusionから入れられるはずです。ついでに xorg-x11-drv-nvidia も入れておいた。

3. 付属CD-ROMからWindows XP用のドライバをコピー

MacBook Proに付属のOSインストールディスクからBroadcomXPInstaller.exe をコピー。

# mkdir bcm43xx
# cd bcm43xx
# unrar x ../BroadcomXPInstaller.exe

で展開しておきます。

4. ndiswrapperに登録
# ndiswrapper -i bcmwl5.inf
5. 標準ドライバがロードされないようにする

Fedoraだと標準で入っているb43やssbというドライバがロードされてしまう(が動作しない)ため、これらを取り外します。

# rmmod ssb
# rmmod b43

ついでに自動ロードされないように /etc/modprobe.d/blacklist に以下の行を追加しておきます。

# wireless LAN
blacklist b43
blacklist ssb
6. ロードしてみる
# ndiswrapper -m

で、/etc/modprobe.d/ndiswrapper に alias wlan0 ndiswrapper という行が追加されるはず。この状態で

# modprobe wlan0

とすれば、ndiswrapperがロードされ、ifconfig に wlan0 というインターフェースが現れます。

あとはNetworkManagerで無線LANのAPや認証の設定をすれば接続できるはずです。

Linuxのロゴが変わるらしい!?

Linuxのロゴといえば、Tuxというペンギンが有名で、カーネルソースの中にも入っていたのですが、最近こっそり変更されていたようです。

LWNの記事: http://lwn.net/Articles/323966/

git上でRusty Russelがロゴを差し替えたのを、Linusがマージしています。

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=8032b526d1a3bd91ad633dd3a3b5fdbc47ad54f1

Documentation/logo.gif 	[deleted file] 	← Tux は消され、
Documentation/logo.svg 	[new file ...]  ← Tuz が入った。
Documentation/logo.txt 		        ← Logoについての注釈の変更
drivers/video/logo/logo_linux_clut224.ppm ←起動時のロゴ変更
drivers/video/logo/logo_linux_vga16.ppm   ←同上


Tuzというのは、オーストラリアのLinuxカンファレンスLinux.conf.au 2009のマスコット。
タスマニア島で開かれたので、タスマニアンデビルがペンギンに化けている、ということらしい。


Documentation/logo.txtの注釈には、

Tux is taking a three month sabbatical to work as a barber, so Tuz is
standing in.  He's taken pains to ensure you'll hardly notice.

Image by Andrew McGown and Josh Bush.  Image is licensed CC BY-SA.

Tuxは理髪師の仕事のため、3ヶ月間の長期有給休暇に出ていますので、Tuzが代役を務めることになりました。彼はあなたに気づかれないように苦心しています。???)


とのこと。3ヶ月限定なのかしらん。


あと理髪師〜ってのはオーストラリアのLinuxカンファレンスでLinusがやってた↓のことでしょうかね。
http://tassiedevil.com.au/supporters.html


Linus、お茶目だな〜。

LD_PRELOADでBrainf*ck

LD_PRELOADを使って、GNU/Linuxに含まれる(ほぼ)全てのコマンドで、Brainf*ckを実行可能にしてみます。

LD_PRELOADとは

Linuxでは、同じ名前の関数(などのシンボル)を持つ複数のライブラリがダイナミックリンクされている場合、最初に見つかった方が使われる、ということになっています。この性質を利用して、無理やりユーザが指定したライブラリを最初に読み込ませておき、システム標準のライブラリ(libc,libX等々)の関数を、自作するなどした別の関数に置き換えてしまう機能がLD_PRELOADです。


この機能の応用例としては、X Window関数の呼び出しをフックし、関数呼び出しをトレースするものや、一つのX関数呼び出しを二つのウィンドウに対して同時に呼び出すことで、同じ内容のウィンドウを二つ表示する xmultiwin といった物が作られているようです(マルチモニタ使用時に両方のモニタにウィンドウを表示させるのに便利らしい)。


この機能を利用するには、環境変数のLD_PRELOAD,もしくは /etc/ld.so.preload 内に先に読み込ませたいライブラリのパスを書いておけばOKです。


詳しくは、「BINARY HACK」の「60. LD_PRELOADで共有ライブラリを差し換える」および「61. LD_PRELOAD で既存の関数をラップする」が参考になります。

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

試してみる

以前、以下の記事では、SystemTapを使ってLinuxカーネル内のシステムコールのレベルで動作を乗っ取っていました。
SystemTapでBrainf*ckを実装してみる - Okiraku Programming
これは、拡張子が.bfのファイルを読み込んだ際に、ファイルの内容をBrainf*ckソースとみなして実行させ、その実行結果をアプリケーションに返すというモノです。


今回は、同じことをLD_PRELOADを使ってやってみます。違いとしては

  • 気軽&簡単に試せる
  • でもスタティックリンクされているバイナリには対応できない

という辺りでしょうか。


本エントリ末尾のコードを hook_brainfuck.c として保存し、

% gcc -g -fPIC -shared -o hook_brainfuck.so -ldl hook_brainfuck.c

のようにしてライブラリをコンパイルします。そして、

% cat hello.bf 
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.
[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.
+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.

という感じのファイルを作り、先ほど作ったライブラリを以下のようにLD_PRELOADを指定(bash,zshの場合)した上で読み込むと、

% export LD_PRELOAD=./hook_brainfuck.so 
% ./cat hello.bf 
**BF** target fd: 3
**BF** execute [185]
**BF** done [13]
Hello World!

あら不思議。Brainf*ckとして実行した結果が読み出されましたね。
(**BF**というのは動作確認用のメッセージです。)


id:shinichiro_hさんのcalも実行できますよ(下記ページのソースの後ろに「:2009 01」を追記して実行しています)。
http://d.hatena.ne.jp/shinichiro_h/20070811

$ cat cal.bf 
**BF** target fd: 3
**BF** execute [2041]
**BF** done [105]
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31


なお、unset LD_PRELOADすれば元に戻ります。

コード

Brainf*ckインタプリタ前書いたモノの流用です。例によって入力を受け取るのが面倒なので、ソース中に「:」区切りで入力を書き添えるという仕様になっています。


gcc拡張の __attribute__( (constructor) ) を指定することで、対象プログラム起動時に__get_origs()が実行されます。ここでオリジナルのopen(2)/read(2)を保存しています。
対象プログラムがopenを呼ぶと、下記ソース中のopenが呼ばれるため、そこからオリジナルのopen(2)を呼び直しています。このときファイル名が条件を満たせばbrainf*ck実行対象としてマークしています。
なおopen(2)の実体は環境によって open, open64 の二つが有ったり無かったりするので、若干変更が必要かもしれません(下記では両方ともフックしています)。


なお、dlsym(3)はlibdlの関数で、システム本来のopen(2)/read(2)関数を取得するために使用しています。この辺がポイント。
RTLD_NEXTは自分(現在のライブラリ)の次のライブラリから関数を取得してこいという意味になります。詳しくはmanやBINARY HACK 61節を見てください。


以下コード。 http://codepad.org/7vkAqBWt

続きを読む