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
r-plus
September 02, 2023
Technology
450
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
710
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
あなたの『Site』はどこですか? — xREという考え方
miyamu
0
1.2k
人を動かすのは時間ではなく、納得感 〜新任EMが入社3ヶ月、組織を2回変えた話〜
kakehashi
PRO
3
220
Claude Code公式skillで 自分の仕事を少しずつ手放そう!(Claude Code開発ノウハウ大公開スペシャル by クラスメソッド)
kaym
1
280
プロンプト_きのこカンファレンス2026_LT
yurufuwahealer
0
150
実装だけじゃない! CCA-F取得エンジニアが教えるClaude Code開発プロセス活用術
diggymo
2
650
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
2
620
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
150
CSに"SLO"は要らない、経営層に"99.9%"は伝わらない - SREを全社に"翻訳"する3原則
cscengineer
PRO
1
4.5k
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
210
ZOZOTOWNの進化と信頼性を両立する負荷試験
zozotech
PRO
2
160
ゼロをイチにする仕事が終わったあと
smasato
0
340
はじめてのWDM
miyukichi_ospf
1
140
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The browser strikes back
jonoalderson
0
1.4k
Designing for humans not robots
tammielis
254
26k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Invisible Side of Design
smashingmag
301
52k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Building an army of robots
kneath
306
46k
Marketing to machines
jonoalderson
1
5.6k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠