Swift 中的 iOS 反盗版
Posted
技术标签:
【中文标题】Swift 中的 iOS 反盗版【英文标题】:iOS Anti-piracy in Swift 【发布时间】:2015-04-23 14:11:10 【问题描述】:首先,让我说我了解使用 PT_DENY_ATTACH 如下所述:
Bugging Debuggers 非常没用。
但是,为了了解 ios 的工作原理,我仍然想知道:在处理 Swift 项目时是否可以做类似的事情?由于 Objective-C 是基于 C 构建的,因此可以利用 main(int argc, char *argv[])
函数来防止 gdb 附加到进程。
这将如何在 Swift 中完成?我主要是想了解 Swift 中的应用程序生命周期,但是,我能找到的大多数解释都是针对 ObjC 的。
【问题讨论】:
this question 的答案可能会有所帮助。 这个答案其实对理解很有帮助。似乎生命周期是一样的。然而,Swift 隐藏了@UIApplicationMain 指令后面的一些实现。 【参考方案1】:感谢用户 ahruss 提供的非常有用的链接,这是我找到的解决方案:
我使用this question 中引用的方法创建了一个 main.swift 文件。然后我创建了一个包含此方法定义的 c 文件(和头文件):
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 头文件,然后在 main.swift 中的 UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
调用上方直接调用 disable_attach()
。
您最终应该得到一个类似于此的 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
指令隐藏了 main 文件本身。
更新:从 Xcode 10\iOS 12 开始,main.swift 文件应如下所示:
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
nil, NSStringFromClass(AppDelegate.self)
)
感谢here 和here 的回答
【讨论】:
如果我理解你所做的正确,这仍然可以被规避 - 一旦攻击者发现发生了什么,他会简单地跳过函数调用。您可以尝试一些更复杂的方法,例如不明显的崩溃路径(当您发现自己正在被调试并希望让攻击者不知道究竟是什么时候发生的)结合不明显的调试器检测比如测量代码执行时间,或者像自我调试这样奇怪和意想不到的事情。问题是,任何顽强和足够的人都会破坏任何防御......所以一定不要太高调=) @Mints97 你完全正确。 PT_DENY_ATTACH 方法不再被认为是有用的(this link 将其列为“已弃用或不工作”),但是,它为理解 Swift 和基于 ObjC 的 iOS 应用程序之间的差异提供了一个很好的用例。 @Stephen 有没有可以替代 PT_DENY_ATTACH 的解决方案? @RyanHeitner 据我所知,没有更好的解决方案。这很容易解决,但至少是一种威慑。最好使用一组解决方案来提高您的应用安全性并确保任何敏感数据都被加密或根本不存储。 我可以使用此代码将应用发布到应用商店吗?也就是说,苹果允许吗?以上是关于Swift 中的 iOS 反盗版的主要内容,如果未能解决你的问题,请参考以下文章
swift 3中的ResponseCollectionSerializable