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
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ネイティブプロダクトで顧客価値を最大化するプロダクトエンジニアとFDEの協働
righttouch
PRO
0
240
Podは生きているのにGoだけが落ちる:GOGCとGOMEMLIMITで追うInvisible OOM Killの謎
tkc66buzz
1
600
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
140
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
8
7.9k
消えない 動かない 効かない
yama3133
1
120
Sigmaで作る業務アプリ
kazushiro_honma
0
120
Screen Lens - 今見てる画面を翻訳する
komagata
0
250
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
4
510
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
1
240
AI時代のAPI品質を支えるガードレール / API Guardrails for API quality in the AI era
yokawasa
1
220
20260906 「AWS運用入門」著者が教える、運用業務への生成AI活用入門
masaruogura
0
260
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
270
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
490
Agile that works and the tools we love
rasmusluckow
331
22k
Navigating Weather and Climate Data
rabernat
0
510
Done Done
chrislema
186
16k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
GitHub's CSS Performance
jonrohan
1033
470k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Between Models and Reality
mayunak
4
450
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠