むらかみの雑記帳

Android とか iOS とかソフトウェア開発に関するネタ帳

LifeTouch L 用 ADB ドライバ

LifeTouch シリーズの Windows 用 ADB ドライバの情報はここに書いてあるが、LifeTouch L 用の記載がまだない。ので、自分で調べた。

GoogleAndroid SDK で配布している USB ドライバの android_winusb.inf ファイルをテキストエディタで編集。[Google.NTx86] と [Google.NTamd64] の各セクションに以下の3行を追加すればよい。

;LifeTouch L
%SingleAdbInterface%    = USB_Install, USB\VID_0409&PID_032F&REV_0216&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_0409&PID_032F&MI_01

海外からの配信に消費税を課税することを検討する模様

今日の日経の1面トップに 海外からの配信に消費税、財務相が検討表明 という記事が。早ければ 2014年4月の消費税増税と同時に実施って、こういうときだけやけに仕事早いなおい。

ちょうどこれに近い内容に関して某記者さんと先日お話をさせていただいたところだったので、自分的には大変タイムリーな話題。楽天あたりが海外の Kobo 社を買収して、海外からコンテンツを配信することで消費税を回避しようとしているようで、そういうことになったらご愁傷さまです。

海外の事業者に一体どうやって納税義務を果たさせるのか非常に興味深いところです。Google Play でEU向けに有料販売するときの VAT の扱いについて にも書きましたが、EU も VAT で同じことをやっていて、EU外からEU域内にデジタルコンテンツを販売するときには課税しているので、やってやれないことはないはずです。すんげえ面倒くさそうですが。

たぶん海外の事業者には、日本に対して消費税納税事業者登録みたいなことをさせて VAT Registration Number ならぬ JCT Registration Number なんかを発行したりして、Invoice にはこの番号書いてねーんみたいなことにして、だけども Google Play が発行する領収書には当然この番号が書いてないから、海外の事業者はせっせと自分で Invoice を発行しなくちゃいけないんだけども、Google Checkout API が提供されてないから自動化できなくてどうすんだよウワァァン、もう消費税なんて徴収しないし納税しないし知らない!なんて事業者がわんさか出てくるのが目に見えるようで、もう今から目頭が熱くなります。わかりにくいネタですいません。

まぁ、VAT の場合も、年間 EUR10,000 くらいの売上なら VAT 免税にしているようなので、小規模な事業者は免税とかにするのではないかと想像しています。何しろ、国内の事業者だって年間売上1,000万までは免税事業者ですし。そもそも、この海外配信に消費税を課税するのは、先の楽天のように海外に事業を移転して消費税を回避しようとしている事業者とか、Amazon みたいなかなり大規模な事業者をターゲットとしていると思われるので、中小事業者は Out of 眼中なのではないかと。だいたい小規模な事業者が EU みたいな VAT 登録なんて面倒くさくてやれんと思います。

海外には普通に考えて法的な強制力が及ばず実効性がどのくらいあるのか疑問なので、いっそ米国の輸出規制法(EAR)みたいに違反者を Denied Person List(禁止顧客リスト)に載せてその事業者と取引した国内事業者に罰則かけるといういわゆる「域外適用」をやってみたらいいんじゃねとふと思いつきました。だけど、あれは米国のように強い立場だからできる話なので、日本だと難しいだろうし、他にもいろいろ面倒だからやっぱ却下。

その一方で、国内の事業者としてはこれは歓迎するでしょうね。今のまま消費税増税になったら、ただでさえ円高で相当なハンデを負っているのにさらに追い打ちをかけることになってしまいますので。

どうでもいいけど、例の記事についてるはてなブックマークとか 2ch の投稿みてると、消費税の仕組みを全然わかってない人が大半で、愕然とします。消費税は事業者じゃなくて消費者が負担するものであるという根本的なところがわかってないとか、そもそも直接税と間接税の違いがわかってないとか。自分達消費者が納税者なんだから、もうちっと消費税のこと勉強しとけよ、と思うんですがね。あといまだに輸出戻し税が云々言う奴はあとで職員室に来なさい。

Anti AntiLVL - AntiLVL への簡単な対抗方法について考えてみる

故あって、Android の LVL を無効化する「AntiLVL」の対抗策を検討していたりします。

LVL (License Verification Library) は Google が提供する Android のライセンス検証用のライブラリで、簡単にいうと Google Play でちゃんと購入されたアプリかどうかをサーバに問い合わせて確認するというライブラリです。AntiLVL は、APK ファイルを書き換えてLVL を無効化してしまうというツールで、Google Play で有料アプリを購入してすぐに APK を取り出して注文キャンセルし LVL を無効化してしまえば不正にアプリを利用できるというわけです。そんなことする不届き者はとっとと氏ねばいいのにと思うわけですが。

AntiLVL での LVL 解除は非常に簡単にできてしまうので開発者としては何らかの対策が必要です。

署名検証すれば良いのでは?

AntiLVL は、APK を分解してデコンパイルし、バイトコードにパッチを当てて再度 APK に戻すことで LVL を解除しています。

APK の内容を改竄するので、当然開発者とは違う証明書で APK に署名することになるわけです。したがって、PackageManager を使って署名を確認し改竄されていないか確認すれば良さそうな気がしますよね。

ところが、AntiLVL は PackageManager を差し替えて署名を偽装するのでこれは容易ではありません。PackageManager を直接使わずリフレクション使えばいいじゃんと思うわけですが、AntiLVL はリフレクションの Method#invoke もフックするためこれもダメです。

JNI で native コードを書くか、jar ファイルをパッケージの中に入れておいて自前でクラスロードすれば回避できると思いますが、かなり面倒です。そこでここでは、署名検証せずに AntiLVL を回避する方法について考えてみます。

AntiLVL はどうやって LVL を解除しているのか

AntiLVL 1.4.0 の場合、LVL に含まれる ServerManagedPolicy と LicenseValidator の2つのクラスにパッチを当てています (これは AntiLVL の jar をバラして得られる XML ファイルにルールが書いてあります)

まず、ServerManagedPolicy の方。こちらは allowAccess() メソッドの返り値を強制的に true に変更します。具体的には、以下のようにしてパッチを行います。

  • 以下の条件のいずれかを満たすクラスは、ServerManagedPolicy クラスと判断します (他にもいくつか条件があるが省略)
    • "com.android.vending.licensing." という文字列が含まれる
    • "ServerManagedPolicy" という文字列が含まれる 
    • "validityTimestamp" という定数文字列が含まれる
  • この中に、以下のメソッドがあれば allowAccess() と判断します
    • public なメソッド
    • System.currentTimeMillis() を呼んでいる

LicenseValidator のほうは、verify() メソッド内の switch - case 文を書き換え、全部 LICENSED と判定するようにします。具体的には:

  • 以下のようにして verify() メソッドを探します。
    • メソッドのシグニチャが public * (java.security.PublicKey, java.lang.String, java.lang.String) というメソッドを探します
  • メソッド内の switch - case 文を書き換えます
    • java.security.Signature.getInstance() を呼び出していることを確認します。
    • このメソッドの中の switch 文内の case 節を書き換えます。

対策方法

ここまでわかれば、対策としては比較的簡単です。やり方はいくつかありますが、例えば以下のようにすればよいでしょう。当然 ProGuard の難読化は必要です。

  • ServerManagedPolicy クラスは
    • 文字列定数の PREFS_FILE, PREF_VALIDITY_TIMESTAMP を違う文字列に変更します (変更しても動作には影響ないはず。詳細はソース参照)
    • allowAccess() は System.currentTimeMillis() を直接呼ばず、別のメソッドを経由して呼ぶように変更
  • LicenseValidator クラスは
    • verify メソッドの switch - case 文を if 文に変更します。

とりあえず、この修正を加えれば AntiLVL は効かなくなります。

また、AntiLVL を罠にかけるために、わざと AntiLVL が書き換えるようなコードを仕込んでおくという手もあります。上記 ServerManagedPolicy そっくりのクラスを作っておき、allowAccess は必ず false を返すようにしておきます。AntiLVL で書き換えた APK では allowAccess の返り値が必ず true になるので、true になっていれば AntiLVL により書き換えられたことが判別できるので、ライセンス違反と判定すればいいでしょう。

いたちごっこなので AntiLVL 側がさらに対策してくる可能性もありますが、そもそもの問題はみなが同じ LVL ライブラリを使っていることが問題なので、みなが少しずつ違う実装にしていれば AntiLVL 側では対処できなくなるはずです。

PS. CashFlow は対策済みです。

Google Play の取引手数料が税込価格の30%にこっそり変わってる件 (修正済)

補足: 本問題は 7/17 に修正されました。詳細は追記参照。

先月 5/23日より、Google Play の価格表示が税込価格に変更になりました。これは前々回のブログに書いたとおりで、ちゃんと総額表示できるようになったので歓迎すべき修正です。

んが、実はそれと同時に30%の取引手数料もこっそり変更されてました。従来は「税抜き価格の」30%だったんですが、これが「税込価格の」30% になっています。つまり、実質取引手数料が 5% 値上げ。Google さん、何も言わずにこんな重要な変更も一緒にやるなんて、冗談きついです。英語のヘルプには今でもしっかり税抜き価格 (Net price) の30%って書いてあるのにー。

Google Checkout の明細の抜粋はこんな感じ。

f:id:tmurakam:20120606004022p:plain

左が5/22より前、右が5/22以後の明細です。税込価格表示記念(なんの記念だ)で値下げをしたので比較しにくいですが、以前は税抜価格 230円の30% = 69 円が手数料だったのですが、5/22以後は税込価格 210 円の 30% = 63 円が手数料となっております。

で、税込価格から手数料とるんだから、当然手数料には消費税入ってるんだよね、とか思うわけですが、明細にはその消費税額は記載されていません。どっちだよ!!まぁ、記載されていない以上は、税込ではない(つまり以前の記事にも書いたとおり不課税取引)として扱うしかないでしょうね。つまり実質手数料値上げというわけです。

んもう。。。

 

ちなみに、海外でも問題になっている模様 ⇒ Transaction fees calculated false from today on!!! 

 

'12/6/18 追記 : どうやら Google 側のシステムの問題だった模様。Developer Console に以下の告知がでており、早急に修正して返金するとのことです。

Errors in transaction charges due to VAT-inclusive pricing
We are aware of the reports of errors in transaction charges due to VAT-inclusive pricing and are working to resolve the issue. Once the problem is fixed, the correct amounts will be charged for VAT-inclusive purchases and we will reimburse any developers who have been impacted as soon as possible.

 

'12/7/31 追記 : 計算方法が無事に元に戻りました。7/17に修正がされたようです。⇒ https://groups.google.com/forum/?hl=ja&fromgroups#!topic/android-sdk-japan/k6DVm0LhmZE

はてなブログに移行しました

はてなダイアリーからはてなブログへの移行ができるようになり、しばらくは他の人の様子をみてからにしようかとも思ったのですが、ええいままよとばかりに移行してしまいました。

コメントとかは当然として、はてなブックマークとか、旧URLからのリダイレクトとか、まるごと移行できるのは良いですね。

 はてなダイアリーよりは記事は書きやすくなった、、、ような気がします。もうちょっと使い込んでみないとわからないけど。

 

三菱東京UFJが OFX の出力機能を無くした模様

三菱東京UFJ銀行が、Money電子明細(OFX)の出力機能を外した模様。このため、数日前から FeliCa2Moneyの問い合わせが急増中。

主に、CSV の取り込みがうまく行かないとか、摘要の取り込み時に従来の OFX と入力項目が違うとか。そう言われても、自分は三菱東京UFJ使ってない(実は口座は持ってるけど)ので、正直なところ知らんがな、というしかないのだけど。対応して欲しいのなら、せめてどういうフォーマットの CSV が出力されるのか、サンプルくらい送ってきてくれないと何ともならん。

CSV の変換ルールは、今のところ私しか公式に取り込む方法がないのだけど、ふぉーくそのみー的(死語)にユーザがばんばん定義を追加していけるようにしたほうがいいでしょうかね。FeliCa2Money に改造いるけど。あと完全ボランティアだから自分には全然インセンティブはないけど。

それと本当は FeliCa2Money の Android 版作りたいんですよね。Android デバイスをカードにかざしたら OFX がメールで飛んでくる or Dropbox に OFX が入る的な。Android内のFeliCa読めるAPIもあったら速攻作るんだけど。CashFlow への取り込み機能付きで。

あと、OFX は別に Microsoft Money 専用のフォーマットではなく業界標準フォーマットなので、金融機関各位におかれましてはサポートを外さないようお願いしたく。ていうか、OFX出力外した金融機関は全資産引っこ抜いて別の金融機関に移ったろうか、という気持ちなのですが、もう国内の銀行はほぼ OFX 全滅 (というか三菱東京UFJがほぼ最後?)なので、なんともなりませんねぇ。

クレジットカードはまだ OFX 対応しているところがいくつかあるんですけどねー。

Google Play の価格表示が税込価格になりました

本日(2012/5/21)付で、ようやく Google Play の価格表示が税込価格になりました。開発者がきちんと税率設定をしていれば、きちんと税込価格が表示されるようになっています。

開発者は、Developer Console で税抜き価格を設定するようになっています。

f:id:tmurakam:20120521205645p:image

上の表示からわかる通り、税抜き価格を指定します。そして、各国毎の価格には下のように税込価格と税率がきちんと表示されます。

f:id:tmurakam:20120521205646p:image

これで総額表示義務もきちんと果たせるようになり、一安心ですね。

参考リンク ⇒ Transition to tax-inclusive pricing on Google Play