ようへい

2013年10月26日土曜日

Android でパケットキャプチャしてみる

Android でパケットキャプチャをしてみたので、忘れないようにメモ。
Unix OS 等でtcpdumpに触れたことがある方向けに書くので、わからない方はスルーしてください。

準備

  1. Android端末のroot取得
  2. Android Virtual Devices ManagerにてAndroid端末と同じバージョンの仮想端末を作成する
※以下から落とした tcpdump でも使えます。
Android tcpdump Downloads
https://www.androidtcpdump.com/android-tcpdump/downloads

キャプチャしてみよう

  1. Android Virtual Devices Manager (以下AVD)にて、Android端末と同バージョンの仮想端末を起動。
  2. 仮想端末からtcpdumpを取得。
    > adb -e pull /system/xbin/tcpdump C:\temp
    737 KB/s (652964 bytes in 0.865s)
  3. Android端末とPCをつなぎます。
  4. 認識しているか確認。
    > adb devices
    List of devices attached
    xxxxxxxxxxxxxxxxx    device
  5. エミュレータから取得したtcpdumpを端末に入れます。
    > adb push C:\temp\tcpdump /sdcard/tcpdump
    3021 KB/s (652964 bytes in 0.211s)
  6. /system にtcpdumpをおけるよう、rwモードでリマウント。
    > adb shell
    shell@android:/ $ su
    su
    root@android:/ # mount -o remount,rw /dev/block/mtdblock0 /system
    mount -o remount,rw /dev/block/mtdblock0 /system
  7. tcpdumpが無いことを確認。
    root@android:/ # ls /system/xbin/tcpdump
    ls /system/xbin/tcpdump
    /system/xbin/tcpdump: No such file or directory
  8. tcpdumpのコピーと実行権付与。
    root@android:/ # cp /sdcard/tcpdump /system/xbin/tcpdump
    cp /sdcard/tcpdump /system/xbin/tcpdump
    root@android:/ # ls -l /system/xbin/tcpdump
    ls -l /system/xbin/tcpdump
    -rw-rw-r-- root     root       652964 2013-10-26 11:46 tcpdump
    root@android:/ # chmod 755 /system/xbin/tcpdump
    chmod 755 /system/xbin/tcpdump
    root@android:/ # ls -l /system/xbin/tcpdump
    ls -l /system/xbin/tcpdump
    -rwxr-xr-x root     root       652964 2013-10-26 11:46 tcpdump
  9. tcpdumpコマンド発行。
    root@android:/ # tcpdump -s 0 -vv -w /sdcard/tcpdump_20131026.pcap
    tcpdump -s 0 -vv -w /sdcard/tcpdump_20131026.pcap
    tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
  10. Android端末でキャプチャしたいアプリなど起動する。
  11. Ctrl+Cでキャプチャを終了
  12. Wiresharkなどでキャプチャしたファイルを開く
tcpdump導入済みであればこんな感じ。
> adb shell
shell@android:/ $ su
su
root@android:/ # tcpdump -s 0 -vv -w /sdcard/tcpdump_20131026.pcap
tcpdump -s 0 -vv -w /sdcard/tcpdump_20131026.pcap
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
インタフェースを調べてキャプチャする場合は以下
shell@android:/ # tcpdump -D
1.dummy0 [Up, Running]
2.wlan0 [Up, Running]
3.rmnet_usb0 [Up, Running]
4.lo [Up, Running, Loopback]
5.any (Pseudo-device that captures on all interfaces) [Up, Running]
6.nflog (Linux netfilter log (NFLOG) interface) [none]
7.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
8.sit0 [none]
9.usb0 [none]
10.rmnet_data0 [none]
11.r_rmnet_data0 [none]
12.rmnet_data1 [none]
13.r_rmnet_data1 [none]
14.rmnet_data2 [none]
15.r_rmnet_data2 [none]
16.rmnet_data3 [none]
17.r_rmnet_data3 [none]
18.rmnet_data4 [none]
19.r_rmnet_data4 [none]
20.rmnet_data5 [none]
21.r_rmnet_data5 [none]
22.rmnet_data6 [none]
23.r_rmnet_data6 [none]
24.rmnet_data7 [none]
25.r_rmnet_data7 [none]
26.r_rmnet_data8 [none]
shell@android:/ # tcpdump -i 2 -vv -w /sdcard/tcpdump_20131026.pcap
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
ちなみに私が使用した仮想端末に入っていたtcpdumpのバージョンは以下。
root@android:/ # tcpdump --help
tcpdump --help
tcpdump version 3.9.8
libpcap version 0.9.8
Usage: tcpdump [-aAdDeflLnNOpqRStuUvxX] [-c count] [ -C file_size ]
                [ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]
                [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
                [ -W filecount ] [ -y datalinktype ] [ -Z user ]
                [ expression ]
関連記事

2013年10月18日金曜日

S-OFF済みのHTL22を Android 4.2.2 (2.15.970.1) にアップデートしてみた

S-OFF済みのHTL22を Android 4.2.2 (2.15.970.1) にアップデートしてみた
私が所有するスマフォで初のHTC機となるHTL22
S-OFFとか、独特の仕様があってナカナカとっつきにくい。
初のHTC機という事でビビッていたというのと、HTC速報Devさんで提供していただいている初期の自作RUUに不具合があったというので、アップデートをためらっていたのだが、アップデート通知がうるさくなってきたのでアップデートしてみた。

前提条件

  • ビルド 1.07.970.4 の時点でS-OFFを行ってあること
  • ClockworkModなどのカスタムリカバリが導入済みであること

準備するもの

HTC速報さん提供の4.2.2対応ClockworkMod (recoverycwm2.img)
au HTL22 HTC J One 2.15.970.1のアップデートの現在状況と、更新ファイル(CWM/RUU)等を公開した件について (HTC速報Dev) | HTC速報
http://htcsoku.info/htcsokudev-news/au-m7wlj-2159701/
HTC速報さん提供の 4.2.2 のRUU (RUU_M7_WLJ_JB422_SENSE50_MR_KDDI_JP_2.15.970.1_Radio_1.23.11.0829_NV_3.39_01C_unsigned_htcsoku_PN07IMG.zip)
au HTL22 HTC J One 2.15.970.1のアップデートの現在状況と、更新ファイル(CWM/RUU)等を公開した件について (HTC速報Dev) | HTC速報
http://htcsoku.info/htcsokudev-news/au-m7wlj-2159701/
SuperSU (現時点ではUPDATE-SuperSU-v1.65.zip)
SuperSU - xda-developers
http://forum.xda-developers.com/showthread.php?t=1538053

アップデート

基本的にはHTC速報Devさんに書かれている手順通り
  1. RUUのzipからsystem.imgを抽出し、SDカードに入れる
  2. RUUのzipをPN07IMG.zipにリネームし、SDカードに入れる
  3. SuperSUをSDカードに入れる
  4. HTL22の電源OFF
  5. 電源+ボリュームダウンを押してFASTBOOT起動
  6. recoveryでCWM起動
  7. mounts and storage -> mount /exrernal_sd
  8. PCと接続し、コマンドプロンプトにてHTC速報Devさんに書かれているコマンドを発行
    >adb shell
    ~ # dd if=/external_sd/system.img of=/dev/block/mmcblk0p38
    dd if=/external_sd/system.img of=/dev/block/mmcblk0p38
    4587518+0 records in
    4587518+0 records out
    2348809216 bytes (2.2GB) copied, 1046.241385 seconds, 2.1MB/s
    ~ # reboot bootloader
    reboot bootloader
    system.imgの書き込みに約20分かかった
  9. FASTBOOTから、HBOOT起動
  10. すると、自動でRUUが始まる
  11. しばらく待つ
  12. Do you want to start update? <VOL UP> Yes <VOL DOWN> Noと表示されることを確認。
  13. ボリュームアップを押してアップデート
  14. system.imgのみFail-scになることを確認
  15. ここまででアップデート完了
  16. 再度FASTBOOT起動
  17. PCと接続し、コマンドプロンプトにてCWMをフラッシュ
    > fastboot flash recovery recoverycwm2.img
    > fastboot reboot-recovery
  18. CWMにてinstall zip from sdcard -> choose zip from external sdcard -> SuperSUのzipを選択しインストール
だいたいこんな感じです。
あとはBusyBox入れたり。
設定 -> バージョン情報 -> ソフトウェア情報 -> その他 -> ビルド番号を7回タップして、開発者向けオプションを出すのを忘れずに。
関連記事

2013年9月30日月曜日

Nexus 7(2012) を JWR66V から JWR66Y にアップデートした時のroot再取得メモ

Nexus 7 (2012)をJWR66V から JWR66Y にした際に rooted から unroot な環境になってしまったので、後々同じことでアタフタしないようにメモ。

再びrootを取る準備

まずは、OEM Unlockが済んでいること。まぁ、もともとrootが取れていた環境なら問題ないはず。
あとは、以下のファイルを準備。
SuperSU
http://forum.xda-developers.com/showthread.php?t=1538053f
TWRP
TWRP 2 - Nexus 7 page
いずれも最新版をダウンロードする。 SuperSUはダウンロード後、Nexusの内部ストレージにコピーしておく。
TWRPは、C:\TEMPなどに置く。
以下の手順では、C:\TEMPに置いたことを想定して進める。

root取得作業

  1. 電源が切れた状態で、電源ボタンとボリュームダウンボタンを押しながら起動し、bootloaderモードにする。
  2. bootloaderモードの状態でPCと接続
  3. 認識できているか確認
    > adb devices
    List of devices attached
    xxxxxxxxxxxxxxxxx    device
  4. カスタムリカバリ導入
    > fastboot flash recovery C:\TEMP\openrecovery-twrp-2.6.2.0-grouper.img
    sending 'recovery' (7992 KB)...
    OKAY [  0.965s]
    writing 'recovery'...
    OKAY [  0.612s]
    finished. total time: 1.577s
  5. リブートし、bootloaderモードへ
    > fastboot reboot-bootloader
    rebooting into bootloader...
    OKAY [  0.019s]
    finished. total time: 0.020s
  6. Recoveryを選択しTWRPを起動
  7. TWRPでinstallを選択し、SuperSUのインストール
  8. Reboot SystemでNexus 7をリブート
  9. Titanium Backupなどが起動することを確認
以上

ほかの端末も、このくらい簡単にroot取れたらいいんだけどなぁ。
関連記事

2013年8月6日火曜日

Rubyで、パスに特殊文字を含むファイルの存在確認を行う

ファイルがあるのに「No such file or directory」

Windows上でRubyを使っていると、ファイルパスに特殊文字を含んだファイルを扱う事がある。
e.g.,
».htm
®.htm
™.htm
これらのファイルをRubyスクリプトの引数で渡してもファイル名が化けてしまったりしてうまく扱えない。
こんなRubyスクリプトに渡してみる。
#!ruby
# -*- coding: utf-8 -*-

puts File.basename( ARGV[0] )
puts File.exist?( ARGV[0] )
puts File.exist?( ARGV[0].dup.force_encoding( 'utf-8' ) )
puts ARGF.path
環境はWindows 7、Ruby 1.9.3、Encoding.locale_charmapCP932。 このスクリプトに先のファイル名を与えると以下のような結果になる。
».htm
≫.htm
false
false
file_check.rb:7:in `path': No such file or directory - ≫.htm (Errno::ENOENT)
 from file_check.rb:7:in `<main>'
®.htm
R.htm
false
false
file_check.rb:7:in `path': No such file or directory - R.htm (Errno::ENOENT)
 from file_check.rb:7:in `<main>'
™.htm
R.htm
false
false
file_check.rb:7:in `path': No such file or directory - R.htm (Errno::ENOENT)
 from file_check.rb:7:in `<main>'
UTF-8のバイナリで表すと、以下のように文字が変化してしまっている。
».htm -> ».htm (0xC2 0xBB -> 0xE2 0x89 0xAB)
®.htm -> R.htm (0xC2 0xAE -> 0x52)
™.htm -> R.htm (0xC2 0xE2 0x84 0xA2 -> 0x52)
どーしたらいいんでしょうか。

できる対処法

とりあえず、Rubyをキックするバッチを作って、その中でテンポラリディレクトリにファイルを複製、リネームして、そのファイルをRubyスクリプトに与えることで対処。
こんなかんじ。
SET FDATE=%date:~2%
SET FTIME=%time:.=-%
SET FTIME=%FTIME: =%
SET TEMP_F="%TEMP%\%FDATE:/=-%_%FTIME::=-%%~x1"

COPY %1 %TEMP_F%
C:\Ruby193\bin\ruby file_check.rb %TEMP_F%
DEL %TEMP_F%
Rubyの中で、オリジナルのパス名が必要なら、こんなカンジ。
SET FDATE=%date:~2%
SET FTIME=%time:.=-%
SET FTIME=%FTIME: =%
SET TEMP_F="%TEMP%\%FDATE:/=-%_%FTIME::=-%%~x1"

COPY %1 %TEMP_F%
C:\Ruby193\bin\ruby file_check.rb %TEMP_F% %1
DEL %TEMP_F%
とりあえずファイル読めるようになる。
もっと効率良い方法あると思うので、教えてください。
関連記事

2013年7月18日木曜日

非推奨になった Mutation events を Mutation Observers に置き換えよう

前からDOM3(黒い三連星じゃないよ)で実装されたDOMAttrModifiedや、DOMNodeInsertedをGreasemonkeyスクリプト内で使用していたのだが、これらのMutation eventsが非推奨となってしまったらしい。
じゃあ何を使ったらいいの?ということで、Mutation ObserversというAPIが提供されているらしい。 Mutation Observersの利用方法をまとめてみた。

ちょっと読んでみよう

使う前に、どうやって使うかなど、ちょっと頭に入れておこう。
Mozillaのページにまとめて書いてあるので、そちらを見れば大丈夫かと。
MutationObserver - Web API リファレンス | MDN
https://developer.mozilla.org/ja/docs/Web/API/MutationObserver MutationObserverにメソッドを与えてインスタンスを作成。
インスタンスメソッドのobserve実行時のオプションで、監視する種類などを設定すると。フムフム。

MutationObserverはこう使う

コードを見た方が速いので、まずは使い方から。
たとえば、DOMAttrModifiedMutationObserverに置き換えるとこんな感じ。
$('#hoge').bind('DOMAttrModified',function(event){
  console.dir(event);
});
var mo = new MutationObserver(function(mutationRecords){
  console.dir(mutationRecords);
});
mo.observe($('#hoge').get(0), {attributes: true});
変更前の値も欲しいならこう
var mo = new MutationObserver(function(mutationRecords){
  console.dir(mutationRecords);
});
mo.observe($('#hoge').get(0), {attributes: true, attributeOldValue: true});

Mutation eventsからMutationObserverへ移行しよう

こんな感じかな。
Mutation events Mutation Observers
DOMAttrModified observe( Node target, {attributes: true, attributeOldValue: true} );
DOMNodeInserted observe( Node target, {childList: true} );
DOMNodeRemoved observe( Node target, {childList: true} );
DOMCharacterDataModified observe( Node target, {characterData: true, characterDataOldValue: true} );
DOMSubtreeModified observe( Node target, {subtree: true} );
そして Firefox、Chromeは実装しているけど、Internet Explorerは未実装らしい。さすがやで!期待を裏切らない。それでこそIE。
IEは消費電力で勝負ですもんね。
よいこのみんな!夏は消費電力を抑えるためにIEを使おうね (オイ)
Internet Explorer 10の消費電力はChromeやFirefoxより18%低い, とMicrosoftは主張 | TechCrunch Japan
http://jp.techcrunch.com/2013/06/06/20130605microsoft-internet-explorer-10-is-the-most-energy-efficient-browser-uses-up-to-18-less-power-than-chrome-and-firefox/
関連記事