diff --git a/Package.resolved b/Package.resolved index 92d4d84..6dc81ef 100644 --- a/Package.resolved +++ b/Package.resolved @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/p-x9/MachOKit-SPM", "state" : { - "revision" : "1b9ffa804c5bb35fefa0e126c1ea1c2c8c23a3e3", - "version" : "0.4.0" + "revision" : "4a5d0620e6cf107916459f0489b436c034e4157d", + "version" : "0.12.0" } }, { diff --git a/Package.swift b/Package.swift index 635d256..41694b6 100644 --- a/Package.swift +++ b/Package.swift @@ -13,7 +13,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/p-x9/fishhook", branch: "spm"), .package(url: "https://github.com/p-x9/Echo", branch: "swift5.9"), - .package(url: "https://github.com/p-x9/MachOKit-SPM", .upToNextMajor(from: "0.4.0")) + .package(url: "https://github.com/p-x9/MachOKit-SPM", .upToNextMajor(from: "0.12.0")) ], targets: [ .target( diff --git a/Sources/SwiftHook/SwiftHook+function.swift b/Sources/SwiftHook/SwiftHook+function.swift index 8cf7861..e0bf85c 100644 --- a/Sources/SwiftHook/SwiftHook+function.swift +++ b/Sources/SwiftHook/SwiftHook+function.swift @@ -44,28 +44,28 @@ extension SwiftHook { var firstSymbol: UnsafeMutableRawPointer? var secondSymbol: UnsafeMutableRawPointer? - for i in 0..<_dyld_image_count() { - let machO = MachOImage(ptr: _dyld_get_image_header(i)) - if let symbol = machO.symbol( - named: first, - mangled: isMangled - ) { - firstSymbol = .init( - mutating: machO.ptr.advanced(by: symbol.offset) - ) - first = String(cString: symbol.nameC + 1) - } - if let symbol = machO.symbol( - named: second, - mangled: isMangled - ) { - secondSymbol = .init( - mutating: machO.ptr.advanced(by: symbol.offset) - ) - second = String(cString: symbol.nameC + 1) - } + if let (machO, symbol) = MachOImage.symbols( + named: first, + mangled: isMangled + ).first(where: { + $1.nlist.sectionNumber != nil + }) { + firstSymbol = .init( + mutating: machO.ptr.advanced(by: symbol.offset) + ) + first = String(cString: symbol.nameC + 1) + } - if firstSymbol != nil && secondSymbol != nil { break } + if let (machO, symbol) = MachOImage.symbols( + named: second, + mangled: isMangled + ).first(where: { + $1.nlist.sectionNumber != nil + }) { + secondSymbol = .init( + mutating: machO.ptr.advanced(by: symbol.offset) + ) + second = String(cString: symbol.nameC + 1) } if firstSymbol == nil && secondSymbol == nil { diff --git a/Sources/SwiftHook/SwiftHook+method.swift b/Sources/SwiftHook/SwiftHook+method.swift index 7aed7ee..89eca81 100644 --- a/Sources/SwiftHook/SwiftHook+method.swift +++ b/Sources/SwiftHook/SwiftHook+method.swift @@ -50,22 +50,31 @@ extension SwiftHook { var secondEntry: UnsafeMutablePointer? for entry in metadata.vtable { - var info = Dl_info() - dladdr(unsafeBitCast(entry.pointee, to: UnsafeRawPointer.self), &info) - guard let dli_sname = info.dli_sname else { + let entryPtr = unsafeBitCast(entry.pointee, to: UnsafeRawPointer.self) + guard let (_, symbol) = MachOImage.symbol(for: entryPtr) else { continue } - let mangled = String(cString: dli_sname) - let demangled = stdlib_demangleName(mangled) - if mangled == first || demangled == first { - firstEntry = entry + // mangled + var mangled = String(cString: symbol.nameC) + if mangled == first { firstEntry = entry } + if mangled == second { secondEntry = entry } + if firstEntry != nil && secondEntry != nil { + break } - if mangled == second || demangled == second { - secondEntry = entry + // mangled (omitted first `_`) + mangled = String(cString: symbol.nameC + 1) + if mangled == first { firstEntry = entry } + if mangled == second { secondEntry = entry } + if firstEntry != nil && secondEntry != nil { + break } + // demangled + let demangled = stdlib_demangleName(mangled) + if demangled == first { firstEntry = entry } + if demangled == second { secondEntry = entry } if firstEntry != nil && secondEntry != nil { break }