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
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
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
54k
書籍『生成AIの安全性入門』の入門
wataoka
0
110
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3.2k
分割40%キーボードにスムーズに入門するには
hoto17296
1
180
カーネルまで探検して理解するふたつの自動計装
sumiyae
0
340
Kiro5兄弟のいまどきのセキュリティ基礎知識
kentapapa
0
390
全社に広がるMCPサーバーを、 どう安全に管理するか MCPass開発の舞台裏
mtpooh
3
180
Point Cloud as a Foreign Language for Multi-modal Large Language Model
takmin
0
310
NANDでも描画したい!
nichica906
3
820
Cloudflare製品を活用した AIガバナンス実践入門 / AI governance with Cloudflare Service
delta_tech
1
120
AWSとAzureのマルチクラウド活用における強い味方___AWS_Kiroを使った二刀流スキル作成.pdf
duelist2020jp
1
140
暗号化?某ファイルストレージはどうなるの!? 3rd Partyとうまく付き合う秘密度ラベル設計
kasada
0
210
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
490
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
30 Presentation Tips
portentint
PRO
1
380
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Code Review Best Practice
trishagee
74
20k
Ethics towards AI in product and experience design
skipperchong
2
350
Faster Mobile Websites
deanohume
310
32k
Making Projects Easy
brettharned
120
6.7k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
500
Being A Developer After 40
akosma
91
590k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠