AndroidとiOSのLINEのデータベースの比較 トーク編
軽い気持ちでiPhoneからAndroidにLINEのデータ移行しようと思ったら無理でした。
まずデータベースの構造が全然違いました。
トーク画面のトークデータベース部分のAndroid,iOSの対応表を作りましたが飽きたのでこれ以上やるつもりないです。
どこかの会社が移行ソフトウェア作ってないのかな?
重要そうなカラムだけです。
各カラムが対応しています。
()でくくられているものはテーブル名です。
[]でくくられているものは別テーブルのデータを参照しています。
[ZSENDER]なら、ZSENDERテーブルのデータが対応しています。
ZSENDER,ZLATITUDEの内容は以下を見てください。
Digital Forensic Artifacts Research: Forensic artifacts in LINE instant messaging app (iOS version)
iOS | Android |
---|---|
(ZMESSAGE) | (chat_history) |
Z_PK | id |
Z_ID | server_id |
ZSENDSTATUS | type |
[ZSENDER] | chat_id |
[ZLATITUDE] | from_mid |
ZCHAT | conetnt |
ZTIMESTAMP | created_time |
? | deliverd_time |
Z_OPT | status |
? | sent_count |
ZREADCOUNT | read_count |
カーネルコンパイル時に 「 cc1: error: unrecognized command line option」エラーが出て停止
FreeBSD9.3からFreeBSD10.0にアップグレードしたあと、カスタムカーネルをコンパイルする時、
cc1: error: unrecognized command line option "-mno-aes" cc1: error: unrecognized command line option "-mno-avx" cc1: error: unrecognized command line option "-Wno-error-tautological-compare" cc1: error: unrecognized command line option "-Wno-error-empty-body" cc1: error: unrecognized command line option "-Wno-error-parentheses-equality" *** Error code 1 Stop. make[2]: stopped in /usr/obj/usr/src/sys/VIMAGE *** Error code 1 Stop. make[1]: stopped in /usr/src *** Error code 1 Stop. make: stopped in /usr/src
というエラーが出ました。
コンパイラのcc1に問題があるようです。
The FreeBSD Forums • View topic - build kernel fail
この記事を参考に、
/etc/make.confに
CC=clang CXX=clang++ CPP=clang-cpp
を追加して再度カーネルコンパイルし直すと、コンパイラがclangになるのでエラーが発生しなくなりました。
以上。
LINEアプリのスタンプダウンロードについて解析してみる
私のウェブサイトにたどり着く検索ワードに、「LINE 解析」など、LINE関係の解析について知りたい方が多いようです。
ですので今回はLINEのスタンプについて書いていこうと思います。
iPhone版のアプリが、どうやってスタンプをダウンロードしているかです。
今回はアプリがサーバからスタンプをダウンロードし、フォルダに保存をするところまでをパソコン上でやります。
なお、アプリの逆コンパイルは禁止されている上に技術的にもそんなことできないので、
恐らくアプリはこうやってダウンロードしているんだろうなあ、という推定になります。
前提知識:スタンプフォルダの構成
自分の持っているスタンプのIDを特定
[LINEのフォルダ]/Library/Application Support/Sticker Packagesを開いてください。
"*1.*2.linestk"の、*1の部分がスタンプIDになります。
スタンプフォルダの構成
この画像を見てください。
ID:2431のフォルダの中に、
"*_key@2x.png"
"*@2x.png"
"productInfo.plist"
"tab_off@2x.png"
"tab_on@2x.png"
があります。
このファイル達は様々なタイプの画像になっています。
"*_key@2x.png"はトーク画面内のスタンプを選択した時の確認画面の画像
"*@2x.png"はスタンプの画像
"productInfo.plist"はスタンプの名前、値段などの情報
"tab_off@2x.png"は、トーク画面のスタンプ一覧で選択していない時の白黒画像
"tab_on@2x.png"は選択している時のカラー画像
また、LINE公式サイトからもスタンプのIDを特定できます。
LINE STOREに飛びます。
調べたいスタンプのURLにIDがあります。
アナと雪の女王のスタンプをダウンロードする
実はスタンプ達は購入しなくても誰でもダウンロードができるのです。
今回はスタンプID:2046の「アナと雪の女王」をダウンロードしていこうと思います。
burpsuiteでHTTPの盗聴をしながらスタンプショップの「アナと雪の女王」のスタンプ情報を見ると、
ttp://dl.stickershop.line.naver.jp/products/0/0/1/2046/iphone/productInfo.meta
にアクセスしていることが確認できます。
productInfo.metaの中身は以下のようになっています。
{"packageId":2046,"onSale":true,"validDays":0,"title":{"en":"Frozen","es":"Frozen","in":"Frozen","ja":"アナと雪の女王","ko":"겨울왕국","th":"Frozen","zh-Hans":"冰雪奇缘","zh-Hant":"冰雪奇緣"},"author":{"en":"The Walt Disney Company (Japan) Ltd.","ja":"ウォルト・ディズニー・ジャパン(株)","ko":"The Walt Disney Company (Japan) Ltd.","zh-Hans":"The Walt Disney Company (Japan) Ltd.","zh-Hant":"The Walt Disney Company (Japan) Ltd."},"price":[{"price":100.00,"symbol":"NLC","currency":"NLC","country":"@@"},{"price":15.00,"symbol":"HK$","currency":"HKD","country":"HK"},{"price":200.00,"symbol":"¥","currency":"JPY","country":"JP"},{"price":2000.00,"symbol":"₩","currency":"KRW","country":"KR"},{"price":2.58,"symbol":"S$","currency":"SGD","country":"SG"},{"price":60.00,"symbol":"NT$","currency":"TWD","country":"TW"},{"price":1.99,"symbol":"$","currency":"USD","country":"US"}],"stickers":[{"id":42836,"height":161,"width":170},{"id":42837,"height":151,"width":150},{"id":42838,"height":151,"width":159},{"id":42839,"height":151,"width":170},{"id":42840,"height":151,"width":160},{"id":42841,"height":150,"width":167},{"id":42842,"height":152,"width":165},{"id":42843,"height":161,"width":162},{"id":42844,"height":151,"width":174},{"id":42845,"height":151,"width":166},{"id":42846,"height":151,"width":182},{"id":42847,"height":161,"width":142},{"id":42848,"height":155,"width":166},{"id":42849,"height":161,"width":170},{"id":42850,"height":161,"width":170},{"id":42851,"height":151,"width":160},{"id":42852,"height":161,"width":130},{"id":42853,"height":151,"width":159},{"id":42854,"height":140,"width":185},{"id":42855,"height":142,"width":183},{"id":42856,"height":161,"width":167},{"id":42857,"height":152,"width":160},{"id":42858,"height":125,"width":179},{"id":42859,"height":151,"width":159},{"id":42860,"height":161,"width":183},{"id":42861,"height":156,"width":171},{"id":42862,"height":161,"width":130},{"id":42863,"height":151,"width":160},{"id":42864,"height":161,"width":160},{"id":42865,"height":161,"width":134},{"id":42866,"height":160,"width":159},{"id":42867,"height":151,"width":150},{"id":42868,"height":150,"width":149},{"id":42869,"height":152,"width":114},{"id":42870,"height":151,"width":160},{"id":42871,"height":161,"width":169},{"id":42872,"height":161,"width":162},{"id":42873,"height":133,"width":186},{"id":42874,"height":161,"width":157},{"id":42875,"height":159,"width":184}]}
順に見ていきましょう。
packageId:このスタンプのID
onSale:購入可能状態か
valieDays:有効期限
title:各言語(英語、日本語、韓国語、繁体字、簡体字)
price:各国の料金
stickers:スタンプ画像IDがスタンプの数だけあります。
このstickersのスタンプ画像IDは、例えば一番初めの画像ID、42836だと、
ttp://dl.stickershop.line.naver.jp/products/0/0/1/2046/PC/stickers/42836.png
ttp://dl.stickershop.line.naver.jp/products/0/0/1/2046/PC/stickers/42836_key.png
以上のように表示できます。
tab_off@2x.png、tab_on@2x.pngもダウンロードできます。
ttp://dl.stickershop.line.naver.jp/products/0/0/1/2046/android/tab_on.png
iPhoneのLINEアプリのスタンプフォルダの形式そのままにする
今までのURLを駆使して、2046.1.linestkフォルダを作成し、その中に
全ての*_key@2x.png、*@2x.png、tab_off@2x.png、tab_on@2x.pngをダウンロードし
そして最後に、productInfo.metaをproductInfo.plistに変換すれば、iPhoneのLINEアプリのスタンプフォルダそのままになります。
肝心のproductInfo.plistはどうすればいいでしょうか。これはMaxOSX版の独自の形式で、productInfo.metaそのままではありません。
というわけで作りました。
productInfo.metaからproductInfo.plistに変換するrubyスクリプトです。
gemでcfpropertylistを入れてください。
#!/usr/local/bin/ruby # -*- coding: utf-8 -*- require 'json' require 'net/http' require 'uri' require 'cfpropertylist' id = ARGV[0] stdir = "#{id}.1.linestk" plist = CFPropertyList::List.new plistName = "productInfo.plist" url = URI.parse("http://dl.stickershop.line.naver.jp/") res = Net::HTTP.start(url.host, url.port) {|http| http.get("/products/0/0/1/#{id}/iphone/productInfo.meta") } js = JSON.parse(res.body) data = Array.new sp = Hash.new js.each do |param| data << param end data.each do |line| if (line[1].class == Array || line[1].class == Hash) then hashs = Hash.new line[1].each do |value| hashs.store(value[0],value[1]) end end sp.store(line[0],line[1]) end plist.value = CFPropertyList.guess(sp) plist.save("#{plistName}", CFPropertyList::List::FORMAT_BINARY)
引数にスタンプIDを入れれば、カレントディレクトリにproductInfo.plistが作成されます。
そしてそれを2046.1.linestkの中に入れれば、このスタンプを買った時と同じ構成のフォルダができあがります。
以上でLINEアプリがスタンプをダウンロードしている仕組みとなっています。
インターネット上の不特定多数が見られる場所にこうやって著作物を置いていて、ちょっと怖いですよね〜
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
追記
これを全て自動でダウンロードするスクリプトを作成しました。
ruby1.9で動きます。また、gemでcfpropertylistを入れてください。
使用する際は引数にスタンプIDを入れてください。
夏のmixi Scrap Challenge 2014が開催されるので今年1月に開催したScrap Challenge2013でやったこと書く
夏のmixi Scrap Challenge2014が開催されるようです。
Scrap Challenge 2014 | 株式会社ミクシィ 学生向けエンジニアイベント
これに合わせて、放置していた 今まで温めておいたメモを書き起こし、記事を公開します。
結論から言うと、めちゃくちゃ楽しかったので行かなきゃ損です。
皆さんにはmixi Scrap Challengeに興味を持っていただき、大学3年生以下の方々にはぜひ参加していただきたいです。
応募のきっかけ
このイベントが開かれた年度にはセキュリティキャンプ2013中央大会に参加しており、私はネットワークセキュリティクラスだったんですが、
Webセキュリティクラスに凄くキャラが濃くてXSSヤバイ八木なんとかさんがいたのがキッカケで私もWebセキュリティに興味を持ち、
9月からちょいちょい勉強していた時にこのイベントのことを知ったからです。
また、mixiのサービスの脆弱性を報告して10万円貰ったこともあり、mixiについて良く知りたかったのもあります。
地方の貧乏学生の私には交通費が半額でたのも最高でしたね。
やったこと
概要
午前中の講習は、新卒の新人教育の2(3)日間のセキュリティ講習を、ぎゅっと30分に詰め込んだもの。
午後にScrap Challengeを行い、優勝者にはトロフィーを進呈。最後に懇親会を行う。
午前(前半)
講習を受けながらメモをしたので間違っているかもしれませんが勘弁してつかあさい。
mixiが被害を受けた数々のセキュリティインシデント
・はまちちゃん
・ソースコード流出
・メールアドレスをID紐付け事件
この3つのセキュリティインシデントは元々知っていた。
オススメ文献の紹介
安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構
SBクリエイティブ:体系的に学ぶ 安全なWebアプリケーションの作り方(徳丸本)
午前(後半)
CSRF
mixiモールにログイン中、メールで送られてきたURLをクリックしただけで徳丸本の注文が完了するなど
入力、確認、官僚的なフローのページ群ならば、完了のページのみ対策が必要
対抗策→セッション、hiddenパラメータ、POST専用にする、直前ページにパスワード入力を促す
SQLインジェクション
sql="select from users where name = {$name} amd pass={$pass};
対抗策→プレースホルダ(バインド機構、プリペアドステートメント)(厳密には異なる)
kvsやnosqlに対するインジェクション
memcachedや他のkvs、nosqlについてもsqlインジェクションのような攻撃がありうる
memcachedは正しいエスケープを行わないといけないため対策が難しい
オープンリダイレクタ
・http locationヘッダ
htmlのmeta要素
参考文献→徳丸本p184
脅威→フィッシング
対抗策→リダイレクト先を固定、外部からURLを指定できる仕様を改める、リダイレクト先のドメインを固定にする
httpヘッダインジェクションは防げない場合がある(0x0D0x0A)
午後(Scrap Challenge)
Scrap Challengeのためにわざわざ用意された脆弱性付きのmixiに好き放題ハッキングできます。
-
-
- -
-
3人一組でチームを組んでやりました。
Scrap Challengeの問題は午前中に講師の方から教えてもらった脆弱性を突くものしかありませんでした。
といっても午前中の講習はたった30分のみなので、習ったからといって解ける問題ではなく、ノー勉で行くと人権が無くなるので気をつけてください。
まあキャンプ終了後適当に4ヶ月しか勉強していない俺でも行けたので気張らなくてもいいです。
ネタバレしちゃうと今回応募する人がつまらなくなってしまうのでチュートリアル問題だけ。
問題例 -チュートリアル-
000 ( 0pt )
プロフィール(show_profile.pl)のXSS脆弱性を利用して、開くと任意の文字列がアラートされるようなURLを鴨ネギ-男に送ってください
結果
なんとか優勝できました。チームにSQLインジェクション神の子がいたため、2位以降と大きな差をつけて勝てました。感謝。
優勝したチーム全員にトロフィーが貰えます。
こんなやつです。スゲーかっこいい。
懇親会
最後に懇親会をしました。
こんなにあるのかい!!!! #mixi_scrap @mixi_engineer pic.twitter.com/1FrKwT03Ha
— Scratch.ごっち (@gggooottto) 2014, 1月 18
懇親会。人数の割りにお酒の量おかしい #mixi_scrap pic.twitter.com/W1aoG4bes0
— しゅーと (@shutingrz) 2014, 1月 18
お酒の量、寿司の量、お菓子の量、mixiからもらったアメニティの量、全てが半端無かったです。
余ったやつは好きに持ち帰って良かったので貧乏学生の俺はいっぱいいただきました。
感想
優勝出来て良かったです。
また、私の場合なんですが、大学3年生の1月にこのイベントがありまして、その後2月にこの御縁で人事の方から採用面接のお誘いをいただき、
書類選考、集団面接、人事面接を全て受けずに(スキップし)、技術者面接から選考を受けてほしいと言われました。
インターンはその企業の選考に有利になるという噂は聞いていましたが、まさかここまで飛び級で面接が受けられるとは・・・。
結果から言えば役員面接も通って内々定をいただくことができました。
(ですがすみません私が就職予定の会社はmixiではありません。本来私が志望していたネットワークセキュリティ業界の企業になります。)
人事の方もとてもいい方ばかりでした。就活している中で一番親身になってくれたかも?
このように就活を控えている大学生3年生以下の皆さんも受けてみるといいかも知れません。
開催日時は、
2014年8月23日(土) 11:00-19:00 で、
応募締め切りは、
2014年8月14日(木) 23:59です。
関東圏外の地方の方は交通費が半額出ます。
また、最後になりましたが、mixiの方々、本当にありがとうございました。
FreeBSDのカスタムカーネルをインストールメディアにする。
記事の最後に、Jail + VIMAGEを手っ取り早く触るための私が作成した
vimageカーネル版FreeBSD-9.3-VIMAGE-amd64-disc1.isoへのリンクをつけます。
Jailの真の実力はやはり、VIMAGEを使ってこそでしょ!ということで
VIMAGEを色々なマシンに入れたいのですが、デフォルトのカーネルでは有効になっていません。
ですので複数台のPCを手っ取り早くVIMAGE仕様にするためにカスタムカーネルをインストールメディアにします。
色々カスタマイズはできるのですが、今回は早く簡潔にリリースできることを目標にします。
カスタムカーネルを作成する
カスタムカーネルを作成しましょう。
FreeBSDインストール時に、srcもインストールしたならば、/usr/src/に色々srcがあるはずです。
ここで、自分がインストールしたアーキテクチャによってディレクトリパスが変わります。
今回はamd64だと仮定しましょう。
/usr/src/sys/amd64/conf/GENERICを編集します。
(本来ならばカスタムカーネルは別ファイルに作成するのが主流なのでしょうが、make releaseの簡潔さを重視してGENERICに追加していきます。)
今回はJail+VIMAGEを実現するために最低限必要なVIMAGE、
そしてファイアウォールとしてipfwを用いるためIPFIREWALLとその他のオプション、
Jailのリソース管理をするためにRCTLとその他のオプションを入れます。
末尾に、
options VIMAGE options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=1000 options IPFIREWALL_DEFAULT_TO_ACCEPT options RACCT options RCTL
を追加します。
IPFIREWALLの4行については15.7. ファイアウォールを、
RCTL,RACCTについては自由な設定が可能な最新リソース制御機能(1/2) − @ITを参照してください。
記述したあとはついにコンパイルです。
/usr/srcに移動し、
make buildkernel
を入力し、コンパイルをします。時間がかかります。
これが終わりましたら、次はリリースの為にworldをコンパイルします。
make buildworld
を入力し、コンパイルをします。とても時間がかかります。
これが終わりましたら次はついにリリースをします。
インストールメディアを作成(リリース)する
/usr/src/releaseに移動します。
ここで、make releaseをするのですが、オプションが色々あります。
詳しいことはrelease(7) manページを参照していただくとして、
この記事ではスピード重視なので、簡単にすませていきます。
/use/src/releaseで、
make release BUILDNAME=[バージョンの名前。unameを参考に] MAKE_ISOS=1 NOPORTS=1
を入力し、リリースをします。今回私が作成したバージョンはFreeBSD-9.3なので、
make release BUILDNAME=9.3-VIMAGE MAKE_ISOS=1 NOPORTS=1
としました。
MAKE_ISOSを入れるとisoファイルが作成されます。
PortsCollectionはインストール後に各自更新すると思うのでNOPORTSを入れ、リリースに含まれないようにします。
リリースが終わったら、/usr/obj/usr/src/releaseに移動します。
そこに、disc1.isoがあると思います。これが今回作成したインストールメディアになります。
お疲れ様でした。
最後に、私が作成したFreeBSD-9.3-VIMAGE-amd64-disc1.isoをアップロードしておきました。
これをダウンロードしインストールすればすぐにJail + VIMAGEが楽しめます。
http://www.shutingrz.com/iso/FreeBSD-9.3-VIMAGE-amd64-disc1.iso