Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マルウェアはどのように動的ロードを用いて アプリ挙動を後から変えるのか / After Dro...

マルウェアはどのように動的ロードを用いて アプリ挙動を後から変えるのか / After DroidKaigi 2026

2026年9月28日開催「DroidKaigi 2026 後夜祭」の登壇資料です。
https://d-cube.connpass.com/event/403727/

▼関連資料
iOSアプリをSwiftUI × TCAへ完全移行している話
https://engineering.visional.inc/blog/789/bizreach-ios-rearchitecture-2026/

Androidアプリのリアーキテクチャ 負債解消プロジェクトの成果と課題
https://engineering.visional.inc/blog/699/biz-can-android-re-architecture/

ComposeではないコードをCompose化する case ビズリーチ
https://speakerdeck.com/visional_engineering_and_design/droidkaigi-2025-koyasai

-----
Visionalのエンジニアリングに関する最新情報はX、ブログで発信しています!📣

▼Visional Engineering Blog
https://engineering.visional.inc/blog/

▼VISIONAL ENGINEERING / X
https://twitter.com/VISIONAL_ENG

Avatar for Visional Engineering & Design

Visional Engineering & Design

September 28, 2026

More Decks by Visional Engineering & Design

Other Decks in Technology

Transcript

  1. 自己紹介 加藤 遥斗(@HalunoYo) Android Engineer @ BizReach セキュリティ&低レイヤー好き アセンブラ /

    CTF(pwn)に夢中 ※発表内容は業務内容とは関係ありません DroidKaigi 2026登壇動画
  2. 実際にストアに載ったマルウェア PDFリーダ 翻訳ツール Anatsa Joker ファイルマネージャ 懐中電灯 壁紙 QRコードリーダ Etc

    ファイルマネージャなどに擬態 銀行ログイン情報の奪取・キーロガーなど 壁紙、懐中電灯などに擬態 OTP盗聴・スクショ撮影・連絡先収集など 写真エディタ
  3. DEXファイル生成 by Gradle val generateDex = tasks.register<JavaExec>("generateDex") { … mainClass

    = "com.android.tools.r8.D8" argumentProviders.add( CommandLineArgumentProvider { … }) }
  4. ドロッパー作成 (ロジック ) fun inject() { val dexBytes = “646578…”

    val loader = InMemoryDexClassLoader( ByteBuffer.wrap(dexBytes), javaClass.classLoader ) val clazz = loader.loadClass("dev.sandbox.plugin.Payload") val instance = clazz.getDeclaredConstructor().newInstance() val result = clazz.getMethod("greet").invoke(instance) as String _title.value = result }
  5. ドロッパー作成 (ロジック ) fun inject() { val dexBytes = “646578…”

    val loader = InMemoryDexClassLoader( ByteBuffer.wrap(dexBytes), javaClass.classLoader ) val clazz = loader.loadClass("dev.sandbox.plugin.Payload") val instance = clazz.getDeclaredConstructor().newInstance() val result = clazz.getMethod("greet").invoke(instance) as String _title.value = result }
  6. ドロッパー作成 (ロジック ) fun inject() { val dexBytes = “646578…”

    val loader = InMemoryDexClassLoader( ByteBuffer.wrap(dexBytes), javaClass.classLoader ) val clazz = loader.loadClass("dev.sandbox.plugin.Payload") val instance = clazz.getDeclaredConstructor().newInstance() val result = clazz.getMethod("greet").invoke(instance) as String _title.value = result }
  7. ドロッパー作成 (ロジック ) val result = Payload().greet() val clazz =

    loader.loadClass("dev.sandbox.plugin.Payload") val instance = clazz.getDeclaredConstructor().newInstance() val result = clazz.getMethod("greet").invoke(instance) as String
  8. ドロッパー作成 (ロジック ) val clazz = loader.loadClass("dev.sandbox.plugin.Payload") val instance =

    clazz.getDeclaredConstructor().newInstance() val result = clazz.getMethod("greet").invoke(instance) as String リフレクション
  9. ドロッパー作成 (ロジック ) fun inject() { val dexBytes = “646578…”

    val loader = InMemoryDexClassLoader( ByteBuffer.wrap(dexBytes), javaClass.classLoader ) val clazz = loader.loadClass("dev.sandbox.plugin.Payload") val instance = clazz.getDeclaredConstructor().newInstance() val result = clazz.getMethod("greet").invoke(instance) as String _title.value = result }
  10. Kotlin Fest 2026 セッション名 Kotlin × グラフ理論: Unstable APIで挑む関数レベルAffected Test

    Selectionライブラリ 基本情報 日時 : 11 / 14(土) 16:30 - 17:10 場所:東京コンファレンスセンター品川