Movatterモバイル変換


[0]ホーム

URL:


SlideShare a Scribd company logo

アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works

12 likes22,870 views
T
Takaki Hoshikawa

ここ数年でいくつかの、他のAndroidアプリをエミュレートするAndroidアプリが登場しています(Parallel Space, GO Multipleなど)。その多くがLINEなどのメッセージングアプリやゲームなどを2アカウント同時使用できることを謳っており、多くのユーザーに使われていると思われます。 本セッションではこれらのアプリがどのようにして他のアプリをエミュレートしているのか調査した結果と、これらのアプリを使用することによる危険性の分析について発表を行います。

1 of 78
Downloaded 42 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Most read
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Most read
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Most read
#DroidKaigi_room5アプリをエミュレートするアプリの登場とその危険性2018/02/09 DroidKaigi 2018エムスリー株式会社 星川貴樹 (@oboenikui)
#DroidKaigi_room5# 自己紹介## 名前星川貴樹 Takaki Hoshikawa## ニックネーム@oboenikui## 会社エムスリー株式会社(新卒1年目)主にAndroidアプリ担当## 趣味・最近気になってること野球観戦、CTF、minifyされたJSから隠し機能を見つけること講演中に「OK Google」言ったらテロ起こせる説
#DroidKaigi_room5# 本日の内容- アプリを「エミュレートする」アプリとは- マルチアカウントアプリの仕組み- マルチアカウントアプリは安全?危険?※ マルチアカウントアプリ ≒ アプリをエミュレートするアプリ
#DroidKaigi_room5# アプリを「エミュレートする」アプリとは- 一般には「マルチアカウントアプリ」として知られる- LINEやソシャゲなど、マルチアカウントの仕組みを持たないアプリの別アカウントを作れることがウリ- 2016年ごろから急増マルチアカウントアプリの例Parallel Space GO Multiple 2Accounts
#DroidKaigi_room5# マルチアカウントアプリの種類## APKを改竄してインストールするタイプ- アプリケーションIDを変更して自己署名するタイプ- 一般に証明書のチェックで弾ける- App Clonerなどが有名## 別のアプリとしてインストールせずに動かすタイプ- 「マルチアカウントアプリ」の中で動かすタイプ- あたかも正常にインストールされたかのように動かされるため、動かされる側のアプリには判定が少し厳しい- 今回はこちらの話
#DroidKaigi_room5# 最初に抱いた感想……これ、やばいアプリでは……
#DroidKaigi_room5# 最初に抱いた感想……これ、やばいアプリでは……↓紐解いていきます
#DroidKaigi_room5# 用語- マルチアカウントアプリ上で動くアプリのこと➔ ゲストアプリ- マルチアカウントアプリのこと➔ ホストアプリ
#DroidKaigi_room5# 関連するものの本日深くは解説しないこと- Androidのシステムがどう動いているか- 普通のアプリがどうやって動いているか- APKファイルの構造- Linuxの超基礎知識
#DroidKaigi_room5マルチアカウントアプリの仕組み
#DroidKaigi_room5# VirtualAppの紹介- GitHub上でソースが公開されているマルチアカウントアプリ- VirtualAppは商用アプリのため、勝手にソースを組み込むことを禁止しているhttps://github.com/asLody/VirtualApp/
#DroidKaigi_room5# AndroidManifest.xmlから挙動を読み解く
#DroidKaigi_room5# AndroidManifest.xmlから挙動を読み解くuses-permissionの記述 (186個)StubActivityを継承したActivity(100個)StubContentProviderを継承したContentProvider (50個)
#DroidKaigi_room5# AndroidManifest.xmlから挙動を読み解く## AndroidManifestから読み解けること- パーミッションは考えうる全てのものをVirtualApp側に記載- システムの欠陥を突いて……とかではない- StubActivityは各アプリを動かしている……?
#DroidKaigi_room5# AndroidManifest.xmlから挙動を読み解く## AndroidManifestから読み解けること- パーミッションは考えうる全てのものをVirtualApp側に記載- システムの欠陥を突いて……とかではない- StubActivityは各アプリを動かしている……?↑ ※違います!! (後で解説)
#DroidKaigi_room5# ざっくりとした起動までの流れ0. 動かしたいアプリのAPKファイルを読み込みインストール1. ゲストアプリプロセスの起動2. Activityを起動
#DroidKaigi_room5# ざっくりとした起動までの流れ0. 動かしたいアプリのAPKファイルを読み込みインストール1. ゲストアプリプロセスの起動2. Activityを起動
#DroidKaigi_room5# アプリのインストール処理- android.content.pm.PackageParser※を使ってパッケージ情報を取得- /data/data/io.virtualapp/virtual/data以下に、各アプリのデータ領域にあたるディレクトリなどを作成- APKファイルからlib/**/*.soなどをコピー
#DroidKaigi_room5# PackageParserについて- AndroidManifest.xmlをパースするクラス- JavaDocで@hide指定された隠蔽クラスのため、SDKには含まれず通常使用ができない/**...* @hide*/public class PackageParser {...
#DroidKaigi_room5# 隠蔽クラス/メソッドの使用- @hide指定による隠蔽クラスやメソッドは、Javaのリフレクションを用いるとアプリからもアクセス可能- ただしAndroidバージョンごとに大幅に仕様変更があるので通常使用すべきではない- 解説するメソッドの多くは隠蔽メソッドなのでその度に言及は特にしない
#DroidKaigi_room5# リフレクションとは- privateメソッドを実行する- privateなメンバ変数を取得・書換する- クラス名文字列から対応するクラスのインスタンスを生成する(コンストラクタに引数を渡す場合)- メソッド実行前後に処理を挟む、実行結果を変える(Proxy)などが可能なJavaの機能(いわゆる黒魔術)
#DroidKaigi_room5# privateメンバ変数の取得Field f = activity.getClass().getDeclaredField("mMainThread");f.setAccessible(true);ActivityThread mainThread =(ActivityThread) f.get(activity);
#DroidKaigi_room5# 名前からインスタンス生成 (LayoutInflaterの処理)Class<? extends View> clazz = context.getClassLoader().loadClass(name).asSubclass(View.class);Constructor<? extends View> constructor =clazz.getConstructor(constructorSignature);constructor.setAccessible(true);View view = constructor.newInstance(args);
#DroidKaigi_room5# Proxyの例Map proxyInstance = (Map) Proxy.newProxyInstance(SomeTest.class.getClassLoader(),new Class[] { Map.class },(proxy, method, args) -> {if (method.getName().equals("get")) return 42;throw new UnsupportOperationException();});proxyInstance.get(); // 42proxyInstance.put(1, 1); // error
#DroidKaigi_room5# インストール後のdataディレクトリ/data/data/io.virtualapp/virtual/data内- app/[application id]/∗ 各アプリのネイティブバイナリ・パッケージキャッシュを保存- user/0/[application id]∗ データディレクトリ(/data/data/[application id]) に相当
#DroidKaigi_room5# ざっくりとした起動までの流れ0. 動かしたいアプリのAPKファイルを読み込みインストール1. ゲストアプリプロセスの起動2. Activityを起動
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動VMのロード& JNIをフックActivityThread改竄(Application作成)
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動VMのロード& JNIをフックActivityThread改竄(Application作成)
#DroidKaigi_room5# ContentProviderとはコンテンツ プロバイダは、データの中央リポジトリへのアクセスを管理します。(中略)これは、プロバイダと他のアプリケーションとの間のインターフェースになります。https://developer.android.com/guide/topics/providers/content-provider-creating.html?hl=ja- ContentUrisという仕組みでSQLiteのデータをやりとりしたりする- ContentProviderを含むプロセスはkillされにくい!
#DroidKaigi_room5# StubContentProviderの起動- ContentProviderは別プロセスで動かせるため、このプロセスをアプリプロセスに見立てて動かす- ランタイムのセットアップに関する処理はStubContentProvider上で行う- ゲストアプリごとに別プロセスのStubContentProviderを起動する
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動VMのロード& JNIをフックActivityThread改竄(Application作成)
#DroidKaigi_room5# ART/DalvikVMをロードする- ネイティブ側でlibart.soもしくはlibdvm.soをロード(dlopen)する- dlopenにもパスを変更する処理が追加されている- JNIのフックについては後述
#DroidKaigi_room5# ART/DalvikVMをロードする (補足)- システムプロパティにpersist.sys.dalvik.vm.lib.2が存在→ 通常はlibart.soのパスがセットされているpersist.sys.dalvik.vm.libが存在→ 通常はlibdvm.soのパスがセットされている
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動VMのロード& JNIをフックActivityThread改竄(Application作成)
#DroidKaigi_room5# ActivityThreadの略説- アプリケーションを動かしてる一番重要な部分- public static void main(String[] args)があるところ- ブレークポイントを貼るとコールスタックの初めの方に出てくるやつ- Looperが回ってるところ- HというHandlerを継承したクラスがあり、そこでライフサイクルイベントやActivity起動などを処理している- 詳しくはAndroidを支える技術〈Ⅱ〉の5章を読んでね!
#DroidKaigi_room5# ActivityThreadの改竄- ContentProviderの生成と同時にActivityThreadも生成される- ゲストアプリを動かす際、ActivityThread内で持つ情報をゲストのものに改竄する必要があるので改竄を行う- Proxyを使ったメソッドの処理改竄などもここで行う
#DroidKaigi_room5# ActivityThreadの改竄## ActivityThread#mBoundApplication(AppBindData)の改竄- ActivityThreadから取得し、情報を改竄- appInfo, providers → PackageParserで取得- processName → パッケージ名- instrumentationName → パッケージ名などから生成
#DroidKaigi_room5# ActivityThreadの改竄## AppBindData#info (LoadedApk) の生成- Context#createPackageContext(packageName)を用いて、対象のアプリのContextを取得- ContextImpl#mPackageInfo (LoadedApk) を取得
#DroidKaigi_room5# ActivityThreadの改竄## Applicationの生成- 生成したLoadedApkのインスタンスを用いてLoadedApk#makeApplication()を実行し生成- ActivityThread#mInitialApplicationに作成したApplicationをセット- 生成後ライフサイクル処理を走らせる
#DroidKaigi_room5# ざっくりとした起動までの流れ0. 動かしたいアプリのAPKファイルを読み込みインストール1. ゲストアプリプロセスの起動2. Activityを起動
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動Context#startActivityIntent差し替えIntentからActivityを生成
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動Context#startActivityIntent差し替えIntentからActivityを生成
#DroidKaigi_room5# Activityの起動- ManagerプロセスからstartActivity(intent)でStubActivityを起動しようとする- StubActivityとStubContentProviderは同じプロセスで動くようAndroidManifestで定義されている- Androidの機能でゲストプロセス側にIntentが飛ぶ
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動Context#startActivityIntent差し替えIntentからActivityを生成IntentTarget: io.virtualapp/.StubActivityExtra: Intent(x.guest/.MainActivity)
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動Context#startActivityIntent差し替えIntentからActivityを生成
#DroidKaigi_room5# ActivityThreadの略説- アプリケーションを動かしてる一番重要な部分- public static void main(String[] args)があるところ- ブレークポイントを貼るとコールスタックの初めの方に出てくるやつ- Looperが回ってるところ- HというHandlerを継承したクラスがあり、そこでライフサイクルイベントやActivity起動などを処理している- 詳しくはAndroidを支える技術〈Ⅱ〉の5章を読んでね!
#DroidKaigi_room5# Activityの起動- ゲストアプリプロセスでIntentを受信後、H#dispatchMessage(msg)が呼ばれる- 通常は受信したIntentからActivity生成処理が走る
#DroidKaigi_room5# Handlerクラスの実装public void dispatchMessage(Message msg) {if (msg.callback != null) {handleCallback(msg);} else {if (mCallback != null&& mCallback.handleMessage(msg)) {return;}handleMessage(msg);}}
#DroidKaigi_room5# Handlerクラスの実装public void dispatchMessage(Message msg) {if (msg.callback != null) {handleCallback(msg);} else {if (mCallback != null&& mCallback.handleMessage(msg)) {return;}handleMessage(msg);}}mCallbackがセットされていて、実行の結果trueが返ってきたら終了
#DroidKaigi_room5# Handlerクラスの実装public void dispatchMessage(Message msg) {if (msg.callback != null) {handleCallback(msg);} else {if (mCallback != null&& mCallback.handleMessage(msg)) {return;}handleMessage(msg);}}Handlerのコンストラクタに渡すコールバックで、HではnullHでは通常ここの処理でActivity生成
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動VMのロード& JNIをフックActivityThread改竄(Application作成)ゲストプロセスのActivityThread#mH#mCallbackに処理を追加Context#startActivity…
#DroidKaigi_room5# Activityの起動- ゲストアプリプロセスでIntentを受信後、H#dispatchMessage(msg)が呼ばれる- この中で通常は受信したIntentからActivity生成処理が走る- H#mCallbackにセットした処理により、Intentの宛先がゲストアプリの起動したいActivityに置き換わる- このIntentを基にActivityを生成し起動する
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動Context#startActivityIntent差し替えIntentからActivityを生成IntentTarget: io.virtualapp/.StubActivityExtra: Intent(x.guest/.MainActivity)
#DroidKaigi_room5# プロセスの状態ホストアプリプロセス Managerプロセスゲストアプリプロセス(ContentProvider)Activity起動要求ゲスト起動処理プロセス起動Context#startActivityIntent差し替えIntentからActivityを生成IntentTarget: x.guest/.MainActivity
#DroidKaigi_room5# なぜStubActivityを経由?- 別アプリから起動する場合を考慮した結果
#DroidKaigi_room5# 別アプリから起動する場合別アプリゲストアプリプロセス(ContentProvider)startActivityContentProvider起動mCallbackでIntent差し替えIntentからActivityを生成StubActivity起動IntentTarget: io.virtualapp/.StubActivityExtra: Intent(x.guest/.MainActivity)
#DroidKaigi_room5# AndroidManifest.xmlの答え合わせStubActivity (100個)StubContentProvider (50個)Activityの起動を仲介するダミーのActivityたちゲストアプリのプロセスになる奴ら
#DroidKaigi_room5# 補足:メソッドのフック## なぜ必要?- Intentの処理やCameraのインストールなどがパッケージ名に依存している- PackageCacheのパスを変えないとPermissionDeniedになる- Binder#getCallingUid()の返すUidを偽装- その他パッケージ改竄検出をすり抜けるため
#DroidKaigi_room5# Javaのリフレクション (Proxy) で改竄する処理- startActivityなどIntent処理- 改ざんしないと本物が起動してしまうため- バックアップなど多くのメソッドの挙動を削除- 動作しては困るものは削除してしまう- オーディオ周りなどの挙動をホストの処理に置き換え- ネイティブ周りなどの関係でそのままでは動かないのでなどなど
#DroidKaigi_room5# JNIのメソッドをフックして行うこと- UIDを偽装- ゲストのdataディレクトリを偽装- Cameraの初期化- AudioRecordのパーミッションを取得- PackageCacheに使うパスを変更詳しくはスライド最後の付録で
#DroidKaigi_room5マルチアカウントアプリの危険性
#DroidKaigi_room5# 広告をオーバーライドされるなどの問題- 広告フレームワークの処理を変え、マルチアカウントアプリ作者に収益が入るようにすることも技術的には可能- Parallel Space上のAdMobでは変更されていないことを確認したが、他のアプリはどうかわからない- その他、Playストアでの課金をしたかのように振る舞わせるなども可能と考えられる
#DroidKaigi_room5# 過剰にパーミッションを与えてしまう危険性- マルチアカウントアプリに非常に多くのパーミッションが使われているため、ゲストアプリにも同様のパーミッションを与えてしまう危険性がある- ゲストアプリに悪意がある場合、AndroidManifestではパーミッションを指定せず、マルチアカウントアプリ上で動く時のみパーミッションを用いる、などが可能- そもそもマルチアカウントアプリ自体が大変危険なアプリかもしれない
#DroidKaigi_room5# アカウントデータ・パスワード漏洩の危険性- マルチアカウントアプリに悪意がある場合、容易にパスワード入力情報から内部のデータまで全て盗むことが可能- ゲストアプリが悪意のあるものの場合も、他のゲストアプリの保存データを取得可能↓ VirtualApp上の端末エミュレータアプリでLINEの情報を確認できた
#DroidKaigi_room5# 応用すると……- 知らぬ間にアプリが置き換わっていることがあるかも……- いろいろ頑張ればユーザーが気付かないようにアプリをアンインストールさせることが可能- 代わりに悪意のあるアプリケーション上で動かすショートカットを作っておけば、ユーザーは置き換わっていることに気付くのは困難⇒ 対策した方がよいかも……
#DroidKaigi_room5# マルチアカウントアプリの対策- 単純な証明書のチェックはNG- マルチアカウントアプリ上では証明書を取得するメソッドも書き換わっており、正しい証明書を得てしまう- パッケージ名やUIDのチェック等もNG- これも完全にホストのものに差し替えられると確認が困難
#DroidKaigi_room5# 2018年現在最適なチェック方法!!- psコマンドで確認(一部省略)$ psUSER PID NAMEu0_a51 8561 psu0_a51 29616 com.lbe.parallel.intl:mdserveru0_a51 29699 parallel.monitoru0_a51 30703 jackpal.androidtermu0_a51 30889 /system/bin/sh自分のアプリでは発生し得ないプロセスが同じユーザーとして実行されていることをチェックできる
#DroidKaigi_room5# 最後に(対策する前に)- マルチアカウントアプリが使われるアプリ≒ ユーザーはアカウント切り替え機能を求めている⇒ マルチアカウント機能の実装を検討すべきでは?- 現在マルチアカウントアプリの紹介記事の中で危険性を伝える記事はないので、正しく周知していくことが必要- 必ずしも危険なものではないが、危険性は知るべき
#DroidKaigi_room5付録:JNIのフック処理の詳細参考(中国語):https://www.jianshu.com/p/052b6dd45659
#DroidKaigi_room5# JNIの基礎知識JNIからJavaのメソッドを呼ぶ機能がある// C++jclass clazz =env->FindClass("SomeJavaClass");jmethodID methodId =env->GetStaticMethodID(clazz, "javaMethod", "()V");env->CallStaticVoidMethod(clazz, methodId);
#DroidKaigi_room5# JNIの基礎知識JNIからJavaのメソッドを呼ぶ機能がある// C++jclass clazz =env->FindClass("SomeJavaClass");jmethodID methodId =env->GetStaticMethodID(clazz, "javaMethod", "()V");env->CallStaticVoidMethod(clazz, methodId);
#DroidKaigi_room5# JNIのフックjmethodIDはMethod構造体のポインタ// C++struct Method {ClassObject* clazz; // クラスを表すu4 accessFlags; // publicか、nativeか、などのフラグ…DalvikBridgeFunc nativeFunc; // ネイティブ関数のポインタ…};
#DroidKaigi_room5# JNIのフックjmethodIDはMethod構造体のポインタ// C++struct Method {ClassObject* clazz; // クラスを表すu4 accessFlags; // publicか、nativeか、などのフラグ…DalvikBridgeFunc nativeFunc; // ネイティブ関数のポインタ…}; これを書き換えればOK
#DroidKaigi_room5# JNIのフックjmethodIDはMethod構造体のポインタ// C++struct Method {ClassObject* clazz; // クラスを表すu4 accessFlags; // publicか、nativeか、などのフラグ…DalvikBridgeFunc nativeFunc; // ネイティブ関数のポインタ…};環境によって構造が異なる
#DroidKaigi_room5# JNIのフックjmethodIDはMethod構造体のポインタ// C++struct Method {ClassObject* clazz; // クラスを表すu4 accessFlags; // publicか、nativeか、などのフラグ…DalvikBridgeFunc nativeFunc; // ネイティブ関数のポインタ…};環境によって構造が異なるここのオフセットを知る必要あり
#DroidKaigi_room5# JNIのフックダミーのメソッドをJava, C++両側に定義// Javastatic native void nativeMark();// C++void mark() {}
#DroidKaigi_room5# JNIのフックダミーメソッドのポインタに一致するオフセットを探索// C++size_t start = (size_t) env->GetStaticMethodID(clazz, "nativeMark", "()V");size_t target = (size_t) mark;int offset = 0;while (true) {if (*((size_t *)(start + offset)) == target)break;offset += 4;}
#DroidKaigi_room5# JNIのフックこのオフセットを使って他のメソッドを置き換える// C++size_t method = (size_t) someMethodId;void **nativeFuncPtr = (void **) (method + offset);*nativeFuncPtr = (void*) hookFunc;
Ad

Recommended

PPTX
XMPPの紹介
隆行 神戸
 
PDF
ゲーム開発者のための C++11/C++14
Ryo Suzuki
 
PPTX
大規模グラフデータ処理
maruyama097
 
PDF
IPv6 を始めてみた
miki koganei
 
PDF
PostgreSQLのgitレポジトリから見える2022年の開発状況(第38回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
本当に無駄な仕事をしたくない人のためのHoudiniプロシージャル入門
jyouryuusui
 
PDF
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
Kazuto Kusama
 
PDF
Hyper vを理解する
Naoki Abe
 
PDF
ServiceとRepository
シオリ ショウノ
 
PDF
golang profiling の基礎
yuichiro nakazawa
 
PPTX
UE4初心者がUE4で2D横スクロールアクションゲームを作ってみるお話
Mio Ku-tani
 
PDF
HA環境構築のベスト・プラクティス
EnterpriseDB
 
PDF
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
UnityTechnologiesJapan002
 
PDF
【Unite 2017 Tokyo】Navmesh完全マスターへの道
Unity Technologies Japan K.K.
 
PDF
目grep入門 +解説
murachue
 
PPTX
OPTPiX SpriteStudioと他社ツール比較(真)資料1 - 株式会社ウェブテクノロジ - GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
 
PDF
TLS, HTTP/2演習
shigeki_ohtsu
 
PDF
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
NTT DATA Technology & Innovation
 
PDF
NFT/VCを活用した「キャリア証明書」の発行を通じて企業の認知形成・採用を支援するサービス「sakazuki」紹介資料【2023年度版】
y moe
 
PDF
ドメイン分析勉強会
Kosuke Fujisawa
 
PDF
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
PPTX
Heroku Dyno再起動時の振る舞い
Shunji Konishi
 
PDF
IT エンジニアのための 流し読み Windows 10 - Microsoft の更新プログラム管理インフラ比較 ~ WU / WSUS / SCCM ...
TAKUYA OHTA
 
PDF
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
エピック・ゲームズ・ジャパン Epic Games Japan
 
PDF
UE4におけるエフェクトの基本戦略事例 後半
エピック・ゲームズ・ジャパン Epic Games Japan
 
PDF
Go1.18 Genericsを試す
asuka y
 
PDF
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
Unity Technologies Japan K.K.
 
PPTX
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 
PDF
0621 ndk game
cat kaotaro
 
PDF
第12回 つ部 ミーティング兼忘年会 LT資料
Kenji Nagase
 

More Related Content

What's hot(20)

PDF
ServiceとRepository
シオリ ショウノ
 
PDF
golang profiling の基礎
yuichiro nakazawa
 
PPTX
UE4初心者がUE4で2D横スクロールアクションゲームを作ってみるお話
Mio Ku-tani
 
PDF
HA環境構築のベスト・プラクティス
EnterpriseDB
 
PDF
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
UnityTechnologiesJapan002
 
PDF
【Unite 2017 Tokyo】Navmesh完全マスターへの道
Unity Technologies Japan K.K.
 
PDF
目grep入門 +解説
murachue
 
PPTX
OPTPiX SpriteStudioと他社ツール比較(真)資料1 - 株式会社ウェブテクノロジ - GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
 
PDF
TLS, HTTP/2演習
shigeki_ohtsu
 
PDF
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
NTT DATA Technology & Innovation
 
PDF
NFT/VCを活用した「キャリア証明書」の発行を通じて企業の認知形成・採用を支援するサービス「sakazuki」紹介資料【2023年度版】
y moe
 
PDF
ドメイン分析勉強会
Kosuke Fujisawa
 
PDF
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
PPTX
Heroku Dyno再起動時の振る舞い
Shunji Konishi
 
PDF
IT エンジニアのための 流し読み Windows 10 - Microsoft の更新プログラム管理インフラ比較 ~ WU / WSUS / SCCM ...
TAKUYA OHTA
 
PDF
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
エピック・ゲームズ・ジャパン Epic Games Japan
 
PDF
UE4におけるエフェクトの基本戦略事例 後半
エピック・ゲームズ・ジャパン Epic Games Japan
 
PDF
Go1.18 Genericsを試す
asuka y
 
PDF
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
Unity Technologies Japan K.K.
 
PPTX
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 
ServiceとRepository
シオリ ショウノ
 
golang profiling の基礎
yuichiro nakazawa
 
UE4初心者がUE4で2D横スクロールアクションゲームを作ってみるお話
Mio Ku-tani
 
HA環境構築のベスト・プラクティス
EnterpriseDB
 
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
UnityTechnologiesJapan002
 
【Unite 2017 Tokyo】Navmesh完全マスターへの道
Unity Technologies Japan K.K.
 
目grep入門 +解説
murachue
 
OPTPiX SpriteStudioと他社ツール比較(真)資料1 - 株式会社ウェブテクノロジ - GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
 
TLS, HTTP/2演習
shigeki_ohtsu
 
トランザクション処理可能な分散DB 「YugabyteDB」入門(Open Source Conference 2022 Online/Fukuoka 発...
NTT DATA Technology & Innovation
 
NFT/VCを活用した「キャリア証明書」の発行を通じて企業の認知形成・採用を支援するサービス「sakazuki」紹介資料【2023年度版】
y moe
 
ドメイン分析勉強会
Kosuke Fujisawa
 
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
Heroku Dyno再起動時の振る舞い
Shunji Konishi
 
IT エンジニアのための 流し読み Windows 10 - Microsoft の更新プログラム管理インフラ比較 ~ WU / WSUS / SCCM ...
TAKUYA OHTA
 
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
エピック・ゲームズ・ジャパン Epic Games Japan
 
UE4におけるエフェクトの基本戦略事例 後半
エピック・ゲームズ・ジャパン Epic Games Japan
 
Go1.18 Genericsを試す
asuka y
 
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
Unity Technologies Japan K.K.
 
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 

Similar to アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works(8)

PDF
0621 ndk game
cat kaotaro
 
PDF
第12回 つ部 ミーティング兼忘年会 LT資料
Kenji Nagase
 
PDF
Androidのアプリケーションいろいろ
高見 知英
 
PDF
Outsmarting Smartphone Apps 2
Takahiro Yoshimura
 
PDF
Androidスマートフォンプログラミング
高見 知英
 
PDF
DartVM on Android
nothingcosmos
 
PDF
Androidアプリケーション開発中級研修 前編
株式会社 NTTテクノクロス
 
PPTX
Game Development and Automation @ Agile Sapporo 2018 #1
Michael Tedder
 
0621 ndk game
cat kaotaro
 
第12回 つ部 ミーティング兼忘年会 LT資料
Kenji Nagase
 
Androidのアプリケーションいろいろ
高見 知英
 
Outsmarting Smartphone Apps 2
Takahiro Yoshimura
 
Androidスマートフォンプログラミング
高見 知英
 
DartVM on Android
nothingcosmos
 
Androidアプリケーション開発中級研修 前編
株式会社 NTTテクノクロス
 
Game Development and Automation @ Agile Sapporo 2018 #1
Michael Tedder
 
Ad

Recently uploaded(6)

PDF
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
PPTX
Devcontainerのススメ(1)-Devcontainerとはどういう技術?-
iPride Co., Ltd.
 
PDF
20250711JIMUC総会_先進IT運用管理分科会Connpass公開資料.pdf
ChikakoInami1
 
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
20250711JIMUC総会IBM Automation_Platform最新情報_Connpass公開版.pdf
ChikakoInami1
 
PDF
20250717_Devin×GitHubCopilotで10人分の仕事は出来るのか?.pdf
Masaki Yamakawa
 
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
Devcontainerのススメ(1)-Devcontainerとはどういう技術?-
iPride Co., Ltd.
 
20250711JIMUC総会_先進IT運用管理分科会Connpass公開資料.pdf
ChikakoInami1
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
20250711JIMUC総会IBM Automation_Platform最新情報_Connpass公開版.pdf
ChikakoInami1
 
20250717_Devin×GitHubCopilotで10人分の仕事は出来るのか?.pdf
Masaki Yamakawa
 
Ad

アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works


[8]ページ先頭

©2009-2025 Movatter.jp