๋น„๊ณต์‹ ๊ทธ๊ฑฐ๋ž‘ ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ ๋‚˜์ดํ‹€๋ฆฌ ๋‚˜์™€์„œ ์ •๋ณด์˜ฌ๋ ค๋ด„

SDK๊บผ์•ผํ•˜๋Š” ์ž‘์—… ํ•„์ˆ˜์ธ๊ฑด ์—ฌ์ „ํ•จ.



https://github.com/LiveContainer/LiveContainer/pull/1401




Fix iOS 27 Beta 1 runtime compatibility by kaikozlov ยท Pull Request #1401 ยท LiveContainer/LiveContainerSummary Fixes app launch/runtime compatibility on iOS 27 by rewriting LiveContainer's dyld and Foundation runtime patching to tolerate newer private implementation layouts, and by replacing the...github.com






์š”์•ฝ

iOS 27์—์„œ ๋ฐœ์ƒํ•˜๋˜ LiveContainer์˜ ์‹คํ–‰ ๋ฐ ๋Ÿฐํƒ€์ž„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด LiveContainer์˜ dyld ๋ฐ Foundation ๋Ÿฐํƒ€์ž„ ํŒจ์น˜๋ฅผ ์ตœ์‹  ๋น„๊ณต๊ฐœ ๊ตฌํ˜„ ๊ตฌ์กฐ์—๋„ ๋Œ€์‘ํ•˜๋„๋ก ์žฌ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ, ์˜ค๋ž˜๋œ ์™ธ๋ถ€ ๋‹ค์šด๋กœ๋“œ ๋ฐฉ์‹์˜ dylibify ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ตœ์‹  chained fixups๋ฅผ ๋ณด์กดํ•˜๋Š” ์ €์žฅ์†Œ ๋‚ด(in-repo) SideStore ์‹คํ–‰ ํŒŒ์ผ ํŒจ์ฒ˜๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์ด์Šˆ: https://github.com/LiveContainer/LiveContainer/issues/1394

๋ณ€๊ฒฝ ์‚ฌํ•ญDyld API vtable ์Šฌ๋กฏ ํƒ์ง€ ๊ฐœ์„  (Dyld.m)
  • ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ช…๋ น์–ด ์˜คํ”„์…‹์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ADRP โ†’ LDR/MOVZ/MOVK/ADD ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ถ”์ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ๋กœ์ง์„ ๋„์ž…ํ•˜์—ฌ dyld4์˜ vtable ๋””์ŠคํŒจ์น˜ ์Šฌ๋กฏ์„ ๋™์ ์œผ๋กœ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
  • ์˜ˆ์ƒ ์˜คํ”„์…‹์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์„ ํ˜• ์Šค์บ”(linear scan)์œผ๋กœ ๋Œ€์ฒด ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ๋Š” LCReadPointer๋กœ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค.
  • ํ›„ํ‚น ์ „์— ์Šฌ๋กฏ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
Foundation ๋ฒˆ๋“ค ํŒจ์น˜ ๊ฐœ์„  (LCBootstrap.m)

overwriteMainCFBundle ๋ฐ overwriteMainNSBundle์ด ๋” ์ด์ƒ ๊ณ ์ •๋œ ๋ช…๋ น์–ด ์˜คํ”„์…‹์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

overwriteMainCFBundle
  • ADRP+LDR/ADD ํŒจํ„ด ํ›„๋ณด๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ ํฌ์ธํ„ฐ๋ฅผ ์ฝ์–ด ์‹ค์ œ ์ €์žฅ์†Œ๊ฐ€ ๋งž๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
overwriteMainNSBundle
  • _MergedGlobals๋ฅผ ์ฐธ์กฐํ•˜๋Š” ADRP+ADD ํŒจํ„ด ํ›„๋ณด๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์‹  LDUR ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ๋ ˆ์ด์•„์›ƒ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ €์žฅ๋œ ํฌ์ธํ„ฐ๋ฅผ ์ฝ์–ด ํ›„๋ณด์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ๊ฐœ์„  (LCBootstrap.m)
  • ํ›„ํ‚น ๋กœ์ง์ด _NSGetExecutablePath์˜ buf ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์žฌํ™œ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์‹  ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜์ธ gPendingExecPath์—์„œ ์›ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • dyld ์„ค์ • ํฌ์ธํ„ฐ ๊ฒ€์ƒ‰์— ๊ธฐ์กด ์ธ๋ฑ์Šค๊ฐ€ ๋งž์ง€ ์•Š์„ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๋Œ€์ฒด ์Šค์บ” ๋กœ์ง์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
SDK ๋ฒ„์ „ ์Šคํ‘ธํ•‘ ๊ฐœ์„  (Dyld.m)
  • ์บ์‹œ๋œ ๋ฒ„์ „ ๋งคํ•‘(version-map) ํ•ญ๋ชฉ์„ ์•Œ๋ ค์ง„ ์„ผํ‹ฐ๋„ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ž˜๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ํ•ญ๋ชฉ์€ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๋ ˆ์ด์•„์›ƒ์—์„œ๋Š” ํฌ๋ž˜์‹œ ๋Œ€์‹  ์ •์ƒ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฒ„์ „ ๋งต ๋ ˆ์ด์•„์›ƒ์—์„œ๋Š” ๋ฒ„์ „ ๋งคํ•‘์„ ๋น„ํ™œ์„ฑํ™”
    • ํ•„์ˆ˜ ํ›„ํ‚น ์‹คํŒจ ์‹œ ์Šคํ‘ธํ•‘๋œ SDK ๋ฒ„์ „์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  • SDK ๊ด€๋ จ ํ›„ํฌ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ›„ํฌ๋ฅผ ์ž๋™ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์‹  iOS์˜ ํ† ํฐ ๊ธฐ๋ฐ˜ API๋ฅผ ์œ„ํ•œ dyld_get_program_sdk_version_token ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๊ตฌํ˜• iOS์—์„œ๋Š” ์ž๋™์œผ๋กœ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
SideStore ํŒจํ‚ค์ง• ๊ฐœ์„  (patch_sidestore_executable.c, build_github.sh)

๊ธฐ์กด์˜ ์™ธ๋ถ€ ๋‹ค์šด๋กœ๋“œ dylibify ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์ €์žฅ์†Œ ๋‚ด C ๊ธฐ๋ฐ˜ ํŒจ์ฒ˜๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ ํŒจ์ฒ˜๋Š” SideStore์˜ Mach-O ์‹คํ–‰ ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ:

  • ํŒŒ์ผ ํƒ€์ž…์„ MH_DYLIB๋กœ ๋ณ€๊ฒฝ
  • LC_ID_DYLIB ๋กœ๋“œ ๋ช…๋ น ์ถ”๊ฐ€
  • ์„ธ๊ทธ๋จผํŠธ ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด __PAGEZERO๋ฅผ ์ถ•์†Œํ•˜๊ณ  __PAGEZER0๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ

๊ธฐ์กด dylibify๋Š” __PAGEZERO๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ–ˆ๋Š”๋ฐ, ์ด ๋ฐฉ์‹์€ ์ตœ์‹  SideStore Nightly ๋นŒ๋“œ์˜ chained fixups๋ฅผ ์†์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ:

  • ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์˜ ์ž˜๋ชป๋œ find ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„๋„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์•ˆ์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ (utils.h, utils.m)

์ƒˆ๋กœ์šด ํ—ฌํผ ํ•จ์ˆ˜:

  • LCAddressRangeIsReadable
  • LCReadPointer

๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ง์ ‘์ ์ธ ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ๋ฅผ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ:

  • dyld/Foundation ํŒจ์น˜ ๊ฒฝ๋กœ์˜ ์ง์ ‘ ํฌ์ธํ„ฐ ์ ‘๊ทผ ์ œ๊ฑฐ
  • ๊ณ ์ • ๋ ˆ์ด์•„์›ƒ ๊ฐ€์ •(assertion) ์ œ๊ฑฐ
  • ๋Œ€์‹  false ๋˜๋Š” NULL ๋ฐ˜ํ™˜๊ณผ NSLog ์ง„๋‹จ ๋ฉ”์‹œ์ง€ ์‚ฌ์šฉ
  • ํ˜ธ์ถœ ์ธก์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ๊ฐœ์„ 
์ฐธ๊ณ  ์‚ฌํ•ญ
  • @CherryFlavoredBleach๊ฐ€ ์ง„ํ–‰ํ•œ ์ดˆ๊ธฐ iOS 27 ํ˜ธํ™˜์„ฑ ์ž‘์—…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • PR #1400๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์ด ๋ธŒ๋žœ์น˜๋Š” SDK ๋ฒ„์ „ ์Šคํ‘ธํ•‘ ๋ฌธ์ œ๊นŒ์ง€ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • ํ•ด๋‹น ๋ฌธ์ œ๋Š” #1400์—์„œ ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ์œผ๋กœ ๋‚จ์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ๊ณ„ํš

  • macOS 27์˜ Xcode Beta์—์„œ ๋นŒ๋“œ ๋ฐ ์•„์นด์ด๋ธŒ ์„ฑ๊ณต
  • GitHub Actions CI ๋นŒ๋“œ ํ†ต๊ณผ
  • ์ƒ์„ฑ๋œ IPA๊ฐ€ iOS 27์—์„œ ์ •์ƒ ์‹คํ–‰๋จ์„ ํ™•์ธ
  • ์ดˆ๊ธฐ ํ˜ธํ™˜์„ฑ ํฌํฌ์™€ ๋Ÿฐํƒ€์ž„ ์ฐจ์ด(runtime diff)๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ํ•„์ˆ˜ iOS 27 ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ˆ„๋ฝ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธ
  • ์ตœ์‹  SideStore Nightly์—์„œ ๊ธฐ์กด dylibify ๋ฌธ์ œ ์žฌํ˜„:
    • dyld_info -fixups ๊ฒฐ๊ณผ:

      chained fixups, seg_count exceeds number of segments
  • ์ƒˆ ์ธํ”Œ๋ ˆ์ด์Šค(in-place) ํŒจ์ฒ˜ ๊ฒ€์ฆ:
    • otool -hv โ†’ filetype DYLIB ํ™•์ธ
    • otool -l โ†’ LC_ID_DYLIB ํ™•์ธ
    • dyld_info -fixups โ†’ ์„ธ๊ทธ๋จผํŠธ ๊ฐœ์ˆ˜ ์˜ค๋ฅ˜ ๋ฏธ๋ฐœ์ƒ ํ™•์ธ
  • clang -Wall -Wextra -Werror ํ™˜๊ฒฝ์—์„œ ์ปดํŒŒ์ผ ์„ฑ๊ณต ํ™•์ธ