LoginSignup
48
16

More than 5 years have passed since last update.

「CROSS ME使ったら相手に退会された話」からIoTでCROSS MEする仕組みを考えた #iotlt

Last updated at Posted at 2016-12-07

こんにちは、カノジョできないエンジニアの@n0bisukeです。

正直カノジョできないエンジニア Advent Calendar 2016の期待値が高すぎてどうしようかとけっこう直前まで悩んでましたが、先ほどの#IoTLTで発表してきました。ツイートまとめもあります。

「CROSS ME使ったら相手に退会された話」からIoTでCROSS MEする仕組みを考えた #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を探れないか試してみました。

ちなみにこの項目は完全に蛇足な上にグレーな記載なので関係各所から刺されたらここの項目をまるっと消します。

ちなみに普段アプリなどは触らないでリバースエンジニアリングって違法じゃないの?って思いつつ調べてたらリバースエンジニアリングをすること自体は違法では無いっぽいですね。

ということで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.dexclasses2.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ハックっぽいことしたかったです笑

Pokemon GOで近くにポケモンが出たらPepperが教えてくれる仕組みをNode.jsだけで作る

IoTを絡めて自分でCROSS MEっぽいものを作ってみます

さて、リバースエンジニアリングの項目は割となくても問題ないので本題に戻りましょう。

正直な話をすると「リバースエンジニアリングしたけどなんも分からんかった」くらいでやめようか悩みましたが何もしてないのは流石にって思った次第です。

……ということで(謎)
CROSS MEでカノジョはできてないので、IoT絡めて自分でCROSS MEっぽいものを作ってみます。

作るもののイメージ

今回は、近くで(WioNodeで)IoTをやってる人とクロスできる仕組みを考えてみます。

分かりますでしょうか。近くでIoTやってる人が多ければ多いほど、LED Barが反応する仕組みです。

ただ、今回GroveGPSモジュールが用意できなかったのでGPS取得だけスマホ/PCで代替です。

実際にうごいてるもの(GIF)と構成

分かりにくいかもしれませんが、こんな感じになります。

近くでIoTやってる人がいればいるほどLED Barの光の数があがっていってドキドキする体験(謎)を味わえます。

実際は以下のような構成で、サーバーに設置したNode.js側で

などを計算しています。(↑のソースコードが調べて出て来たのですがどちらも自分の過去記事でびっくりでした。)

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を使ってます。

app.js
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に、なかなか使えないソフトバンク本社で開催です。

https://iotlt.connpass.com/event/45884/

こんな感じのゆるい話も多いので来たことがない方がいたら遊びに来てください~

48
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
16