Во-первых, позвольте мне сказать, что я понимаю, что использование PT_DENY_ATTACH, как описано в:
Отключение отладчиков довольно бесполезно.
Однако, чтобы понять, как работает iOS, мне все равно хотелось бы знать: возможно ли что-то подобное при работе над проектом Swift? Поскольку Objective-C построен на C, существует функция main(int argc, char *argv[])
, которая может быть использована для предотвращения присоединения gdb к процессу.
Как это сделать в Swift? В основном я стараюсь понять жизненный цикл приложения в Swift, однако большинство объяснений, которые я могу найти, для ObjC.
IOS Anti-пиратство в Swift
Ответ 1
Благодаря пользователю ahruss очень полезная ссылка, вот решение, которое я нашел:
Я использовал метод, указанный в этом вопросе, для создания файла main.swift. Затем я создал файл AC (и заголовок), содержащий определение этого метода:
typedef int (*command_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif
//Anti-debug method
void disable_attach() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
command_ptr_t command_ptr = dlsym(handle, "ptrace");
command_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
Я добавил заголовочный файл disableAttach.h в свой мостовой заголовок, а затем вызвал disable_attach()
прямо над моим UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
в main.swift.
Вы должны получить файл main.swift, подобный следующему:
import Foundation
import UIKit
disable_attach()
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
nil,
NSStringFromClass(AppDelegate.self)
)
Как я уже говорил ранее в комментарии, кажется, что жизненный цикл такой же, но директива @UIApplicationMain
скрывает основной файл.
ОБНОВЛЕНИЕ: Начиная с Xcode 10\iOS 12, файл main.swift должен выглядеть следующим образом:
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
nil, NSStringFromClass(AppDelegate.self)
)