在移动开发中,安全是一个很重要的话题,当然安全是没有绝对的,只能说尽可能的提高安全性。在iOS的开发中,为了防止别人窥视我们的App,我们得采用一些手段来进行防范。
当“坏人”拿到我们的App以后,最想干的事情一定是想看看我们App的内部构造。这个时候调试器就起了大作用了,无论GDB还是LLVM,都是通用的工具。在这里我们要做一点防范措施,防止别人能够轻易的窥视应用的内部,这里主要是要防止ptrace【注:1】。当然这样做也只是稍微提高了一点点门槛而已,对于高手来说这样的手段简直是小菜一碟,你可以看看这里如何调试防止ptrace依附的App。
我们需要在程序开始处加上防止ptrace的代码,那么问题来了,程序的入口在哪里?
在之前使用OC开发的时候,由于OC是在C语言的基础上发展起来的,所以我们自然而然的会去找程序的main函数,然后在里面加上如下图的代码。
如图,在autorelease之前插入了执行的代码,所以一开始我就是拒绝的!
这里主要调用dlopen函数动态库,然后用dlsym获取到ptrace的函数指针,然后传入参数调用就可以禁止掉ptrace依附了。
然而在swift里面是没有main函数的,但是在AppDelegate里有个@UIApplicationMain,关于这个标签的更多解释请看苹果官方。如果去掉了这个标签的话,程序是跑不起来的,我们可以按照苹果的提示加上一个main.swift,写上如下的代码
```
autoreleasepool{
UIApplicationMain(Process.argc,Process.unsafeArgv,nil,NSStringFromClass(AppDelegate))
}
autoreleasepool{ UIApplicationMain(Process.argc,Process.unsafeArgv,nil,NSStringFromClass(AppDelegate)) }
这样子就和之前OC一样了,接下来就要在入口调用disable_gdb这个函数。因为在swift里没有办法像之前OC一样,import之后就直接开始使用C的函数库,需要创建创建一个C的源文件,里面写上disable_gdb这个函数的具体实现。然后XCode会自动给你生成一个{projectName}-Bridging-Header.h,再将函数的定义写在里面。接下来你就可以在main.swift里面加上disable_gdb()了。
整个demo在我的Github上,具体细节可以看看。
【注:1】具体说明这里。简单来说,调试器能够调试的原理,就是调试器的工作进程成为了你应用的跟踪进程,每当有中断发生的时候,内核会先去检测你当前的进程有没有被跟踪,如果有就先让你的跟踪进程做处理,从而达到调试的目的。防止依附就是要让你的app不被调试器跟踪。