Skip to content

Commit d89c409

Browse files
authored
Merge pull request #1 from p-x9/refactor/symbol-search
Improve symbol search
2 parents a0e55d0 + 38abe80 commit d89c409

File tree

4 files changed

+42
-33
lines changed

4 files changed

+42
-33
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ let package = Package(
1313
dependencies: [
1414
.package(url: "https://github.com/p-x9/fishhook", branch: "spm"),
1515
.package(url: "https://github.com/p-x9/Echo", branch: "swift5.9"),
16-
.package(url: "https://github.com/p-x9/MachOKit-SPM", .upToNextMajor(from: "0.4.0"))
16+
.package(url: "https://github.com/p-x9/MachOKit-SPM", .upToNextMajor(from: "0.12.0"))
1717
],
1818
targets: [
1919
.target(

Sources/SwiftHook/SwiftHook+function.swift

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,28 @@ extension SwiftHook {
4444
var firstSymbol: UnsafeMutableRawPointer?
4545
var secondSymbol: UnsafeMutableRawPointer?
4646

47-
for i in 0..<_dyld_image_count() {
48-
let machO = MachOImage(ptr: _dyld_get_image_header(i))
49-
if let symbol = machO.symbol(
50-
named: first,
51-
mangled: isMangled
52-
) {
53-
firstSymbol = .init(
54-
mutating: machO.ptr.advanced(by: symbol.offset)
55-
)
56-
first = String(cString: symbol.nameC + 1)
57-
}
58-
if let symbol = machO.symbol(
59-
named: second,
60-
mangled: isMangled
61-
) {
62-
secondSymbol = .init(
63-
mutating: machO.ptr.advanced(by: symbol.offset)
64-
)
65-
second = String(cString: symbol.nameC + 1)
66-
}
47+
if let (machO, symbol) = MachOImage.symbols(
48+
named: first,
49+
mangled: isMangled
50+
).first(where: {
51+
$1.nlist.sectionNumber != nil
52+
}) {
53+
firstSymbol = .init(
54+
mutating: machO.ptr.advanced(by: symbol.offset)
55+
)
56+
first = String(cString: symbol.nameC + 1)
57+
}
6758

68-
if firstSymbol != nil && secondSymbol != nil { break }
59+
if let (machO, symbol) = MachOImage.symbols(
60+
named: second,
61+
mangled: isMangled
62+
).first(where: {
63+
$1.nlist.sectionNumber != nil
64+
}) {
65+
secondSymbol = .init(
66+
mutating: machO.ptr.advanced(by: symbol.offset)
67+
)
68+
second = String(cString: symbol.nameC + 1)
6969
}
7070

7171
if firstSymbol == nil && secondSymbol == nil {

Sources/SwiftHook/SwiftHook+method.swift

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,31 @@ extension SwiftHook {
5050
var secondEntry: UnsafeMutablePointer<ClassMetadata.SIMP?>?
5151

5252
for entry in metadata.vtable {
53-
var info = Dl_info()
54-
dladdr(unsafeBitCast(entry.pointee, to: UnsafeRawPointer.self), &info)
55-
guard let dli_sname = info.dli_sname else {
53+
let entryPtr = unsafeBitCast(entry.pointee, to: UnsafeRawPointer.self)
54+
guard let (_, symbol) = MachOImage.symbol(for: entryPtr) else {
5655
continue
5756
}
58-
let mangled = String(cString: dli_sname)
59-
let demangled = stdlib_demangleName(mangled)
6057

61-
if mangled == first || demangled == first {
62-
firstEntry = entry
58+
// mangled
59+
var mangled = String(cString: symbol.nameC)
60+
if mangled == first { firstEntry = entry }
61+
if mangled == second { secondEntry = entry }
62+
if firstEntry != nil && secondEntry != nil {
63+
break
6364
}
6465

65-
if mangled == second || demangled == second {
66-
secondEntry = entry
66+
// mangled (omitted first `_`)
67+
mangled = String(cString: symbol.nameC + 1)
68+
if mangled == first { firstEntry = entry }
69+
if mangled == second { secondEntry = entry }
70+
if firstEntry != nil && secondEntry != nil {
71+
break
6772
}
6873

74+
// demangled
75+
let demangled = stdlib_demangleName(mangled)
76+
if demangled == first { firstEntry = entry }
77+
if demangled == second { secondEntry = entry }
6978
if firstEntry != nil && secondEntry != nil {
7079
break
7180
}

0 commit comments

Comments
 (0)