Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Swizzling Swizzling Swizzling
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
r-plus
September 02, 2023
Technology
440
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swizzling Swizzling Swizzling
iOSDC 2023 Day0の資料。
r-plus
September 02, 2023
More Decks by r-plus
See All by r-plus
Image optimization for mobile on CDN
r_plus
0
700
Advanced guard of DeallocationChecker
r_plus
2
3.3k
東急ハンズの P2Pレジ間通信2018
r_plus
4
2.2k
enum as Option.
r_plus
0
2.4k
Enterprise cert management.
r_plus
0
410
CircleCI 2.0 for macOS
r_plus
1
1.3k
carthage verify
r_plus
2
6k
業務アプリの切札 Programable KIOSK mode 大全
r_plus
0
4.3k
PropertyObserverとinoutでやらかした話
r_plus
1
1.3k
Other Decks in Technology
See All in Technology
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
220
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
1.1k
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
1.1k
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
140
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
150
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
310
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
3
2.2k
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
4
680
連合学習と機密コンピューティング
lycorptech_jp
PRO
0
120
自宅LLMの話
jacopen
1
600
脆弱性対応、どこで線を引くか
rymiyamoto
1
400
RAG を使わないという選択肢
tatsutaka
1
250
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
WCS-LA-2024
lcolladotor
0
630
Are puppies a ranking factor?
jonoalderson
1
3.5k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Designing Powerful Visuals for Engaging Learning
tmiket
1
410
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
Designing for humans not robots
tammielis
254
26k
We Are The Robots
honzajavorek
0
250
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Transcript
Swizzling Swizzling Swizzling 2023/9/1 iOSDC 2023 Taiki Komaba @r_plus
UBJLJLPNBCB !S@QMVT
SwizzlingΛݕ౼͢Δલʹ…
SwizzlingΛݕ౼͢Δલʹ… w ͍ͭಈ࡞͠ͳ͘ͳΔ͔Θ͔Βͳ͍4XJ[[MJOHΑΓVQTUSFBN͕ରԠͯ͘͠Ε Δͷ͕Ұ൪Ͱ͢ w ΦʔϓϯιʔεͰ͋ΕGPSLͯ͠ύονΛͯͨͷΛ͏ w ͦͯͦ͠ͷύονΛૹΓ·͠ΐ͏ w ύον͕͚͠Ε'FBUVSF3FRVFTUͷ*TTVF࡞
w Ϋϩʔζυιʔεͷ߹'FBUVSF3FRVFTUͷϑΟʔυόοΫ
[Obj-C] Swizzling+جຊ
[Obj-C] Swizzling • ͓ೃછΈͷObjective-C Runtime API Method class_getInstanceMethod(Class cls, SEL
name); IMP method_getImplementation(Method m); IMP method_setImplementation(Method m, IMP imp); void method_exchangeImplementations(Method m1, Method m2); • ͜ΕΒͷϝιουͰIMPΛೖΕସ͑Δͷ͕ObjCͷMethod Swizzling • ͜͜ͰMethod, IMPʹ͍͓ͭͯܰ͘͞Β͍͓͖ͯ͠·͠ΐ͏ Ref: https://developer.apple.com/documentation/objectivec/objective-c_runtime
Method • SelectorͱؔͷΤϯίʔσΟϯάͱ࣮ଶͷIMPΛ࣋ͬͨߏମ Ref: https://github.com/opensource-apple/objc4/blob/master/runtime/objc-runtime-new.h struct method_t { SEL name;
const char *types; IMP imp; } • ؔͷΤϯίʔσΟϯάฦΓͱҾΛදͨ͠ͷͰ ”v@:@@“ Έ͍ͨͳ ͭͰ͢
IMP • IMP୯ͳΔCͷؔϙΠϯλ • ୈ1Ҿ͕self, ୈೋҾ͕SelectorɺୈࡾҾҎ͕࣮߱ࡍͷҾ Ref: https://developer.apple.com/documentation/objectivec/objective-c_runtime/imp id (*IMP)(id,
SEL, ...)
objc_msgSend • ΠϯελϯεͷisaϙΠϯλ͔Β࣮ࡍͷΫϥεΛಛఆ͠ɺͦͷΫϥεͷϝιο υϦετͷத͔ΒҾͷSelector͔Βݺͼग़͍ͨ͠MethodΛऔಘ͠IMP(Cؔ )Λ࣮ߦ͢Δ • Έ͍ͨͳ͜ͱΛͬͯΔɻ • ͭ·ΓIMPΛࠩ͠ସ͑Ε࣮Λࠩ͠ସ͑ΒΕΔɺ͔͠API͕͋Δʂ࠷ߴʂ
objc_direct
objc_direct Static dispatch for Obj-C • Xcode 12͔Βར༻Ͱ͖Δattribute • objc_msgSendΛ͏ࣄͳ͘static
dispatchͷؔݺͼग़͠ʹͳΔ • Classͷmethod listʹೖͬͯ͜ͳ͘ͳΔ • αϒΫϥεͰoverrideग़དྷͳ͍ͷ੍ݶ͔͔Δ • ObjC༻ͷSelector͕ෆཁͳͷͰୈ2Ҿͷ_cmdলུ͞ΕΔ • όΠφϦαΠζͷॖখ͕ओతΒ͍͠ • MobileSafariͰར༻͞Ε͍ͯΔ
objc_direct Static dispatch for Obj-C @interface A : NSObject -
(void)dynamic:(int)integer; - (void)direct:(int)integer __attribute__((objc_direct)); @end @implementation A - (void)dynamic:(int)number {} - (void)direct:(int)number {} @end ͜ΕΛAssemblyʹίϯύΠϧͯ͠Έ·͠ΐ͏
objc_direct > assembly code .p2align 2 "-[A dynamic:]": sub sp,
sp, #32 str x0, [sp, #24] str x1, [sp, #16] str w2, [sp, #12] add sp, sp, #32 ret .private_extern "-[A direct:]" .globl "-[A direct:]" .p2align 2 "-[A direct:]": sub sp, sp, #16 str x0, [sp, #8] str w1, [sp, #4] ldr x8, [sp, #8] subs x8, x8, #0 cset w8, ne tbnz w8, #0, LBB2_2 b LBB2_1 LBB2_1: b LBB2_2 LBB2_2: add sp, sp, #16 ret De f inition ࣮ߦલͷ ୈ1Ҿselfͷnil νΣοΫ
objc_direct > assembly code __OBJC_$_INSTANCE_METHODS_A: .long 24 .long 1 .quad
l_OBJC_METH_VAR_NAME_ .quad l_OBJC_METH_VAR_TYPE_ .quad "-[A dynamic:]" De f inition • -[A direct:]ͷํଘࡏ͠ͳ͍
objc_direct > assembly code [a dynamic:10]; [a direct:13]; ldr x0,
[sp, #32] mov w2, #10 bl "_objc_msgSend$dynamic:" ldr x0, [sp, #32] mov w1, #13 bl “-[A direct:]" Call • Direct dispatchͰҾϨδελ͕ҧ͏ˠ_cmd͕ແ͍
objc_direct Static dispatch for Obj-C • objc_directʹΑΔίʔυͷมԽ • objc_msgSend͕ΘΕͳ͍ •
Method, IMPͱ͍ͬͨΈΛར༻ͤͣʹfunction pointerΛݺͼग़͠ • Cʹ͓͚Δؔݺग़ͱಉ • ैདྷͷruntime methodͰSwizzleग़དྷͳ͍
Swift Struct
Swift Struct • VTableͱ͔witness tableͱ͔৭ʑ͋ΔΜ͚ͩͲstructͷϝιουݺͼग़͕͠ static dispatchͳͷͰ৭ʑΧόʔ͠Α͏ͱߟ͑Δͱstatic dispatchΛ͢ඞཁ ͕͋Δ struct
OhMyStruct { func method() -> Int { 10 } } OhMyStruct().method()
struct OhMyStruct { func method() -> Int { 10 }
} OhMyStruct().method() _main: stp x29, x30, [sp, #-16]! mov x29, sp bl _$s5swift10OhMyStructVACycfC bl _$s5swift10OhMyStructV6methodSiyF mov w0, #0 ldp x29, x30, [sp], #16 ret .private_extern _$s5swift10OhMyStructV6methodSiyF .globl _$s5swift10OhMyStructV6methodSiyF .p2align 2 _$s5swift10OhMyStructV6methodSiyF: mov w8, #10 mov x0, x8 ret .private_extern _$s5swift10OhMyStructVACycfC .globl _$s5swift10OhMyStructVACycfC .p2align 2 _$s5swift10OhMyStructVACycfC: ret Swift Struct > assembly code ฦΓͱͳΔx1ʹ10ΛೖΕͯreturn
Swift Struct • Swift Structͷϝιουݺͼग़͠static dispatchͰCؔͱ΄΅ಉ͡ • objc_directಉ༷Ͱͨ͠Ͷ • ͭ·ΓCؔͷSwizzle͕ඞཁ
C function Swizzle
C function Swizzle • ৭ʑΓํ͋Γ·͕͢جຊతʹؔͷதͷϝϞϦΛ͍ͬͯࣗ͡ͷؔ ඈ͠·͢ • ҰྫΛղઆ͠·͢
C function Swizzle 0x100003f24 mov w8, #0xa LDR pc, [pc,
#-4] 0x20000000 _$s5swift10OhMyStructV6methodSiyF: 0x100003f28 mov x0, x8 0x100003f2c … 0x20000000 … my_c_func_replace: mov w8, #0xa mov x0, x8 LDR pc, [pc, #-4] 0x100003f2c vm_protect 0x30000000 0x30000004 0x30000008 0x3000000c Bu ff er B໋ྩͰඈ͢ํ͕ଟ͍͔ɻ ࠷ۙͩͱbrkΛར༻ͨ͠Γ͢Δύλʔϯ͋Γ·͢
೦ͳ͕Βʂ ࣮ࡍηΩϡϦςΟ͕ڧྗͳͷͰiOSͰͦ͏ ؆୯ʹग़དྷ·ͤΜʂʂ C function Swizzle
Recap • CؔɺSwiftɺobjc_directiOSͰSwizzle͢ΔͷἚͷಓɺఘΊͨ΄͏͕ಘࡦͰ͢ • Ͳ͏ͯ͠ΔͳΒࣄલʹframeworkͷόΠφϦύον͢Δͷ͕Ұ൪ݱ࣮తͰ͢ • ؆୯ʹSwizzleग़དྷΔObjC࠷ߴʂ • ObjCΛSwizzle͠Α͏ͱ͢Δ࣌ͷ୳͠ํଟ͕࣌ؒΓͳ͍ɻ •
ͪΐͬͱલ·ͰBCSymbolMapsͱ͍͏ศརͳͷ͕͋ͬͨͷͰ͕͢bitcodeഇࢭͰফ͑ͨͷͰૉ ʹ `nm` ͠·͠ΐ͏ɻ͋ͱclass-dumpHopperͰͷdisassemble
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠