2012/12/31

いつの間にやら消えていたiPhoneのUSBテザリング設定を復活させる。

最近、iPhone 4SをUSBにさしてもなぜかUSBテザリングしてくれないなぁ?と思っていたら、割と有名な不具合のようで、あちこちのフォーラムサイトにいろいろ載ってました。

MacOS X Snow Leopard(10.6.8) + iPhone 4Sな自分には
https://discussions.apple.com/thread/4367664?start=0&tstart=0
のAppleUSBEtherHost.kext (2.2.0)を使う解決策がキタ━(゚∀゚)━!でした。

AppleUSBEthernetHost.kext 2.2.0を落としてきて解凍して
suでrootになって
rm -r /System/Library/Extensions/AppleUSBEthernetHost.kext
mv /Users/<名前>/Downloads/AppleUSBEthernetHost.kext /System/Library/Extensions/
chmod -R 755 /System/Library/Extensions/AppleUSBEthernetHost.kext
chown -R root:wheel /System/Library/Extensions/AppleUSBEthernetHost.kext
find /System/Library/Extensions/AppleUSBEthernetHost.kext -type f | xargs chmod 644

2012/12/25

iPod touch (第4世代)を家庭用のサーバーマシンにする。ついでに古いマシンと冗長構成にする。

大学院の時から使い続けているiPod touch 第2世代がそろそろ古くなってきたので
& きのうたまたまアキバでiPod touch 第4世代 64GBが13000円で売っていたので


購入。


こいつが2年以上サーバに使ってたほう。彼女との交際期間よりなg(ry
構築したときのメモは→ http://plog.web-hack.org/2011/02/ipod-touch-iphone-php.html

んで、こっちが新しいの。
カメラがついてたり。iOS 6だったり。

・・・。
ん、、iOS 6???

JailBreakできねーじゃん!!!!

しかたがないので、tethered jailbreakで我慢。

蛇足:
 ソフマップさん、頼むからiOS 5.1で初期化処理やってください。
 Jailbreakなんて例外にしても、マップがあれだと、価値が半減ですよ。
 そもそも、iOS 6のっけると動作がモッサリしてるし。

で、

iPod touchをサーバにしていて、不安定になったりしてrebootかけた、ってことは
ここ2年以上一度もないわけだが、
だけども、やっぱりクラッシュしてしまうと(Just Bootをいちいち手元でやってあげないと)サーバとしての機能が果たせないということになるのは困る。

よって、古いiPod touchも残しつつ冗長構成をとることに。


ちなみに、うちはプライベートIPしか振ってくれないマンションゆえ、
OpenVPNとさくらVPSをつかって、ちょっと特殊なネットワーク構成にしていて、

 [web-hack.org]
   ↓
さくらVPS上の鯖 …192.168.123.1
↓  ↓  ↓  ↓
○  ○  ○  ○ …192.168.123.0/24

構築方法は→http://plog.web-hack.org/2011/11/vpsopenvpnipod-touchweb.html

こういうネットワーク構成を前提に説明をすすめます。
以降の作業は、さくらVPS上の鯖でのものです。(新旧iPod touch側は同じHTTPサーバを2つ用意するだけなので、省略)

apache2の下記のモジュールを有効化。
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http

そんで、/etc/apache2/sites-available/defaultに
<VirtualHost *:80> 
    ServerName web-hack.org

    <Proxy balancer://web-hack/>
        BalancerMember http://192.168.123.10/
        BalancerMember http://192.168.123.18/
    </Proxy>

    ProxyPass / balancer://web-hack/
    ProxyPassReverse / balancer://web-hack/
</VirtualHost>
って書く。
192.168.123.10が古いiPod touch
192.168.123.18が新しいiPod touch

これで、あとは
sudo /etc/init.d/apache2 restart
とやるだけで、簡易ロードバランサのできあがり。


なんか
balancer://web-hack/

balancer://web-hack
と書いてしまうと、よくわからない
[Mon Dec 24 23:33:21 2012] [warn] proxy: No protocol handler was valid for the URL /favicon.ico. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
みたいなエラーが出ます。けっこうはまりました。

2012/11/20

Android(4.0以降)にはグローバルプロキシ設定が隠れているようだ。

最近、Galaxy Note(GT-N7000)にCyanogenMod 10を導入していろいろソースを見たりいじったりしてるわけですが、
たまたまなんだか気になるものを発見したのでメモ。

あれ?プロキシ設定あるよ?

まあ、なにもしなくてもWifi設定からできるけど、あれって「ブラウザでしか使えまへん」って思いっきり書いてあるし。
こっちはどうなんでしょう?
(そのうちtcpdumpとって見てみます)

以下、自分のEvernoteにメモってたことそのままコピペw
------------------------
ICSくらいからAsIsでメニュー自体は実装されているようだ。
ただ、動きが保証できていないのか、非表示にされてる。


    158         // Enable Proxy selector settings if allowed.
    160         DevicePolicyManager mDPM = (DevicePolicyManager)
    161                 activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
    162         // proxy UI disabled until we have better app support
    163         getPreferenceScreen().removePreference(mGlobalProxy);
    164         mGlobalProxy.setEnabled(mDPM.getGlobalProxyAdmin() == null);


163, 164行目をコメントアウトすると、メニュー自体は見れるようになる。



そして、ConnectivityManagerがわにGlobalProxyをセットするルートもあるようだ。


    257         ProxyProperties p = new ProxyProperties(hostname, port, exclList);
    258         // FIXME: The best solution would be to make a better UI that would
    259         // disable editing of the text boxes if the user chooses to use the
    260         // default settings. i.e. checking a box to always use the default
    261         // carrier. http:/b/issue?id=756480
    262         // FIXME: If the user types in a proxy that matches the default, should
    263         // we keep that setting? Can be fixed with a new UI.
    264         ConnectivityManager cm =
    265                 (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
    266 
    267         cm.setGlobalProxy(p);


もっと根っこをみていくと、単純なDBセットのようだ。

   2806             ContentResolver res = mContext.getContentResolver();
   2807             Settings.Secure.putString(res, Settings.Secure.GLOBAL_HTTP_PROXY_HOST, host);
   2808             Settings.Secure.putInt(res, Settings.Secure.GLOBAL_HTTP_PROXY_PORT, port);
   2810                     exclList);

------------------------


ということは・・・・
ルートハックさえしてしまえば
ってやって、書き換えれちゃうわけですね。


ただ、下記のようなソースコメントがあるくらいなので、どのくらいまともに動くのかは…使ってみないとわからんですね。
   162         // proxy UI disabled until we have better app support




:追伸:

一応検証したので。

プロキシ設定のUIから、DBに設定値が行く事は確認した。

adb shell 'echo "select * from secure;" | sqlite3 /data/data/com.android.providers.settings/databases/settings.db'
129|global_http_proxy_host|hoge-hoge.org
130|global_http_proxy_port|8080
131|global_http_proxy_exclusion_list|abc.com

ただ、tcpdumpを取ってみると、反映はされていない。3G/Wifi環境ともに
・Facebook
・Google Talk
・Google Play
・マピオン

どれも直接接続しに行ってる。すくなくとも4.1.2では。
全然グローバルじゃねえ!!!

っていう結果でした。

2012/09/27

遠くのビルドサーバでビルドしたapkを手元のPCにつないだスマホにadb pushしよう

最近はやりのAndroidですが、ICS以降、ビルドの要件がめっちゃ高くなりました。
早い話が、CPU、メモリが潤沢にあるPCでしかビルドできません。

ビルドサーバを用意して、手元のノートPCで細かいデバッグをやる、というのがよくあるスタイルですが、
ソースをアップして成果物をSFTPでダウンロードして・・・ というのも面倒ですよね。

ようするに、ビルドサーバーのコンソールで作業していて、その流れでadb push hoge.apk /system/app/ ってやったら、手元のスマホにpushされるようにしたいんですね。
(SSHFSを使うっていう裏技もありますが、これじゃあWindowsでは使えません)


とりあえず手元のMacbookAirにGalaxyNexusつないで、ビルドサーバとはSSH接続、ってのを仮定してすすめます。
その3ステップ

1. MacbookAirで
adb devices
これでMacbookAir:5037=>GalaxyNexus:5037というルートができます。

2. MacbookAirからビルドサーバへログイン
ssh build.server.hoge.jp -R 5037:localhost:5037

これでビルドサーバ:5037=> MacbookAir:5037というルートができます。


3. SSHでログインしたシェルで
adb devices
これで、MacBookAir側のGalaxyNexusが出てきますね。はい。完了です。
あとはadb push なりなんなり。

adb logcatとかもできますが、ネットワーク越しにログがぜーんぶ流れることになるので、logcatはMacBookAirローカルでやりましょう。

2012/07/26

パケットキャプチャをしてわかった。LINEは危険。

ケータイの開発現場の話なので、多くは語れないが、
今日、すこし解析をしていてこれはどうなんだ??と思った件を。メモ。

 標的はAndroidのLINEはアプリ。


1. LINEを入れていると、電池もちが悪くなる件

LINEって、なんかAppleのiMessageみたく、SNSやってるような画面ありますよね。

こんなやつ。(http://news.ameba.jp/image/20120723-287/ から拝借させていただきましたm(_ _)m)

チャットやってる最中にリアルタイムに相手からのメッセージが飛んでくる仕組みは、
まあなんとなくわかりますよね。チャットサーバー的なものにコネクション張りっぱなしにしておいて、受け取ってるんでしょうね。

では、
アプリ画面を閉じてる時ってどうなってると思います?

メール通知みたいな感じでLINEのメッセージを届ける仕組みはどうなっているのか?

rootハックした端末で、tcpdumpをとってみてみました。

なんと、HTTPのKeep-Aliveで実現されているんですね。
ようするに、Android端末はDeepSleepに入っていないんですよ。


まあ、ただ、LINE開発者もちゃんと考えてはいて、多少の考慮はされています。


Keep-AliveのTimeoutが何回か続くと、その後はAlarmManagerのRTC_WAKEUPにゆだねて、5分に1回のポーリングをする動作に切り替えて、Keep-Aliveをやめるようにはなっています。


2. あれ、HTTPって、セキュリティ的に大丈夫なんだっけ・・・?

で、一番の問題は電池の問題じゃなくて、ココ

>なんと、HTTPのKeep-Aliveで実現されているんですね。
でピンときた人もいるかもしれない。
そう、メッセージの内容が盗聴できる!

(2012.10.16 写真追加)

tcpdump -n -s 0 -w /data/local/tmp/line.pcap
(チャット、送信!)
Ctrl+c

と、かなり狙った手順ではありますが、
キャプチャ結果を見ると、どうみても暗号化されてないのがわかります。
その気になれば、盗聴も改ざんもできそうです。

ちなみに、Wifi通信だと、平文っぽくはありませんでした。なんらかの暗号化がされているようです。平文通信なのは、3Gの時だけのようです。


んにしても、「そんな、盗聴されたら会話が丸見えだなんて!」と思う人は多々いるでしょう。

あまり世の中には知られてなさそうだったので、細々とでも、ここのブログで発信してみます。

2012/06/20

root化した端末で、Settings.secure.*の設定値を勝手に書き換える。


電池もちの悪いスマホをどうにかしようと、LTEにアタッチさせない方法をいろいろ探っているときに、たまたま見つけたHackテクニックを紹介。

すでに、某所にて回答として書いたネタだったりするのですが、結構いろいろできておもしろいので、こちらでも紹介。

そもそもSettings.secureがいじれると何が嬉しい?
私自身、何が嬉しいかはよく知りません(爆)
本来、getすることができてもsetすることはできない設定値をいじれることが嬉しい、ってだけの完全にダメなハッカーです。はい。

一応リファレンス見てみると…
http://developer.android.com/reference/android/provider/Settings.Secure.html

う〜ん、なんかピンと来るもんはないですね。パーミッションさえあればAndroid標準で提供されているAPIを経由して設定できるものが多いです。
WIFI系の設定値で、AP_COUNTとかWATCH_DOGなんとか、みたいなのがある程度でしょうか。

あ、Settings.systemのほうもいじれますよ。念のため。ただ、system設定をいじったところで、そんなにおもしろいことはできないような。。偏見ですが。


どうやっていじるか

Settings.systemとかSettings.secureって、実体は何かって知ってます?
Androidのソースを読むと分かるんですが、結局のところ
/data/data/com.android.providers.settings/databases/settings.dbを、
コンテントプロバイダ経由で読み書きしてるだけなんですね。

root@android:/ #sqlite3 /data/data/com.android.providers.settings/databases/settings.db

SQLite version 3.7.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table

android_metadata   bookmarks          system          bluetooth_devices  secure  

こんな具合に、root権があると、sqlite使って覗けちゃうんですよね。

ということは! ですよ。

su -c "echo | sqlite3 <上記settings.dbのパス>"

って、アプリからrootシェルたちあげて実行すれば、putInt(Settings.secureなんちゃら)みたいの書いたりせずとも、ましてや、AndroidManifestでパーミッションを設定していなくても、設定値を読み書きできちゃうんですね。

アイディアとしてはそんな感じです。
実装はここをみてください。SuperUser+su環境でrootシェルを動かすための補助クラスを使って8行程度と、非常に簡単にできてしまうのです。。
あんまりおおっぴらに言ってしまうと、よろしくない内容なので、多くは語りません(^^;;

2012/06/03

スマートフォンのLTE待受で電池がもたなさすぎな件についてAndroidソースコードを読んで考える

職業柄、毎日のようにスマホをさわっているのだけども、どうも気になって仕方がないことがある。
それが、電池もちの悪さだ。
企業秘密とかもあるので、多くは語れないのだけど、語れる部分をいうと、概してLTE待受の電池もちが悪い。

うちの製品だけだったら、富士通がんばれよ、と2chに書けば済む話だが、
実際には他の会社も同じようなのだ。

あのSamsungが珍しくフィーバーを起こした、Galaxy Note。
docomo版はLTE対応。無駄に羊が歩いているのはrootをとって根っから削除したとしても、1日とちょっとしか電池が持たない。
いっぽう、国際版の3G only版はというと、余裕で2日はもつ。もちろん、特段の配慮など全くしていない。普段使いのままで、である。

そこで、簡単に思いつくのは、3Gだけにしかアタッチしないようにすればいいのではないか?という話。
イーモバイルのルーターだと回線接続を安定させる目的ではあるがLTE onlyや3G onlyにする裏技が用意されている。
これはAndroidで実現できない訳がない。

ということで、ためしにAndroidのソースコード検索で「WCDMA only」で検索してみた。

あったwwww

モデム側が実装しているかどうか、は別として、Androidの仕組みとしては存在しているらしい。
じゃあ、どこから設定ができるのだろう。

アプリ側のルートを追ってみた。
ここNT_MODE_WCDMA_ONLYという変数が定義されててこいつが使われているところをたどると...

意外にもPhoneであった。
あれ、これって、あのAPN設定とかあの辺の並びじゃない?

でも、手元の端末にはそのような設定はないぞ?
うーん、ソースコード的には選べるはずなんだけどな。。
ってことは、何? わざわざWCDMA onlyという選択肢をメーカーのカスタマイズで消してるってこと?
(勝手なイメージコード)
418     <string-array name="preferred_network_mode_choices">
419         <item>LTE / CDMA</item>
420         <!--<item>EvDo only</item>-->
421         <!--<item>CDMA w/o EvDo</item>-->
422         <!--<item>CDMA / EvDo auto</item>-->
423         <item>GSM / WCDMA auto</item>
424         <!--<item>WCDMA only</item>-->
425         <item>GSM only</item>
426         <!--<item>GSM / WCDMA preferred</item>-->
427     </string-array>
428     <string-array name="preferred_network_mode_values"  translatable="false">
429         <item>"7"</item>
430         <!--<item>"6"</item>-->
431         <!--<item>"5"</item>-->
432         <!--<item>"4"</item>-->
433         <item>"3"</item>
434         <!--<item>"2"</item>-->
435         <item>"1"</item>
436         <!--<item>"0"</item>-->
437     </string-array>
べつに電池がもつならそれでいいんだけど、速度いらない、むしろ電池持つ方がうれしい!っていう時もあるんじゃないの?
そんなわけで、ちょっとrootとって、3Gだけにしかアタッチしない電話を作ってみようと思う。

いじるのは↑のリソースファイル。ここでWCDMA only(value=2)を選択可能にしてあげれば良さげーである。

まあ、国内版Galaxy note LTEに使われているモデム側が実装ないとダメなところではあるが。モノは試しである。

2012/04/16

Xperia rayをWebサーバーにする。

なんとなくWeb鯖を自前で作りたいと感じたので、なんとなくアキバへ向かった。

今回の必要条件としては、CPU 1GHz、メモリ512MB。そんでもって15000円以内。
そんななかで、候補に上がったのは以下の3つ。
・第4世代iPod touch
・F-12C
・Xperia ray(SO-03C)

なんとなく、触ったことのないものがいいなと思い、SO-03Cに決定。14000円なり。
いくら中古ったって、購入日2012/03/30だぜ?安すぎ。

・rootハック
いまやメジャーなexploit ツール、zergRushで瞬殺。

・なんとなくシャッター音を消す
/system/build.propにある
ro.camera.sound.forcedを0にする
(参考:http://gadget-shot.com/2011/10/04/xperia-ray-so-03c-camera-sound/

・Lighttpdのインストール
さて、シャッター音が消えて満足したところで本題のWebサーバのインストールにかかる。
Apacheは組み込み系では不向きらしい、というネット情報から、iPod touchでも実績のあるlighttpdを使用。
Android用のバイナリはここからありがたく拝借。

そんで、
adb push php-5.3.8_lighttpd_1.4.29_armv5.tar.gz /data/local/
で端末に突っ込んで、
adb shell
$ su
# mount -o remount /system /system
# mount -o remount /  /
# cp /data/local/php-5.3.8_lighttpd_1.4.29_armv5.tar.gz  /
# tar xzvf php-5.3.8_lighttpd_1.4.29_armv5.tar.gz
これでOK。

あとは、
# reload_fcgi.sh
# reload_lighttpd.sh
とすれば、80番ポートでHTTPデーモンが居座りはじめる。

なおWebrootは/system/var/www/。ここはRead-onlyなので、
適当に/sdcard/wwwとかにシンボリックリンクを貼っておくといい。
# ln -s /sdcard/www /system/var/www
# ln -s /sdcard/www-log /system/var/log

・起動時にHTTPサーバが立ち上がるようにする
これ、簡単そうで意外とハマった。
ネット情報だと/system/etc/install-recovery.shが呼ばれるだとか書いてある。
たしかに、init.rcをのぞいてみると

service flash_recovery /system/etc/install-recovery.sh

    oneshot
ってかいてある。しかし、実際にはなぜか呼ばれてないように見える。

ほかに起動時に呼ばれそうなものを目星つけて、
・/system/etc/pre_hw_config.sh
これがいけそう。

ただ、こいつが呼ばれるタイミングがちょっと特殊で
・PATH(環境変数)がセットされてない
・SDカード上がマウントされていない
というもの。これじゃ都合が悪い。

いろいろ試行錯誤した後、結局こいつの末尾に

export PATH=/system/bin:/system/xbin
#local script
(sleep 30 && /system/etc/local.sh > /sdcard/local_sh.log 2>&1) &

こんなかんじで追加してやれば、起動してちょっとたってから/system/etc/local.shをroot権で実行してくれる。

あとは、/etc/local.shというファイルに、さっきのHTTPデーモンを立ち上げるコマンド2行(reload_fcgi.shとreload_lighttpd.sh)をフルパスで追加すればよい。
そんで、再起動すれば、

iwaki-yuusuke-no-MacBook-Air:~ yi01$ adb shell netstat -l
Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp       0      0 127.0.0.1:9001         0.0.0.0:*              LISTEN
 tcp       0      0 192.168.100.100:5001   0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:80             0.0.0.0:*              LISTEN
 udp       0      0 0.0.0.0:1024           0.0.0.0:*              CLOSE
 udp       0      0 192.168.100.100:40156  0.0.0.0:*              CLOSE
 udp       0      0 239.255.255.250:1900   0.0.0.0:*              CLOSE

おおお!Webサーバになってくれました。

あとは、iPod touchの時みたいに、OpenVPNクライアントとかrinetdでごにょごにょすれば、公開Webサーバにできる。いぇい!

2012/04/09

Galaxy NoteにタブレットUIのROMをいれる


Imilka AOSP v08のTablet UIを入れてみた。
GMailが2painで使えるのは非常に便利です。さすがタブレット用。

S Penも、マウスとして認識してくれます。

しばらく(公式ROMが出るまでは)こいつで使ってみて遊んでみようかなと思います。

2012/02/27

USB On The Go と MHLを試す。

Nokia N8では、パッケージにUSB OTGケーブルが同梱されており、SDカードリーダとかを使ってさらにminiHDMIケーブルで大画面に映しだしたりすることができていた。

今、データ通信用にメインで使っているGalaxy Noteでも、USB OTGはサポートされているらしい。また、HDMIに代わるMHLなるものもサポートされているらしい。
どうせなら両方試してみようかと思いたち、アキバへGoGo。

これらを購入。左がMHLケーブル。あきばおーに売ってた。そして、右がOTGケーブル。こいつはあきばおーでは見つからず、Jan-gle(パソコン工房向かい)にて購入。
いずれも、ケーブルにしては随分と高価だった。

さて、ウキウキワクワクと端末に刺してみるが・・・。あれ、認識しない。騙されたか・・・。いや、まてよ、いまこの端末はICSのROM(リーク版)が入っている。元に(GBに)戻せば動くんじゃないか、という直感が働く。

そんなわけで、GBに戻す。
方法は、XDAのサイトにROMがストックされていて、LA2のOpen Europe版をOdinで焼く。今回はOdinも同梱されていたので、特に別にダウンロードする必要はなかった。
あ、ドライバは、Kiesなんちゃらっていうアプリは使わないので、USBドライバだけをダウンロード。

ROM焼き後、とりあえずさして見る。すると・・・


おおおおおーーーーーー。さすが。MHLは素晴らしい。
ただ、N8と違って、画面出力していると、USB端子が奪われてしまい、OTGが使えない。
まあ、もともと大画面なスマホなので、OTGとHDMI両方を同時に使う必要もなかろう。

OTGについては、SDカードリーダーで試したが、難なくメディアスキャナが走り、認識できた。USBマウスについては、ThinkPadキーボードマウスには対応していないようで、動かなかった。

当面は、デジタル一眼で撮った写真のアップに使おうかなと思う。

2012/02/26

Google日本語入力におけるShift+SpaceでIMEのOn/Off切り替え

すでにいろんなサイトにいろんな情報があるが、
自分の情報としてまとめておきたいので、メモ。

61c61
< Composition Shift Space Convert
---
> Composition Shift Space IMEOff
130a131
> DirectInput Shift Space IMEOn
148c149
< Precomposition Shift Space InsertAlternateSpace
---
> Precomposition Shift Space IMEOff

なぜShift + spaceかって?
ShiftとSpaceはどんなキーボードを使っても、ほぼ定位置にあるからだ。
Ctrlや半角/全角キーは、キーボードによって位置が違っているので、使用するキーボードにあわせてIMEトグルのやり方を考えないといけないとか、非常に無駄である。