From 37bc808c5a1c7036eca046f1b25466e1a6b99115 Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Mon, 5 Feb 2024 20:38:30 +0900 Subject: [PATCH 1/8] bump `MachOKit-SPM` version to 0.10.0 --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index 92d4d84..5aae156 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" : "f5528db21fe1a07b7c12e40967bf056a9b0a15c6", + "version" : "0.10.0" } }, { diff --git a/Package.swift b/Package.swift index 635d256..45ba5bc 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.10.0")) ], targets: [ .target( From c6761af5adac64d97942b6114621bdd337adafbd Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:12:58 +0900 Subject: [PATCH 2/8] fix to exclude `NO_SECT` --- Sources/SwiftHook/SwiftHook+function.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftHook/SwiftHook+function.swift b/Sources/SwiftHook/SwiftHook+function.swift index 8cf7861..1ee2a3e 100644 --- a/Sources/SwiftHook/SwiftHook+function.swift +++ b/Sources/SwiftHook/SwiftHook+function.swift @@ -49,7 +49,7 @@ extension SwiftHook { if let symbol = machO.symbol( named: first, mangled: isMangled - ) { + ), symbol.nlist.sectionNumber != nil { firstSymbol = .init( mutating: machO.ptr.advanced(by: symbol.offset) ) @@ -58,7 +58,7 @@ extension SwiftHook { if let symbol = machO.symbol( named: second, mangled: isMangled - ) { + ), symbol.nlist.sectionNumber != nil { secondSymbol = .init( mutating: machO.ptr.advanced(by: symbol.offset) ) From 55bb39e903e82db5cdb9ff8ccb66460ed1b9639a Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:21:21 +0900 Subject: [PATCH 3/8] refactor check for symbol name --- Sources/SwiftHook/SwiftHook+method.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Sources/SwiftHook/SwiftHook+method.swift b/Sources/SwiftHook/SwiftHook+method.swift index 7aed7ee..cf5de28 100644 --- a/Sources/SwiftHook/SwiftHook+method.swift +++ b/Sources/SwiftHook/SwiftHook+method.swift @@ -55,17 +55,19 @@ extension SwiftHook { guard let dli_sname = info.dli_sname else { continue } - let mangled = String(cString: dli_sname) - let demangled = stdlib_demangleName(mangled) - - if mangled == first || demangled == first { - firstEntry = entry - } - if mangled == second || demangled == second { - secondEntry = entry + // mangled + let mangled = String(cString: dli_sname) + 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 } From f65a1d9d6832b64fb96ca474d6ceea6feb7b92a6 Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Sat, 10 Feb 2024 00:48:45 +0900 Subject: [PATCH 4/8] bump `MachOKit` version to 0.11.0 --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index 5aae156..1c2dd21 100644 --- a/Package.resolved +++ b/Package.resolved @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/p-x9/MachOKit-SPM", "state" : { - "revision" : "f5528db21fe1a07b7c12e40967bf056a9b0a15c6", - "version" : "0.10.0" + "revision" : "40e95b90603392b4aebc5d200b10126ab800d02e", + "version" : "0.11.0" } }, { diff --git a/Package.swift b/Package.swift index 45ba5bc..89c6873 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.10.0")) + .package(url: "https://github.com/p-x9/MachOKit-SPM", .upToNextMajor(from: "0.11.0")) ], targets: [ .target( From 2df5a4c25c19f8da5e9cde72b8c4b9b13ee08594 Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Sat, 10 Feb 2024 01:51:38 +0900 Subject: [PATCH 5/8] bump `MachOKit` version to 0.11.1 --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index 1c2dd21..df9639e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/p-x9/MachOKit-SPM", "state" : { - "revision" : "40e95b90603392b4aebc5d200b10126ab800d02e", - "version" : "0.11.0" + "revision" : "a6e6af688bbfecec6aaa22ebdab6f3b76983327f", + "version" : "0.11.1" } }, { diff --git a/Package.swift b/Package.swift index 89c6873..0840476 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.11.0")) + .package(url: "https://github.com/p-x9/MachOKit-SPM", .upToNextMajor(from: "0.11.1")) ], targets: [ .target( From 106eaf5badaf9534a8d9bb9d5c99ce371d799635 Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:52:29 +0900 Subject: [PATCH 6/8] bump `MachOKit` version to 0.12.0 --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index df9639e..6dc81ef 100644 --- a/Package.resolved +++ b/Package.resolved @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/p-x9/MachOKit-SPM", "state" : { - "revision" : "a6e6af688bbfecec6aaa22ebdab6f3b76983327f", - "version" : "0.11.1" + "revision" : "4a5d0620e6cf107916459f0489b436c034e4157d", + "version" : "0.12.0" } }, { diff --git a/Package.swift b/Package.swift index 0840476..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.11.1")) + .package(url: "https://github.com/p-x9/MachOKit-SPM", .upToNextMajor(from: "0.12.0")) ], targets: [ .target( From b43dce4ad91952f4629c62939eef864b40d8c398 Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:59:46 +0900 Subject: [PATCH 7/8] Improved symbol search by name for function implementation exchange --- Sources/SwiftHook/SwiftHook+function.swift | 42 +++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Sources/SwiftHook/SwiftHook+function.swift b/Sources/SwiftHook/SwiftHook+function.swift index 1ee2a3e..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 - ), symbol.nlist.sectionNumber != nil { - firstSymbol = .init( - mutating: machO.ptr.advanced(by: symbol.offset) - ) - first = String(cString: symbol.nameC + 1) - } - if let symbol = machO.symbol( - named: second, - mangled: isMangled - ), symbol.nlist.sectionNumber != nil { - 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 { From 38abe8050932b5f8cb00de06a1f54ce71d334353 Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Sun, 11 Feb 2024 01:30:34 +0900 Subject: [PATCH 8/8] improved symbol search by pointer for method implementation exchange --- Sources/SwiftHook/SwiftHook+method.swift | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Sources/SwiftHook/SwiftHook+method.swift b/Sources/SwiftHook/SwiftHook+method.swift index cf5de28..89eca81 100644 --- a/Sources/SwiftHook/SwiftHook+method.swift +++ b/Sources/SwiftHook/SwiftHook+method.swift @@ -50,14 +50,21 @@ 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 } // mangled - let mangled = String(cString: dli_sname) + var mangled = String(cString: symbol.nameC) + if mangled == first { firstEntry = entry } + if mangled == second { secondEntry = entry } + if firstEntry != nil && secondEntry != nil { + break + } + + // mangled (omitted first `_`) + mangled = String(cString: symbol.nameC + 1) if mangled == first { firstEntry = entry } if mangled == second { secondEntry = entry } if firstEntry != nil && secondEntry != nil {