$30 off During Our Annual Pro Sale. View Details »

Flutterアプリの難読化とエラーレポート(iOS)

Hiroki Matsue
December 06, 2018

 Flutterアプリの難読化とエラーレポート(iOS)

"Flutter Meetup Tokyo #6"で使った資料です。
https://flutter-jp.connpass.com/event/105834/

Hiroki Matsue

December 06, 2018
Tweet

More Decks by Hiroki Matsue

Other Decks in Technology

Transcript

  1. FlutterΞϓϦͷ೉ಡԽͱ
    ΤϥʔϨϙʔτ(iOS)
    Hiroki Matsue
    Dec 6th, 2018
    Flutter Meetup Tokyo #6

    View Slide

  2. Hiroki Matsue (@macs_6)

    View Slide

  3. FlutterͰIIJmio޲͚ʹ
    ʮΈ͓εΠονʯΛ
    ϦϦʔε

    View Slide

  4. View Slide

  5. [࣭໰] FlutterͰΞϓϦΛ
    ϦϦʔε͍ͯ͠Δਓʁ

    View Slide

  6. [࣭໰] ϦϦʔεલʹ
    ೉ಡԽͨ͠ਓʁ

    View Slide

  7. ϦϦʔεؔ࿈ͷυΩϡϝϯτ
    https://flutter.io/docs/deployment/ios

    View Slide

  8. View Slide

  9. View Slide

  10. ࠷ॳʹॻ͍͚ͯ͋ͬͨͲ
    ݟམͱͯͨ͠
    (AndroidͷProGuardରԠͯͯ͠ؾ͍ͮͨ)

    View Slide

  11. ͪͳΈʹ

    View Slide

  12. (ϦϦʔεؔ࿈Ͱ୤ઢ)
    ΞΠίϯ࡞੒͸"flutterlaunchericons"࢖͏ͱ
    1ͭͷը૾͔Β͍͍ײ͡ʹ࡞ͬͯ͘ΕΔ

    View Slide

  13. iOS͸Dartίʔυ෦෼͕
    ೉ಡԽͷର৅

    View Slide

  14. ΍Δ͜ͱ͸build࣌ʹ
    ΦϓγϣϯΛ͚ͭΔ͚ͩ
    (Կނ͔ॳظঢ়ଶͰ͸ରԠ͞Εͯͳ͍ )
    https://github.com/flutter/flutter/wiki/Obfuscating-Dart-Code

    View Slide

  15. /ios/Flutter/Release.xcconfig
    EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate

    View Slide

  16. # /packages/flutter_tools/bin/xcode_backend.sh
    local extra_gen_snapshot_options_or_none=""
    if [[ -n "$EXTRA_GEN_SNAPSHOT_OPTIONS" ]]; then
    extra_gen_snapshot_options_or_none="--extra-gen-snapshot-options=$EXTRA_GEN_SNAPSHOT_OPTIONS"
    fi
    ...
    RunCommand "${FLUTTER_ROOT}/bin/flutter" --suppress-analytics \
    ${verbose_flag} \
    build aot \
    --output-dir="${build_dir}/aot" \
    --target-platform=ios \
    --target="${target_path}" \
    --${build_mode} \
    --ios-arch="${archs}" \
    ${local_engine_flag} \
    ${track_widget_creation_flag} \
    ${extra_gen_snapshot_options_or_none}

    View Slide

  17. # /packages/flutter_tools/bin/xcode_backend.sh
    local extra_gen_snapshot_options_or_none=""
    if [[ -n "$EXTRA_GEN_SNAPSHOT_OPTIONS" ]]; then
    extra_gen_snapshot_options_or_none="--extra-gen-snapshot-options=$EXTRA_GEN_SNAPSHOT_OPTIONS"
    fi
    ...
    RunCommand "${FLUTTER_ROOT}/bin/flutter" --suppress-analytics \
    ${verbose_flag} \
    build aot \
    --output-dir="${build_dir}/aot" \
    --target-platform=ios \
    --target="${target_path}" \
    --${build_mode} \
    --ios-arch="${archs}" \
    ${local_engine_flag} \
    ${track_widget_creation_flag} \
    ${extra_gen_snapshot_options_or_none}

    View Slide

  18. xcode_backend.sh ͱ͸ʁ
    Build PhaseͷRun ScriptͰ࢖ΘΕ͍ͯΔεΫϦϓτ
    Xcode͔Β΋Dartίʔυ͕build͞ΕΔͷ͸͜Εͷ͓͔͛

    View Slide

  19. (୤ઢ2)
    طଘΞϓϦʹFlutterΛಋೖ͢Δ࣌͸
    xcode_backend.sh embed
    Add2AppϘʔυ্Ͱઈࢍ։ൃத

    View Slide

  20. ͜ΕͰϏϧυ͢Ε͹
    ೉ಡԽ׬ྃʂ
    Χϯλϯʂ

    View Slide

  21. ೉ಡԽͷ֬ೝํ๏ʁ

    View Slide

  22. App.frameworkΛ֬ೝ͢Δ
    $ strings build/ios/Release-iphoneos/Runner.app/Frameworks/App.framework/App
    ...
    get:_vxa@7048458x
    get:_aLa@9040228x
    get:_DLa@7048458x
    ...

    View Slide

  23. ೉ಡԽͷલޙͰൺֱ
    before
    get:_count@7048458
    get:_onData@9040228
    get:_isSubscribed@7048458
    after
    get:_vxa@7048458x
    get:_aLa@9040228x
    get:_DLa@7048458x

    View Slide

  24. Dartίʔυ͕೉ಡԽ͞Εͨ

    View Slide

  25. ...ϦϦʔεޙͷ͋Δ೔

    View Slide

  26. View Slide

  27. SentryͷΤϥʔϨϙʔτ΋
    ೉ಡԽ͞ΕͯΔ

    View Slide

  28. ೉ಡԽલͷΤϥʔϨϙʔτ

    View Slide

  29. ։ൃத͸ؾ͔ͮͳ͔ͬͨ

    View Slide

  30. ೉ಡԽͷલޙͰൺֱ
    before
    main.dart in SampleApp.build at line 48
    after
    SEd in bZ.opa at line 48

    View Slide

  31. ࣗ෼΋ಡΊͳ͍

    View Slide

  32. ϦϦʔεࡁΞϓϦͷ
    Τϥʔ΋ݟ͍ͨ

    View Slide

  33. mapϑΝΠϧΛग़ྗ͢Δ
    ઌ΄ͲͷυΩϡϝϯτʹ͋ͬͨઃఆ
    EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate
    mapϑΝΠϧΛग़ྗ͢ΔઃఆΛ௥Ճ
    EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate,
    ɹ --save-obfuscation-map=ios_dart_symbols_${FLUTTER_BUILD_NUMBER}.json

    View Slide

  34. ग़ྗ͞ΕͨmapϑΝΠϧ
    $ cat ios_dart_symbols_5.json
    ...
    "_BuildJsonListener","_Gf",
    "CustomSymbolRenderer","cs",
    "devicePixelRatio","saa"
    ...
    ͜ΕΛࢀর͢Ε͹ಡΊΔ
    !

    View Slide

  35. աڈʹϦϦʔεͨ͠ΞϓϦͷmapϑΝΠϧʁ
    ࢼͨ͠ͱ͜Ζɺ
    ੜ੒ݩͷίʔυ͕ಉ͡Ͱ͋Ε͹map΋ಉ͡ʹͳͬͨ

    View Slide

  36. ·ͱΊ

    View Slide

  37. ·ͱΊ
    • FlutterͩͱiOSͰ΋Dartίʔυͷ೉ಡԽ࡞ۀ͕͋Δ
    • stringsίϚϯυͰνΣοΫ͢Δͷָ͕
    • mapϑΝΠϧ΋ग़ྗ͓ͯ͘͠ͱSentryղಡʹ࢖͑Δ
    # before
    main.dart in SampleApp.build at line 48
    # after
    SEd in bZ.opa at line 48

    View Slide

  38. Έ͓εΠονɺੋඇ͝ར༻͍ͩ͘͞

    View Slide

  39. Thanks

    View Slide