Swift中的iOS反盗版

Ste*_*hen 12 ios swift

首先,让我说我明白使用PT_DENY_ATTACH如下所述: Bugging Debuggers是没用的.

但是,为了理解iOS的工作原理,我仍然想知道:在处理Swift项目时是否可以做类似的事情?由于Objective-C是基于C构建的,因此main(int argc, char *argv[])可以利用一个函数来阻止gdb附加到进程.

如何在Swift中完成?我主要是想了解Swift中的应用程序生命周期,但是,我能找到的大多数解释都是针对ObjC的.

Ste*_*hen 13

感谢用户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);
}
Run Code Online (Sandbox Code Playgroud)

我在我的桥接头中添加了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)
)
Run Code Online (Sandbox Code Playgroud)

正如我之前在评论中所述,似乎生命周期是相同的,但该@UIApplicationMain指令隐藏了文件本身.