Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 21 additions & 16 deletions Sources/SwiftHook/SwiftHook+function.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ extension SwiftHook {
throw SwiftHookError.failedToExchangeFuncImplementation
}


public static func hookFunction(
_ target: String,
_ replacement: String,
Expand Down Expand Up @@ -130,6 +129,12 @@ extension SwiftHook {
return (firstSymbol, secondSymbol)
}

}

extension SwiftHook {
private static var replaced1: UnsafeMutableRawPointer?
private static var replaced2: UnsafeMutableRawPointer?

@discardableResult
private static func _exchangeFuncImplementation(
_ first: String,
Expand All @@ -144,37 +149,38 @@ extension SwiftHook {
print(firstSymbol, secondSymbol)
#endif

var replaced1 = UnsafeMutableRawPointer(bitPattern: -1)
var replaced2 = UnsafeMutableRawPointer(bitPattern: -1)

// hook first function
Self.replaced1 = nil
let f2s: Bool = rebindSymbol(
name: first,
replacement: secondSymbol,
replaced: &replaced1
replaced: &Self.replaced1
)

// hook second function
Self.replaced2 = nil
let s2f: Bool = rebindSymbol(
name: second,
replacement: firstSymbol,
replaced: &replaced2
replaced: &Self.replaced2
)

guard f2s && s2f else {
return false
}

guard let replaced1,
Int(bitPattern: replaced1) != -1 else {
guard Self.replaced1 != nil else {
throw SwiftHookError.failedToHookFirstFunction
}

guard let replaced2,
Int(bitPattern: replaced2) != -1 else {
guard Self.replaced2 != nil else {
throw SwiftHookError.failedToHookSecondFunction
}

return true
}
}

extension SwiftHook {
@discardableResult
private static func _hookFuncImplementation(
_ target: String,
Expand All @@ -193,23 +199,22 @@ extension SwiftHook {
print(stdlib_demangleName(replacement))
#endif

var replaced = UnsafeMutableRawPointer(bitPattern: -1)

Self.replaced1 = nil
let result: Bool = rebindSymbol(
name: target,
replacement: replacementSymbol,
replaced: &replaced
replaced: &Self.replaced1
)

guard result else { return false }

guard let replaced,
Int(bitPattern: replaced) != -1 else {
guard let replaced = Self.replaced1 else {
return false
}

if let original {
var originalReplaced = UnsafeMutableRawPointer(bitPattern: -1)
var originalReplaced: UnsafeMutableRawPointer?
let result: Bool = rebindSymbol(
name: original,
replacement: replaced,
Expand Down