专栏首页一个番茄说Swift中防止ptrace依附

Swift中防止ptrace依附

在移动开发中,安全是一个很重要的话题,当然安全是没有绝对的,只能说尽可能的提高安全性。在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不被调试器跟踪。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 发行数字货币难么?

    2018年互联网的第一次号角吹响了,区块链三个字从各个角落开始涌向人们的实现。我们看到了很多有意思的现象,比如柯达发布“柯达币”股价大涨130%,网易准备发布基...

    100000798482
  • 一个extension让你在Swift中用NSTimer更少操心

    它会持有target的引用计数,不出意外的话你的target还会持有它的引用计数。另外,还会被runloop持有它的引用计数。

    100000798482
  • 函数响应式编程框架RxSwift 学习——Observable

    最近开始研究RxSwift,网上能查到的资料太有限,边学边记录,有不对的地方欢迎大家指正。

    100000798482
  • Java之Annotation简易上手实践

    在做Java中Spring全家桶是大家的必选,它淘汰了竞争对手Struts(也挺优秀的)成为Java开发的首选。而我们在做Spring开发时遇到一大堆的为我们带...

    大话swift
  • Fiori应用的书签模式 - bookmark

    Fiori和WebUI相比,一个突出feature是支持bookmark,即Fiori里view的每个状态都有一个unique的url与之对应-technica...

    Jerry Wang
  • Go-for循环

    小小咸鱼YwY
  • get_template_part()调用自定义模板|wordpress函数

      我们在用wordpress开发主题的时候,可能需要调用一段固定的代码比如左侧菜单,这段代码会在主页、栏目页、文章页用到,如果直接写入每个页面模板是没有问题,...

    ytkah
  • Apache 伪静态处理跳转中传递参数

    下面对比一下,看第一个配置文件 # 将 RewriteEngine 模式打开 RewriteEngine On RewriteBase / RewriteC...

    小小科
  • 预测未来的公司有何过人之处?

    大数据文摘
  • nodejs模板引擎ejs

    nodejs的后台模板引擎主要分为两种ejs和jade.简单说一下两者区别吧,ejs学习成本低,效率不是很高(主要是先把模板中内容解析字符串),jade学习成本...

    十月梦想

扫码关注云+社区

领取腾讯云代金券