Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Swizzling Swizzling Swizzling
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
r-plus
September 02, 2023
Technology
460
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
720
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
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
0
2.6k
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
190
CLIライブラリ開発を支える技術
htnabe
0
110
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
820
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
4
1.7k
事業課題から技術的負債に向き合う
sansantech
PRO
2
1.8k
俺の仕事は AIに奪われないし、たぶんその BIも要らない
hikaruri
0
480
Claude Code本って、 読む必要あるの?
oikon48
2
460
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
160
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
140
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
510
LLMに渡さなかった仕事
nanaism
0
170
Featured
See All Featured
Test your architecture with Archunit
thirion
2
2.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
Automating Front-end Workflow
addyosmani
1369
210k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Designing Powerful Visuals for Engaging Learning
tmiket
1
550
A Soul's Torment
seathinner
8
3.6k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
How to Ace a Technical Interview
jacobian
281
24k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠