Подтвердить что ты не робот

IOS Anti-пиратство в Swift

Во-первых, позвольте мне сказать, что я понимаю, что использование PT_DENY_ATTACH, как описано в: Отключение отладчиков довольно бесполезно.

Однако, чтобы понять, как работает iOS, мне все равно хотелось бы знать: возможно ли что-то подобное при работе над проектом Swift? Поскольку Objective-C построен на C, существует функция main(int argc, char *argv[]), которая может быть использована для предотвращения присоединения gdb к процессу.

Как это сделать в Swift? В основном я стараюсь понять жизненный цикл приложения в Swift, однако большинство объяснений, которые я могу найти, для ObjC.

4b9b3361

Ответ 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)
)

Благодаря ответам здесь и здесь