こんにちは、カノジョできないエンジニアの@n0bisukeです。
正直カノジョできないエンジニア Advent Calendar 2016の期待値が高すぎてどうしようかとけっこう直前まで悩んでましたが、先ほどの#IoTLTで発表してきました。ツイートまとめもあります。
この記事の終着点はいかにって感じですが、進めます。
まず、期待値が高い気がしていて日和る
さっそく本題からそれるんですけど、僕がこの記事を書くにあたりこんな感じのプレッシャーを感じていることを共有します。
その1。はてぶが大盛況
大盛況だから乗っかったってのもあります笑
その2。タイトルを勢いでいれてしまった
「cross me使ったら相手に退会された話」
あとから気づいたけどハック要素を入れるのが難しい...
その3。知り合いからメッセージが来る
↑の結果、久しく連絡取ってなかった知人から急にメッセージがきました。
このタイトルで期待してる人がいた。後戻りしにくい
その4。知り合いにFacebookでタグ付けされる
これも久しく連絡取ってなかった知人です。
しれっと別のネタを題材に記事を書こうかと思ってもいたけど、FBでタグ付けされたらもう後戻りできない。
ということでこのネタで進んでいきます。
CROSS ME(クロスミー)とは
位置情報を使ったいわゆる出会い系アプリです。
Facebookの友達は表示されないですが、友達の友達は表示されるようです。
こんな感じで同じタイミングで近くにいた異性が表示されます。(画像では写真は伏せてます)
異性のプロフィールに"いいね"をつけることができますが、これをお互いにするとマッチングとなってメッセージやり取りができます。
出会い系だとお互いのことが最初分からないので同じ場所にいたっていうカジュアルな共通点があることで話しやすさを演出している気がします。
CROSS ME(クロスミー)を使ったら相手に退会された話
本題といえば本題なのですが、そのままです笑。
まず、僕のCROSS ME歴についてですが、こちらにもあるように2016年9月23日に開始していました。
謎に始めた宣言してますね。
- 一つ目の衝撃的な出来事
とまぁ、 Web業界の狭さを感じさせれらました。
出会い系って隠れてやるものだと思うので、こういう感じで知り合いの知り合いが出て来ると つらいこわいです。
- 2段階目の衝撃的な出来事
ここまで読めばなんとなく予想がつく人も多いかと思います。
とまぁ、タイトルにある通りですが会社名を言い当てたら次の瞬間にその子は退会してました苦笑
実際の画面はこんな感じです。 退会した人との会話ログは見れないようになってるみたいです。
キャプチャの日付を見ると分かりますが、9/23に開始して9/24にこの事件が発生していて、わずか1日でCROSS MEは衝撃を与えてくれました。
・
・
・
・
・
・
・
・
ということでCROSS MEを使ってけど カノジョできてないですorz
CROSS MEの実装をリバースエンジニアリングして探ってみた(蛇足)
この悔しさを何かハックネタに昇華したいと思いCROSS MEをリバースエンジニアリングしてAPIを探れないか試してみました。
ちなみにこの項目は完全に蛇足な上にグレーな記載なので関係各所から刺されたらここの項目をまるっと消します。
出会えなかった怒りからか出会い系アプリをリバースエンジニアリング #iotlt pic.twitter.com/kZr6NiDQ87
— shanon (@shanonim) 2016年12月7日
ちなみに普段アプリなどは触らないでリバースエンジニアリングって違法じゃないの?って思いつつ調べてたらリバースエンジニアリングをすること自体は違法では無いっぽいですね。
ということでAndroidアプリのリバースエンジニアリングをやってみた
Androidリバースエンジニアリング(apkからjavaソースコードとasset取り出し)この記事を参考に、ソースコードを読めるレベルまで持っていきます。
流れとしては.apk -> .dex -> .jar -> .class -> .jad
という流れで.jadまで変換させるとソースコードが読めるようになります。
1. .apk
を抽出
などのツールを使うと.apkファイル
を抽出することができます。
2. .apk
から.dex
を抽出
.apk
の正体はzipファイルなのでunzipコマンド
で解凍しましょう。
$ unzip CROSS\ ME\ すれ違いを恋のきっかけに.apk
$ ls
AndroidManifest.xml classes2.dex
CROSS ME すれ違いを恋のきっかけに.apk fabric
META-INF jsr305_annotations
assets lib
build-data.properties res
classes.dex resources.arsc
解凍するとclasses.dex
とclasses2.dex
の.dexファイル
とその他フォルダやファイルが出て来ました。
3. .dex
から.jar
に変換
dex2jar
というツールを使い.dex
から.jar
を復元します。
まずはhomebrewでインストールしましょう。
$ brew install dex2jar
これでd2j-dex2jarコマンド
が使えるようになります。
参考記事だと
dex2jarコマンド
となってましたが、僕の手元だとd2j-dex2jarコマンド
でした。
$ mkdir jaroutput
$ mv classes.dex jaroutput
$ cd jaroutput
としてjaroutputフォルダ内で作業しました。
$ d2j-dex2jar classes.dex
dex2jar classes.dex -> ./classes-dex2jar.jar
これで.jar
ファイルまで復元ができました。
4. .jar
から.class
を抽出
.jar
も正体はzipファイルらしいのでunzipで展開します。
$ unzip classes-dex2jar.jar
$ ls
android classes-dex2jar.jar io okhttp3 retrofit
bolts classes.dex jp okio retrofit2
butterknife com me org
こんな感じで展開されました。
各フォルダ内を除くと.classファイル
が確認できます。
5. .class
から.jad
に変換
最終ステップです。
jadコマンドをインストール
$ brew tap homebrew/binary
$ brew install jad
jadコマンドで変換をかけていきます。
$ jad ./*/*.class
途中で出て来る質問は全てyで通ります。
これでついにソースコードを確認できました。
今回初めてやってみたんですけど、アプリのソースコードって難読化しないとマジでやばいですね。
アプリ開発者の皆さんすごいです。
以下、コードのスクショ
完全に出すとアレかと思うので、一部抜粋&トリミングしてます。
- 内部APIっぽい記述発見
- この辺もあやしい
- パッケージ名などは把握できた
- findMatchingPinsメソッドで周辺にいる人とのマッチングをやっている(ような気がする)
まぁ結局難読化コードを読めずにここまでです苦笑
リバースエンジニアリングの結論
何も分からなかった。
難読化されてるコードを解読は体力的にもスキル的にも厳しかったです。
本当は、ポケモンGoハックっぽいことしたかったです笑
IoTを絡めて自分でCROSS MEっぽいものを作ってみます
さて、リバースエンジニアリングの項目は割となくても問題ないので本題に戻りましょう。
正直な話をすると「リバースエンジニアリングしたけどなんも分からんかった」くらいでやめようか悩みましたが何もしてないのは流石にって思った次第です。
……ということで(謎)
CROSS MEでカノジョはできてないので、IoT絡めて自分でCROSS MEっぽいものを作ってみます。
作るもののイメージ
今回は、近くで(WioNodeで)IoTをやってる人とクロスできる仕組みを考えてみます。
分かりますでしょうか。近くでIoTやってる人が多ければ多いほど、LED Barが反応する仕組みです。
近くでIoTやっていました、それは既に関係者ではw #iotlt
— furufuru (@furufuruX10) 2016年12月7日
ただ、今回GroveGPSモジュールが用意できなかったのでGPS取得だけスマホ/PCで代替です。
実際にうごいてるもの(GIF)と構成
分かりにくいかもしれませんが、こんな感じになります。
近くでIoTやってる人がいればいるほどLED Barの光の数があがっていってドキドキする体験(謎)を味わえます。
実際は以下のような構成で、サーバーに設置したNode.js側で
- 二点間距離 : [JAVASCRIPT] JSで二点間の距離計算をする関数
- コネクション数(socket.io): Socket.io (v1.2)の同時アクセス数を取得するミニマム構成とSocketの中身
などを計算しています。(↑のソースコードが調べて出て来たのですがどちらも自分の過去記事でびっくりでした。)
WioNodeとNode.js側とつなぐ部分
WioNodeをアプリに連携するだけでWebAPIとしてセンサーたちにアクセスできるようになります。
例えば、以下を叩くとLED Barの光が0になる、みたいなコードが生成されてあとは叩くだけの状態になるのでかなり手頃です。
$ curl -k -X POST https://us.wio.seeed.io/v1/node/GroveLEDBarUART0/level/0\?access_token\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
こんな感じでNode.js側から呼び出してあげればすぐに独自のWebシステムと連携できますね。
サクッと試すためにhttpsモジュールではなくexecを使ってます。
const exec = require('child_process').exec;
function wionode(count){
let cmd = `curl -k -X POST https://us.wio.seeed.io/v1/node/GroveLEDBarUART0/level/${count}?access_token=xxxxxxxxxxxxxx`;
exec(cmd, function (error, stdout, stderr) {
if(stdout){
console.log('stdout: ' + stdout);
}
if(stderr){
console.log('stderr: ' + stderr);
}
if (error !== null) {
console.log('Exec error: ' + error);
}
});
}
このwionode()に同時接続数を渡してあげれば、そのときに近くにいる人の数とLEDが連動してくれます。wionode(socket.client.conn.server.clientsCount)
などの呼び出し方になります。
終わりに
謎ですが、こんな感じでIoTでクロスする仕組みを作ることができました。
ちょっと途中文章がだれてしまってる感がありますがCROSS MEからIoTハックネタに繋げたらこんな感じになりました。
今回アドベントカレンダーの担当日とIoTLTが同じ日になってしまって計画性のなさを感じています苦笑
(そこからくるゴリ押し感もあるかもしれません。)
今回言いたかったことは
- CROSS MEで退会された話はガチ
- CROSS MEっぽい仕組みもWioNodeで作れそう
- (リバースエンジニアリングは悔しかった試行錯誤)
- WIoNodeのAPIがひたすら楽なのでIoTやるにはオススメ -> 購入ページ
- カノジョできない
って感じです。
ちなみに 来年1発目のIoTLTは1/25に、なかなか使えないソフトバンク本社で開催です。
こんな感じのゆるい話も多いので来たことがない方がいたら遊びに来てください~