NFCハッカソン、のちMT・AT


本日は六本木ヒルズで開催されました、NFCハッカソンに行ってきました。

NFCとは近距離無線通信の方式の一つであり、厳密には大分違いますが、FeliCaと同じようなものだと思って頂ければ分かりやすいと思います。

RFIDタグのこれからの利用法やスマートタグの紹介、AndroidでのNFCを利用したアプリケーションのアイデアなど、新しい情報を色々と得ることが出来ました。

 

 

その後二子玉川に舞い戻り、いつもどおりMT車の教習を受けた後、今度は初のAT車の教習が待ってました。

これはどうやら『AT車も運転するからには、しっかりと理解できていなければいけない』という配慮でしょうか。

MT車で教習の皆さん、AT車はギアチェンジがほぼ無いからといって高をくくってはなりませんよ、と学科教本にも有りましたとおり、しっかりと心の準備をして臨みました。

 

もうMT車の運転にも少し慣れたころでした。そこでAT車を運転すると大分印象がちがいます。

一番気にかかったのはエンジンブレーキの効きの悪さ(?)です。無段階変速なのでそれはそうでしょうが・・・

自宅の車もバリバリATのプリウス君ですから、やっぱりAT車の運転にも慣れないとねw

SynAck Capture Nite 2011 参加してきました。


その名のとおり、ネットワークキャプチャの勉強会に参加してきました。
NiteってNightの間違いじゃないの?と激しく思っていたところ、主催者の方からしっかりと解説

『最近って色々省略するのが流行ですもんねw』

って、えー 本当ですか???

まぁ、そんなこんなで始まったこのSynAck Capture Nite 2011、実は北海道の『北海道情報セキュリティ勉強会(セキュポロ)』にも同時中継されていたようです。

まず、ネットエージェントの杉浦社長によるから『永続的パケットキャプチャのすすめ』という講義を受けました。

普段皆さんもパケットキャプチャに使われているであろうWiresharkですが、これではメモリの要領を超えて記録することはできません。
ということは、永続的にキャプチャし続ることはできない⇒インシデントが起きた時実際のパケットを確認できない!!

そんなわけで紹介されたのがこの Packet Black Hole
・・・まぁ、自社製品の宣伝ですねwww

その後、パケット記録用の媒体(HDD等)の話もありましたが、ここでは割愛させていただきます。

キャプチャだけでなく、IDSを本格的に運用するならSnortとかtsharkとかどう?とのことです。
Snortはセプキャン以来使ってないな・・・と懐かしく思い出されます~

続きまして、この記事のカテゴリにAndroidが含まれてる所以ですね。
一応個人としてもAndroidのアプリ開発者なので、この話にも非常に興味惹かれました。

まぁどういう内容かといいますと、ダウンロードしてるAndroidアプリの解析ですね。
まずはパケットキャプチャです。端末をWi-Fiネットワークに接続し、ミラーリングハブを噛ませてパケットを取ります。
これは単純にWiresharkで十分でしょう。
そこからapkファイルを抽出、それをunzipでclass.dexを取り出します。
Dex2jarをかけてjarファイルに変換し、JDでデコンパイルすればもうそこにはソースコードが・・・

とのことですが、家にはミラーリングハブはありません。なのでARPスプーフィングをしてキャプチャを試みましたが、予想通りSSHの通信は中継できず、試みははなから頓挫しましたorz

まあ、いずれかまた取り組みます!乞うご期待ですね。

次のセッションは、DEFCON19に参加した @ghetto2199さんによるCTFパケット解析の講義です。

ここでまめ知識ですが、DEFCONとは毎年ラスベガスで開催されている世界最大級のセキュリティ会議と言われるものです。
DEFCONでは講演以外にも、セキュリティに関するワークショップなどさまざまなイベントがありますが、その中でも特に人気と言えるのがCTF(Capture The Flag)です。
CTFでは各チームにサーバー機とイメージが配布され、互いに自分のサーバー上のサービスを守りながら、相手の秘密鍵の奪取や上書きなどの攻撃をします。
自らのバイナリを解析して脆弱性を見つけてパッチを当てながら相手を攻撃するとても高度な戦いです。(二十年以内に絶対行ってやる!!!!)

てなわけでDEFCONの説明を簡潔にしたところでパケットの解析された結果です。
@ghetto2199さんの所属するsutegoma2チームが攻撃を受けたサービスの一部を紹介。

1、telephone

Port:1477

キーが奪取される

攻撃パケットはエンコードされていた

上部のパケットがデコーダーになっている

2、htlame

Port:42737

telephone経由で/tmp/foobar/にシンボリックファイルを張られる

キーが奪取される

3、rotary

Port:3375

キーの奪取と上書き

攻撃パケットがIDSに引っかからなかった理由、それはそれぞれが独自のエンコーダを使用しているからとか
ヘッダ部分にデコーダとなるバイナリが含まれているとかおそろしや((((;゜Д゜)))

主催者のまっちゃだいふく(@ripjyr)さん、会場提供のネットエージェントさん、ありがとうございました。

goToSleep()?


ついこの間、学校でAndroid君をいじっていたら、教師に電源を切るよう怒られましたorz

別に電源を切ること自体はなんでもないんですが、やることいっぱいで忙しいこのときにリブートには時間がかかるわけですよ、、、

なので、こんなときのためのジョークアプリ作ってみましたww

 

単にシャットダウンダイアログを出してスリープにする、とういうだけの作業だったのですが、意外と苦労しました。

それは、スリープに移行する権限をuses-permissionでは指定できないから!!

本来なら、AndroidをスリープさせるgoToSleepはPowerManagerに含まれているので、『android.permission.DEVICE_POWER』を許可してやりゃいい筈なんですが・・・

ERROR:user *** nor process doesn't have permission "android.permission.DEVICE_POWER".

あれま。

どうやら、goToSleep()はシステムからしか操作できないようで

 

だったら、別の方式で攻めましょう。

バックライト点灯時間の操作です。

 if((defTime = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, -1))==-1)
 finish();
 halting = new ProgressDialog(this);

 AlertDialog.Builder confirm = new AlertDialog.Builder(this);
 confirm.setIcon(android.R.drawable.ic_dialog_alert);
 confirm.setTitle("電源を切る");
 confirm.setMessage("携帯電話の電源を切ります。");

システムのバックライト消灯時間を頭で取得して、その後ダイアログを出します。


Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 500);

ひとまずこれで消灯時間を500ミリ秒にして、、、

 @Override
 public void onPause(){
 super.onPause();
 halting.dismiss();
 halting = null;
 }

 @Override
 public void onDismiss(DialogInterface arg0) {
 // TODO Auto-generated method stub
 Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, defTime);
 finish();
 }

消灯後にonPauseでダイアログを消し、onDismissでそれに続いて設定を戻して終了です。

これは『android.permission.WRITE_SETTINGS』を必要としますので、少々インストールを拒みたくなりますが、怖いことはしてないので安心してくださいww
ものはこれ です。

案の定というかなんというか


受験勉強が忙しい今日このごろですが、ちょっと息抜きということでAndroidの壁紙を作ってみることにしました。

壁紙といっても、ただ単に表示されてるだけじゃありません。動くんです!

まぁ、ようはライブ壁紙ですね。

 

はじめはただ単に自分の趣味で好きなキャラクターが動き回るように作ったのですが、それを学校で見せたところある程度上々の評価。

なんか公開したらいけるんじゃないか?でも著作権とか大丈夫かな・・・

とか思ってたのですが、法律に詳しい友達に聞いたら金を取るような商売目的じゃなきゃ良いらしい(←本当かな・・・?)

こんな不確かな情報じゃ怖いので、自分が使ってたキャラクターの絵のページを見ると『フリー素材』の文字発見!

これで安心して公開できますねw

 

そんなわけで『リトルバスターズ!』と『とある魔術の禁書目録』、あと『涼宮ハルヒシリーズ』のキャラがランダムに出現し、画面上を歩き回りまわるやつ作ってみました~

これは元々は自分の娯楽用で作ったので過度な期待はしないでくださいねw

リンクはここです。

たった1日にしてダウンロード数が400を超えるとは・・・

やはりアニメ力恐ろしいっ

何のメソッドでしょう


いやはや、昨日は一日中センター模試に追われた酷い一日でしたよ。
やっぱりもうそろそろマジで受験生って言う感じですね(汗)

それは置いておいて、前回のタブの件、無事解決しました~
XMLで指定するのもちゃんと動いたんですが、今作ってるアプリの関係上別のアクティビティを指定することにしました。
んで、その一部のコードがこれです。

private int check(){
int rest = 12;
Boolean check;

for(int k=0;k<2;k++) 
next:
 for(int j=0;j<5;j++)
  for(int i=0;i<5;i++){
   check = (k==0) ? *****_chk[j][i]:*****_chk[i][j];
   if(check){
    rest--;
    continue next;
   }
  }
for(int k=0;k<2;k++)
 for(int i=0;i<5;i++){
  check = (k==0) ? *****_chk[i][i]:*****_chk[i][4-i];
  if(check){
   rest--;
   break;
  }
}

return rest;
}

都合により、変数名でばれないように一部を*に置き換えましたww
まあメソッド名にcheckってあるし、まあなんとなくは分かるよね~

まだ開発途中なのでなんともいえませんが、できたらちゃんと公開しますよ!

タブを作ってみよう


久しぶりにAndroidの開発にちょっと戻ろうかと思います。

今日はタブを作ってみようと思ったのですが・・・・
XMLの使い方が分からん(汗

いままで、どんなレイアウトも全部プログラムに頼っていたため、
「タグ作るためにXML使うよ~」って言われても・・・
まあ今日は寝坊したことにより1時間しかなかったから、結局分からずじまいorz

明日には解決させますよ!

一応紹介しておきます


折角公開しているAndroidアプリについて触れないのは勿体無いので、一応紹介します。

公開順でいうと、
連打!
開発者向けアカウント確認
ですね。

ちょっとここで暴露しちゃいますと、これらのアプリは友達のMineStudioさんのアプリを真似して作ったものなんです。
彼はまだ高校1年生ですが、遥かに高いスキルを持っていてとても追いつけませんorz
でも、話を聞くとコンピュータ歴は私よりも年数的には浅いそうで(自分のほうが覚えがわるry)、ちょっと頑張ってみようかなぁという気にはなりました。
開発は最初は真似から入るって言うのも、悪くはないですよね。・・・ね?

ま、話は戻してアプリ紹介!

連打!

このアプリが何なのかというと、まあ連打するものですよね。
一応このFlashTouch(Beta)の動作を参考にさせてもらったので、どことなく画面が似ています。
開発者としては、これはactivityの遷移、アニメーションやプリファレンス、あとはオプションメニューとダイアログ、トーストの練習のためですね。

まあ図にあるとおり、ちゃんとタイマーの一時停止等々の処理もさせます。
モードは二つあり、制限時間内に何回叩けるかっていう「秒数制限」と、ある回数を何秒でたたけるかっていう「回数制限」です。
実際作るのはif文いじったり、インクリメントとディクリメントを逆にしたりするだけとか、たいしたことはしてませんw

一応ダウンロード数はやっと300は超えましたが、500には到底届きそうもないですねorz

次はこちら

開発者向けアカウント確認

これはAccountManagerを用いて、Android機本体に格納されているアカウント情報を持ってきて表示しようというものです。
アカウントの名前、タイプ、ハッシュ値は表示しますが、パスワードとかには一切触れてないのでご安心を(てか、/usr/systemの accounts.dbにあるらしいけど、rootとってないし非公開だしで俺には無理w)

それだけじゃなく、Googleアカウントでサービス接続時に照合される認証トークンの取得や、 ユーザー定義で他のアカウント(本体に登録されている必要あり)の認証トークンも取得することができます。

取得方法(というかコード)を紹介します。

private String getToken(String sv,String cd){
 String authToken = null;

 mAccountManager = AccountManager.get(this);
 Account[] accounts = mAccountManager.getAccountsByType("com.google");
 AccountManagerFuture<Bundle> future =mAccountManager.getAuthToken(accounts[0], cd, false, null, null);

 Bundle bundle;
 try {
  bundle = future.getResult();
  Intent intent = (Intent) bundle.get(AccountManager.KEY_INTENT);
  if (intent != null)
   startActivity(intent);

  authToken = mAccountManager.blockingGetAuthToken(accounts[0], cd, false);
 }
 catch (OperationCanceledException e) {
  e.printStackTrace();
 }
 catch (AuthenticatorException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return "サービス:"+sv+"\nコード:"+cd+"\nトークン:"+authToken;}

まあこんな感じですよね。
でもこれブロック型だから、取得を要求後にネットワーク障害とかで受信できないとその間制御が返らなくてフリーズ///

いつかどうにかします。