Skip to content

Commit

Permalink
Merge pull request #1 from p-x9/refactor/symbol-search
Browse files Browse the repository at this point in the history
Improve symbol search
  • Loading branch information
p-x9 authored Feb 10, 2024
2 parents a0e55d0 + 38abe80 commit d89c409
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 33 deletions.
4 changes: 2 additions & 2 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
},
{
Expand Down
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
42 changes: 21 additions & 21 deletions Sources/SwiftHook/SwiftHook+function.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
27 changes: 18 additions & 9 deletions Sources/SwiftHook/SwiftHook+method.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,31 @@ extension SwiftHook {
var secondEntry: UnsafeMutablePointer<ClassMetadata.SIMP?>?

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
}
Expand Down

0 comments on commit d89c409

Please # to comment.