static func amIRuntimeHook(
dyldAllowList: [String],
detectionClass: AnyClass,
selector: Selector,
isClassMethod: Bool
) -> Bool {
var method: Method?
if isClassMethod {
method = class_getClassMethod(detectionClass, selector)
} else {
method = class_getInstanceMethod(detectionClass, selector)
}
guard let method = method else {
// method not found
return true
}
let imp = method_getImplementation(method)
var info = Dl_info()
_ = swiftOnceDenyFishHooK
// dladdr will look through vm range of allImages for vm range of an Image that contains pointer
// of method and return info of the Image
if dladdr(UnsafeRawPointer(imp), &info) != 1 {
return false
}
Как dladdr(UnsafeRawPointer(imp), &info) != 1 гарантирует, что функция не подключена?
Ссылка: https://github.com/securing/IOSSecuritySuite/blob/master/IOSSecuritySuite/RuntimeHookChecker.swift





Перехват осуществляется путем внедрения дополнительной динамической библиотеки, которая определяет символ. Если dladdr возвращает 0, значит, символ не найден ни в одной динамической библиотеке. Обычно это означает, что он определен непосредственно в исполняемом файле (включая статическую библиотеку). С правильными флагами компоновщика вы иногда все равно можете получить эти символы с помощью dladdr, но если возвращаемое значение равно 0, оно получено не из динамической библиотеки и поэтому не перехватывается таким образом.
Обычно dladdr обещает вернуть «ненулевое значение», если оно найдено. Поэтому я не уверен, почему это проверяется явно для != 1, а не для == 0. Мне это кажется хрупким, учитывая, что это не удается «открыть» (т. е. позволяет запустить код). Но, по крайней мере, он пытается это сделать.