Más contenido relacionado La actualidad más candente (20) Similar a アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works (20) アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works2. #DroidKaigi_room5
# 自己紹介
## 名前
星川貴樹 Takaki Hoshikawa
## ニックネーム
@oboenikui
## 会社
エムスリー株式会社(新卒1年目)
主にAndroidアプリ担当
## 趣味・最近気になってること
野球観戦、CTF、minifyされたJSから隠し機能を見つけること
講演中に「OK Google」言ったらテロ起こせる説
23. #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);
24. #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(); // 42
proxyInstance.put(1, 1); // error
48. #DroidKaigi_room5
# Handlerクラスの実装
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null
&& mCallback.handleMessage(msg)) {
return;
}
handleMessage(msg);
}
}
49. #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が返ってきたら終了
50. #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ではnull
Hでは通常ここの処理でActivity生成
59. #DroidKaigi_room5
# Javaのリフレクション (Proxy) で改竄する処理
- startActivityなどIntent処理
- 改ざんしないと本物が起動してしまうため
- バックアップなど多くのメソッドの挙動を削除
- 動作しては困るものは削除してしまう
- オーディオ周りなどの挙動をホストの処理に置き換え
- ネイティブ周りなどの関係でそのままでは動かないので
などなど