Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Private APIの呼び出し方

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Private APIの呼び出し方

Avatar for Kishikawa Katsumi

Kishikawa Katsumi

November 09, 2025
Tweet

More Decks by Kishikawa Katsumi

Other Decks in Programming

Transcript

  1. if let radius = UIScreen.main.value(forKey: "_displayCornerRadius") as? CGFloat { print("display

    corner radius:", radius) } 1SJWBUF"1*ͷݺͼग़͠ํ -[NSObject valueForKey:]/-[NSObject setValue:forKey:]
  2. Optional(Swift.Unmanaged<Swift.AnyObject>(_value: <UIScreen: 0x1057080a0>: in UIScreen: Class Methods: + (void) _performSwiftUITestingOverrides;

    (0x1d8712a84) + (id) fallback_debugHierarchyPropertyDescriptions; (0x257fd057c) + (id) fallback_debugHierarchyValueForPropertyWithName:(id)arg1 onObject:(id)arg2 outOptions:(id*)arg3 outError:(id*)arg4; (0x257fd0c20) + (void) initialize; (0x185e00198) + (struct CGRect) convertRect:(struct CGRect)arg1 fromView:(id)arg2; (0x185e0a180) ... Properties: @property (readonly) unsigned long screenSizeCategory; @property (readonly, nonatomic, getter=isUserInterfaceIdiomPad) BOOL userInterfaceIdiomPad; @property (readonly, nonatomic, getter=_bn_portraitPeripheryInsets) struct UIEdgeInsets bn_portraitPeripheryInsets; @property (readonly) unsigned long hash; @property (readonly) Class superclass; ... Instance Methods: - (id) _mapkit_display; (0x197840328) - (BOOL) isUserInterfaceIdiomPad; (0x1a15472c8) - (unsigned long) screenSizeCategory; (0x1a154703c) - (id) traitCollectionForImageLoader:(id)arg1; (0x1a2a4bb9c) - (double) _SwiftUITesting_currentScreenScale; (0x1d8712ad4) - (BOOL) _SwiftUITesting_wantsWideContentMargins; (0x1d8712adc) ... 1SJWBUF"1*ͷ୳͠ํ ࣮ߦ࣌ʹ୳͢
  3. guard let `class` = NSClassFromString("LSApplicationWorkspace") as? AnyObject else { return

    } let workspace = `class` .perform(NSSelectorFromString("defaultWorkspace")) .takeUnretainedValue() workspace.perform("openApplicationWithBundleID:", with: "com.apple.Fitness") 1SJWBUF"1*ͷݺͼग़͠ํ -[NSObject performSelector:]
  4. guard let `class` = NSClassFromString("LSApplicationWorkspace") as? AnyObject else { return

    } let selector = NSSelectorFromString("defaultWorkspace") guard `class`.responds(to: selector) else { return } let implementation = `class`.method(for: selector) let function = unsafeBitCast(implementation, to: (@convention(c) (AnyObject, Selector) -> AnyObject).self) let workspace = function(`class`, selector) 1SJWBUF"1*ͷݺͼग़͠ํ *.1Λ௚઀ݺͿʢؔ਺ϙΠϯλݺͼग़͠ʣ
  5. let target: AnyObject = workspace let selector = NSSelectorFromString("openApplicationWithBundleID:") guard

    target.responds(to: selector) else { return } let implementation = target.method(for: selector) let function = unsafeBitCast(implementation, to: (@convention(c) (AnyObject, Selector, String) -> Void).self) function(target, selector, "com.apple.Fitness") 1SJWBUF"1*ͷݺͼग़͠ํ *.1Λ௚઀ݺͿʢؔ਺ϙΠϯλݺͼग़͠ʣ
  6. let target = view.window! let selector = NSSelectorFromString("_setRotatableViewOrientation:updateStatusBar:duration:force:") guard target.responds(to:

    selector) else { return } let implementation = target.method(for: selector) let function = unsafeBitCast( implementation, to: (@convention(c) (AnyObject, Selector, UInt64, Bool, Double, Bool) -> Void).self ) function(target, selector, 4, true, 0.5, true) 1SJWBUF"1*ͷݺͼग़͠ํ *.1Λ௚઀ݺͿʢؔ਺ϙΠϯλݺͼग़͠ʣ
  7. let path = "/System/Library/PrivateFrameworks/CoreSVG.framework/CoreSVG" guard let handler = dlopen(path, RTLD_NOW)

    else { fatalError(String(cString: dlerror())) } 1SJWBUF"1*ͷݺͼग़͠ํ ϑϨʔϜϫʔΫΛಈతʹಡΈࠐΉ
  8. @objc class CGSVGDocument: NSObject {} typealias CreateFn = @convention(c) (CFData?,

    CFDictionary?) -> Unmanaged<CGSVGDocument>? guard let p = dlsym(handler, "CGSVGDocumentCreateFromData") else { fatalError(String(cString: dlerror())) } let CGSVGDocumentCreateFromData = unsafeBitCast(p, to: CreateFn.self) ؔ਺ͷγϯϘϧΛऔಘ͢Δ 1SJWBUF"1*ͷݺͼग़͠ํ
  9. let path = URL(fileURLWithPath: "/System/Library/PrivateFrameworks/CoreSVG.framework") guard let cf = CFBundleCreate(kCFAllocatorDefault,

    path as CFURL) else { return } guard CFBundleLoadExecutable(cf) else { return } EMPQFOEMTZN#VOEMF"1* 1SJWBUF"1*ͷݺͼग़͠ํ
  10. @objc class CGSVGDocument: NSObject {} typealias CreateFn = @convention(c) (CFData?,

    CFDictionary?) -> Unmanaged<CGSVGDocument>? let p = CFBundleGetFunctionPointerForName(cf, "CGSVGDocumentCreateFromData" as CFString) guard let p else { return } let CGSVGDocumentCreateFromData: CreateFn = unsafeBitCast(p, to: CreateFn.self) EMPQFOEMTZN#VOEMF"1* 1SJWBUF"1*ͷݺͼग़͠ํ
  11. let transition = CATransition() transition.type = .init(rawValue: "cube") transition.subtype =

    .fromLeft transition.duration = 0.6 view.window?.layer.add(transition, forKey: "") ެ։͞Εͯͳ͍&OVN΍ఆ਺ͷ஋Λ௚઀ࢦఆ͢Δ 1SJWBUF"1*ͷݺͼग़͠ํ