๋น๊ณต์ ๊ทธ๊ฑฐ๋ ๋น์ทํด๋ณด์ด์ง๋ง ๋์ดํ๋ฆฌ ๋์์ ์ ๋ณด์ฌ๋ ค๋ด
SDK๊บผ์ผํ๋ ์์ ํ์์ธ๊ฑด ์ฌ์ ํจ.
https://github.com/LiveContainer/LiveContainer/pull/1401
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๋ก ๋ณดํธ๋ฉ๋๋ค.
- ํํน ์ ์ ์ฌ๋กฏ์ ์ ํจ์ฑ์ ๊ฒ์ฆํฉ๋๋ค.
overwriteMainCFBundle ๋ฐ overwriteMainNSBundle์ด ๋ ์ด์ ๊ณ ์ ๋ ๋ช ๋ น์ด ์คํ์ ์ ์์กดํ์ง ์์ต๋๋ค.
overwriteMainCFBundle- ADRP+LDR/ADD ํจํด ํ๋ณด๋ฅผ ์ค์บํฉ๋๋ค.
- ์ ์ฅ๋ ํฌ์ธํฐ๋ฅผ ์ฝ์ด ์ค์ ์ ์ฅ์๊ฐ ๋ง๋์ง ๊ฒ์ฆํฉ๋๋ค.
- _MergedGlobals๋ฅผ ์ฐธ์กฐํ๋ ADRP+ADD ํจํด ํ๋ณด๋ฅผ ์ค์บํฉ๋๋ค.
- ์ต์ LDUR ์คํ์ ๊ธฐ๋ฐ ๋ ์ด์์๋ ์ง์ํฉ๋๋ค.
- ์ ์ฅ๋ ํฌ์ธํฐ๋ฅผ ์ฝ์ด ํ๋ณด์ ์ ํจ์ฑ์ ๊ฒ์ฆํฉ๋๋ค.
- ํํน ๋ก์ง์ด _NSGetExecutablePath์ buf ๋งค๊ฐ๋ณ์๋ฅผ ์ฌํ์ฉํ์ง ์์ต๋๋ค.
- ๋์ ์ค๋ ๋ ๋ก์ปฌ ๋ณ์์ธ gPendingExecPath์์ ์ํ๋ ๊ฒฝ๋ก๋ฅผ ์ฝ์ต๋๋ค.
- dyld ์ค์ ํฌ์ธํฐ ๊ฒ์์ ๊ธฐ์กด ์ธ๋ฑ์ค๊ฐ ๋ง์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ํ ๋์ฒด ์ค์บ ๋ก์ง์ ์ถ๊ฐํ์ต๋๋ค.
- ์บ์๋ ๋ฒ์ ๋งคํ(version-map) ํญ๋ชฉ์ ์๋ ค์ง ์ผํฐ๋ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๊ฒ์ฆํฉ๋๋ค.
- ์ค๋๋๊ฑฐ๋ ์๋ชป๋ ํญ๋ชฉ์ ํ๊ธฐํฉ๋๋ค.
-
์ ์ ์๋ ๋ ์ด์์์์๋ ํฌ๋์ ๋์ ์ ์์ ์ผ๋ก ๊ธฐ๋ฅ์ ๋นํ์ฑํํฉ๋๋ค.
- ์ง์๋์ง ์๋ ๋ฒ์ ๋งต ๋ ์ด์์์์๋ ๋ฒ์ ๋งคํ์ ๋นํ์ฑํ
- ํ์ ํํน ์คํจ ์ ์คํธํ๋ SDK ๋ฒ์ ์ 0์ผ๋ก ์ด๊ธฐํ
- SDK ๊ด๋ จ ํํฌ ์ค ํ๋๋ง ์ฑ๊ณตํ ๊ฒฝ์ฐ ๋ค๋ฅธ ํํฌ๋ฅผ ์๋ ํด์ ํฉ๋๋ค.
-
์ต์ iOS์ ํ ํฐ ๊ธฐ๋ฐ API๋ฅผ ์ํ dyld_get_program_sdk_version_token ํํฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
- ๊ตฌํ iOS์์๋ ์๋์ผ๋ก ๊ฑด๋๋๋๋ค.
๊ธฐ์กด์ ์ธ๋ถ ๋ค์ด๋ก๋ dylibify ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ , ์ ์ฅ์ ๋ด C ๊ธฐ๋ฐ ํจ์ฒ๋ก ๋์ฒดํ์ต๋๋ค.
์ ํจ์ฒ๋ SideStore์ Mach-O ์คํ ํ์ผ์ ์ง์ ์์ ํ์ฌ:
- ํ์ผ ํ์ ์ MH_DYLIB๋ก ๋ณ๊ฒฝ
- LC_ID_DYLIB ๋ก๋ ๋ช ๋ น ์ถ๊ฐ
- ์ธ๊ทธ๋จผํธ ์๋ฅผ ์ ์งํ๊ธฐ ์ํด __PAGEZERO๋ฅผ ์ถ์ํ๊ณ __PAGEZER0๋ก ์ด๋ฆ ๋ณ๊ฒฝ
๊ธฐ์กด dylibify๋ __PAGEZERO๋ฅผ ์์ ํ ์ ๊ฑฐํ๋๋ฐ, ์ด ๋ฐฉ์์ ์ต์ SideStore Nightly ๋น๋์ chained fixups๋ฅผ ์์์์ผฐ์ต๋๋ค.
์ถ๊ฐ๋ก:
- ๋น๋ ์คํฌ๋ฆฝํธ์ ์๋ชป๋ find ๋๋ ํฐ๋ฆฌ ์ด๋ฆ๋ ์์ ํ์ต๋๋ค.
์๋ก์ด ํฌํผ ํจ์:
- 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 ํ๊ฒฝ์์ ์ปดํ์ผ ์ฑ๊ณต ํ์ธ
์ค ใฑใ ใฑใ ๋ผ์ปจ ๋ค์ ๋์ดํ๋ฆฌ๋ก ๋ฐ์์ผ๊ฒ ๋ค