iOS安全防护系列之字符串及系统函数隐藏详解

前言

用hopper打开macho文件可以看出你具体函数跳转与字符串的使用,那么在项目中,你的加密Key就容易泄漏,你使用的加密方法如果是系统的,那么可以被fishhook给hook住,所以字符串和系统方法的隐藏可以作为安全防护的一环。

一 字符串加密

如果你使用对称加密,你的秘钥很可能被macho文件暴露

要想字符串不进常量区,可以先用一个字符去异或,然后再异或回来,字符串直接换算,就不会被macho暴露。

//测试环境
static NSString * KEY(){
 unsigned char key[] = {
  (pw_encrypt_key ^ 'a'),(pw_encrypt_key ^ '2'),(pw_encrypt_key ^ 's'),(pw_encrypt_key ^ '5'),(pw_encrypt_key ^ '4'),(pw_encrypt_key ^ 'b'),
  (pw_encrypt_key ^ 'e'),(pw_encrypt_key ^ '5'),(pw_encrypt_key ^ 'f'),(pw_encrypt_key ^ '3'),(pw_encrypt_key ^ 'f'),(pw_encrypt_key ^ '4'),
  (pw_encrypt_key ^ 'f'),
  (pw_encrypt_key ^ '\0')
 };
 unsigned char *p = key;
 while (((*p) ^= pw_encrypt_key) != '\0') {
  p++;
 }
 return [NSString stringWithUTF8String:(const char *)key];
}

二 隐藏系统函数

当你调用系统函数加密是,macho是可以找到对应的函数跳转的:

要想隐藏系统函数,可以直接从库里面找到函数句柄,然后调用函数指针进行加密。

1、找到库

下符号断点,找到自己的加密函数CCCryptorCreate;

然后lldb调试:(lldb) image list;

找到libcommonCrypto.dylib库在:[ 39] 50EEB933-DCEB-3AA2-8A43-DD3A791139CE 0x0000000182e1e000 /Users/mac/Library/Developer/Xcode/iOS DeviceSupport/11.3 (15E216)/Symbols/usr/lib/system/libcommonCrypto.dylib

libcommonCrypto.dylib的位置是:/usr/lib/system/libcommonCrypto.dylib

2、获取句柄

#import <dlfcn.h>
//句柄
 void * handle = dlopen("/usr/lib/system/libcommonCrypto.dylib",RTLD_LAZY);

RTLD_LAZY:懒加载表

3、获取加密函数

 unsigned char str[] = {
  ('a' ^ 'C'),
  ('a' ^ 'C'),
  ('a' ^ 'C'),
  ('a' ^ 'r'),
  ('a' ^ 'y'),
  ('a' ^ 'p'),
  ('a' ^ 't'),
  ('a' ^ 'o'),
  ('a' ^ 'r'),
  ('a' ^ 'C'),
  ('a' ^ 'r'),
  ('a' ^ 'e'),
  ('a' ^ 'a'),
  ('a' ^ 't'),
  ('a' ^ 'e'),
  ('a' ^ '\0')
 };
 unsigned char * p = str;
 while (((*p) ^= 'a') != '\0') p++;
CCCryptorStatus (* CCCryptorCreate_p)(
         CCOperation op,    /* kCCEncrypt, etc. */
         CCAlgorithm alg,   /* kCCAlgorithmDES, etc. */
         CCOptions options,   /* kCCOptionPKCS7Padding, etc. */
         const void *key,   /* raw key material */
         size_t keyLength,
         const void *iv,    /* optional initialization vector */
         CCCryptorRef *cryptorRef) /* RETURNED */
 __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0) = dlsym(handle, (const char *)str);

4、用函数指针加密

 status = CCCryptorCreate_p( kCCEncrypt, algorithm, options,
         [keyData bytes], [keyData length], [ivData bytes],
         &cryptor );

结果如下

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • iOS安全防护系列之重签名防护与sysctl反调试详解

    一 重签名防护 想自己的app不被重签名,可以在代码中检测签名信息,然后采取措施. 1.查看证明组织单位 或者进入.app的包内容,查看embedded.mobileprovision信息security cms -D -i embedded.mobileprovision 找到<key>application-identifier</key>的value的第一部分就是 2.利用签名信息进行重签名防护 void checkCodesign(NSString *id){ // 描述文

  • iOS安全防护系列之ptrace反调试与汇编调用系统方法详解

    关于系统调用 ptrace是一个系统调用.那系统调用是什么东东呢?它是一个系统提供的很强大的底层服务.用户层的框架是构建在system call之上的. macOS Sierra大约提供了500个系统调用.通过以下命令来了解你系统上的系统调用的个数: ➜ ~ sudo dtrace -ln 'syscall:::entry' | wc -l 这个命令使用了另外一个更强大的工具叫DTrace,暂不详谈它. 一 lldb调试原理:debugserver 1.xcode的lldb之所以能调试app,是

  • iOS开发避免安全隐患的要点总结

    现在很多iOS的APP没有做任何的安全防范措施,导致存在很多安全隐患和事故,今天我们来聊聊iOS开发人员平时怎么做才更安全. 一.网络方面 用抓包工具可以抓取手机通信接口的数据.以Charles为例,用Charles可以获取http的所有明文数据,配置好它的证书后就可以模拟中间人攻击,获取https加密前的明文数据. 1.1 中间人攻击 先简要地说下什么是中间人攻击: ①客户端:"我是客户端,给我你的公钥" -> 服务端(被中间人截获). 所以现在是: 客户端->中间人 ②

  • 探究iOS多线程究竟不安全在哪里?

    前言 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从Property的多线程安全说起. Property 当我们讨论property多线程安全的时候,很多人都知道给property加上atomic attribute之后,可以一定程度的保障多线程安全,类似: @property (atomic, strong) NSString* userName; 事情并没有看上去这么简单,要分析property在多线程场景下的表现,需要先对property的类

  • 详解Nginx服务器和iOS的HTTPS安全通信

    详解Nginx服务器和iOS的HTTPS安全通信 简介 在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一般是使用一个变化的参数,例如RSA加密的时间戳,但考虑到网络传输时延,时间戳需要有一定的误差容限,这样仍然不能从根本上防止重放攻击.想要较好的解决重放攻击问题,应考虑使用HTTPS通信,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,比HTTP协议安全. 实现 对于用浏览器访问的网站,需要向CA申请证书才能保证HTTPS的网

  • iOS中多网络请求的线程安全详解

    前言 在iOS 网络编程有一种常见的场景是:我们需要并行处理二个请求并且在都成功后才能进行下一步处理.下面是部分常见的处理方式,但是在使用过程中也很容易出错: DispatchGroup:通过 GCD 机制将多个请求放到一个组内,然后通过 DispatchGroup.wait() 和 DispatchGroup.notify() 进行成功后的处理. OperationQueue:为每一个请求实例化一个 Operation 对象,然后将这些对象添加到 OperationQueue ,并且根据它们之

  • 浅析iOS应用开发中线程间的通信与线程安全问题

    线程间的通信   简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信   线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务   线程间通信常用方法 复制代码 代码如下: - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelecto

  • iOS开发中多线程的安全隐患总结

    资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 一.解决方案 解决方案:使用线程同步技术(同步,就是协同步调,按预定的先后次序进行) 常见的线程同步技术是:加锁 1.OSSpinLock OSSpinLock叫做"自旋锁",等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源 目前已经不再安全,可能会出现优先级反转问题 如果等待

  • iOS安全防护系列之字符串及系统函数隐藏详解

    前言 用hopper打开macho文件可以看出你具体函数跳转与字符串的使用,那么在项目中,你的加密Key就容易泄漏,你使用的加密方法如果是系统的,那么可以被fishhook给hook住,所以字符串和系统方法的隐藏可以作为安全防护的一环. 一 字符串加密 如果你使用对称加密,你的秘钥很可能被macho文件暴露 要想字符串不进常量区,可以先用一个字符去异或,然后再异或回来,字符串直接换算,就不会被macho暴露. //测试环境 static NSString * KEY(){ unsigned ch

  • ABP(现代ASP.NET样板开发框架)系列之二、ABP入门教程详解

    ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate ABP 的由来 "DRY--避免重复

  • Python学习之字符串函数使用详解

    目录 1 搜索字符串函数 2 设置字符串格式函数 3 改变字符串大小写函数 4 选定字符串函数 5 拆分字符串函数 6 替换字符串函数 Python的友好在于提供了非常好强大的功能函数模块,对于字符串的使用,同样提供许多简单便捷的字符串函数.Python 字符串自带了很多有用的函数,在字符串函数之前先介绍一个非常实用的dir()内置函数,因为对每一个初学者还是大佬级别的python程序员,都不能完全记住所有方法.而该函数可以查看所有这些函数,可调用 dir 并将参数指定为任何字符串(如 dir(

  • 低门槛开发iOS、Android、小程序应用的前端框架详解

    现如今跨平台开发技术已不是什么新鲜话题了,在市面上也有一些开源的框架可供选择,然而技术成熟.产品服务健全的平台并不多,其中也不乏推陈出新的框架值得关注. 比如最近使用的AVM,由APICloud迭代推出的多端开发框架,基于JavaScript,兼容多语法,如果是Vue.React的用户,可直接上手,没什么学习成本,具备虚拟DOM,可一次编写多端渲染:主要是APICloud上线已有7年,相对已经成熟,所以我把自己的一些认知和实践结合AVM官方文档的内容做了一下整理,希望能对需要使用跨平台开发技术的

  • iOS开发retina屏幕下的点与像素关系详解

    目录 引言 I iOS中点与像素有什么关系? II 图片使用的相关注意事项 2.1 推荐使用png格式 2.2 关于图像的实例化 2.3 动画结束之后清除帧动画数组 III 设置状态栏字体颜色 3.1 方式一 3.2 方式二 see also 引言 提交app store的时候 需要一张1024*1024的 如果不设置这两种的尺寸启动页的话,在4英寸.3.5英寸的设备上展示不了启动页,app 的高度也默认都是矮的960px.** 注意@3x 提供给开发的px 为12422208 ,但真实的px

  • Node.js实战之Buffer和Stream模块系统深入剖析详解

    目录 正文 写入缓冲区 从流中读取数据 管道流 链式流 模块系统 正文 JavaScript语言本身只有字符串数据类型,没有二进制数据类型. 但是,在处理TCP流或文件流时必须使用二进制数据. 因此,在node JS中,定义了一个缓冲区类来创建用于存储二进制数据的缓冲区. const buf = Buffer.from('runoob', 'ascii'); 在node JS中,缓冲区类是与node内核一起发布的核心库. 缓冲库是node JS带来的一种存储原始数据的方法,它允许节点JS. co

  • Android系统对话框使用详解(最详细)

    在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现. 目录 一.系统对话框的几种类型与实现 在项目的实际开发中,用到的系统对话框几乎是没有的.原因大概包含以下几点: 样式过于单一,不能满足大部分实际项目中的需求. 对话框的样式会根据手机系统版本的不同而变化.不能达到统一的样式. 能实现的功能过于简单. 在这里先附

  • iOS开发中以application/json上传文件实例详解

    本文通过实例代码给大家讲解iOS中以application/json上传文件的形式,具体内容详情大家参考下本文. 在和sever后台交互的过程中.有时候.他们需要我们iOS开发者以"application/json"形式上传. NSString *accessUrl = [NSString stringWithFormat:@"%@/xxx",@"https://www.xxxxx.com:xxxx"]; NSMutableURLRequest

  • IOS 简单的本地json格式文件解析的实例详解

    IOS 简单的本地json格式文件解析的实例详解 ljweibo.json文件 { "data":[{ "name" : "孙悟空", "content" : "7月12日的国务院常务会议上,李克强明确要求,要将已审议的<快递条例(草案)>向社会公开征求意见.在会上,总理说了这么一段话:"几年前,快递业刚刚开始发展的时候,有些城市不允许快递存在,理由是影响市容整洁,快递员骑的摩的也不允许停放.但

  • iOS Webview自适应实际内容高度的4种方法详解

    //第一种方法 - (void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat webViewHeight=[webView.scrollView contentSize].height; CGRect newFrame = webView.frame; newFrame.size.height = webViewHeight; webView.frame = newFrame; _webTablewView.contentSize = C

随机推荐