iOS逆向研究01

==iOS逆向环境介绍==

* 越狱环境:iphone5s iOS 8.3*

luz-iphone:~ root# uname -a
Darwin luz-iphone 14.0.0 Darwin Kernel Version 14.0.0: Sun Mar 29 19:47:37 PDT 2015; root:xnu-2784.20.34~2/RELEASE_ARM64_S5L8960X iPhone6,2 arm64 N53AP Darwin
1.Drawin体系
  • Darwin是一种类似unix的操作系统,他的核心XNU,XNU是一种混合式内核,结合了mach与BSD两种内核

    • 主流的类unix:
    • Linux 由Linus Torvalds研发的,代表发行版本CenOS,Redhat,Ubuntu,Debian,openWRT等

    • Mac OS X的Intel部分

    • freeBSD 由加州大学伯克利分校基于UNIX研发的(UNIX变种,当时如果不是与贝尔实验室打官司,可能就不会有现在的Linux什么事)

    • Solaris 由Sun(现为Oracel)开发的UNIX商业版本

  • BSD 实现在Mach的上层,这一层提供的API 支持了POSIX标准模型。在XNU中主要实现了一些高级的API与模块

    • UNIX 进程模型
      == e.g fork,vfork,wait,waitpid,exec等 ==

    • POSIX 线程模型即pthread,以及相关的同步功能
      == e.g pthread_create,pthread_mutex(线程互斥锁)==

    • UNIX的用户与组管理
      ==e.g root用户,mobile用户,chmod等==

    • 网络协议栈(BSD Socket API),符合POSIX 模型
      == e.g socket();bind(); listen();accept();connect(); gethostbyname(); gethostbyaddr()等伯克利套接字API==

    • 文件系统/设备系统
      == e.g Filesystem Hierarchy Standard(文件系统层次化标准)==

  • iOS,OSI,ISO的含义

    • iOS 苹果公司开发的移动操作系统

    • OSI 是Open System Interconnection的缩写,意为开放式系统互联。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

    • IOS是国际标准化组织。上面的OSI模型由该组织制定。一般类UNIX系统都基本符合POSIX标准和IOS C标准

    • POSIX表示可移植操作系统接口(Portable Operating System Interface)

    • IOS C标准,C语言标准库接口

  • 为什么越狱

  • 突破iOS沙盒机制的限制(sandbox)
    == 沙盒是一种安全机制,为运行中的程序提供隔离环境。沙盒在启动的时候可以设置运行的程序是否可以访问网络、文件、目录等==
    这里写图片描述
2.Cydia - 越狱iOS的软件管理平台 (Cydia 之父 - Jay Freeman(杰 弗里曼))
  • 越狱iOS是合法的

  • 安装OpenSSH
    == 在Cydia中搜索OpenSSH并安装,这样iOS上面就可以开启SSH服务。SSH服务默认绑定端口号22 ==

    • 使用SSH命令连接iOS,默认登录密码”alpine”
     ssh root@xx.xx.xx.xx       //iOS连接wifi,设置中可以看到ip地址,也可以改成静态IP地址
  • 使用scp命令可以传输文件
    “`
    scp filename root@xx.xx.xx.xx:/tmp //拷贝本地文件到远端

    scp root@xx.xx.xx.xx:/tmp/filename /tmp/ //从远端拷贝文件到本地


 - 修改默认密码
  ```
    passwd root

   passwd mobile
 ```

* 安装软件包管理工具apt-get
  == 在Cydia中搜索 APT 0.6 Transitional并安装 ==

  - 命令介绍
      ```
         apt-get update                    【更新所有的源】

         apt-get upgrade                 【更新所有通过apt-get安装的程序】

         apt-get install  packagename         【安装软件包】

         apt-get remove  packagename      【删除软件包,不删除依赖包,不删除配置文件】

         apt-get remove --purge packagename  【删除该软件包,不删除依赖包,删除配置文件】

         apt-get autoremove packagename       [删除该软件包,删除依赖包,不删除配置文件]

         apt-get autoremove --purge packagname    【可以删除所有依赖包+配置文件】

         apt-cache search string             【搜索含有该string字段的软件包】

         apt-cache show packagename     【详细显示该软件包的信息】

         apt-get clean                   【清除apt-get安装的软件包备份,可以释放储存空间,不影响软件正常使用】
    ```


 - 使用apt-get 安装软件包
    == e.g 安装traceroute ==
    ```
        apt-get install traceroute  //发现找不到软件包

        //如果不知道软件包名称,也可以用关键字搜索
        apt-cache search traceroute

        apt-get install  network-cmds
    ```

 - 安装必要工具

    ```
        apt-get install  ping

        apt-get install  ps

        apt-get install  find

        apt-get install tcpdump

        apt-get install top

        apt-get install vim

        apt-get install  network-cmds   //-arp, ifconfig, netstat, route, traceroute
    ```

  - 工具的使用
   ```
       ping www.baidu.com -c 4 -s 600  //发送icmp报文,检查网络状况

       ps aux                          //查看进程信息
       ps -e                           

       find / -name ping       //在根目录开始查找文件名为ping的文件

       grep -r 'hello*' /tmp   //在/tmp目录中查找包含'hello'字符的文件,-r表示包含子目录

       top
       top -l 1 | head -n 10 | grep PhysMem  //显示系统内存使用情况

       tcpdump -i en0 src host 192.168.1.137
       tcpdump -i en0 dst host 192.168.1.137
       tcpdump -w /tmp/ssh.cap -i en0 tcp port 22 and dst host 192.168.1.137
       tcpdump -w /tmp/ssh.cap -i en0 -t -s 0 -c 100 tcp port ! 22 and dst host 192.168.1.137
         解释:
        (1)-w /tmp/ssh.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
        (2)-i en0 : 只抓经过接口en0的包
        (3)-t : 不显示时间戳
        (4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
        (5)-c 100 : 只抓取100个数据包
        (6) tcp port ! 22  : 不抓tcp端口22的数据包
        (7) dst port ! 22 : 不抓取目标端口是22的数据包
        (8)dst host 192.168.1.137 : 抓取目标地址为192.168.1.137的包
        (9)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
   ```  

#####  3.iOS文件系统结构
- 可视化方式常看iOS系统文件
  ==在iOS通过Cydia安装Apple File Conduit 2,在OS X使用iFunBox可以查看iOS系统文件(iOS和OS X需要在通一个局域网内)==

- 通过SSH远程登录iOS来查看

- Filesystem Hierarchy Standard 文件系统层次化标准(以下简称FHS)
   ==FHS为类UNIX操作系统的文件目录结构制定了一套标准,目的是让用户预知文件或目录的存放位置。UNIX操作系统的常见目录结构如下所示。==

    ```
       /:根目录,以斜杠表示,其他所有文件和目录在根目录下展开。

       /bin:"binary"的简写,存放提供用户级基础功能的二进制文件,如ls、ps等。

       /boot:存放能使系统成功启动的所有文件。iOS中此目录为空。

       /dev:"device"的简写,存放BSD设备文件。每个文件代表系统的一个块设备或字符设备,一般来说,“块设备”以块为单位传输数据,如硬盘;而“字符设备”以字符为单位传输数据,如调制解调器。

       /sbin:"system binaries"的简写,存放提供系统级基础功能的二进制文件,如netstat、reboot等。

       /etc:"Et Cetera"的简写,存放系统脚本及配置文件,如passwd、hosts等。在iOS中,/etc是一个符号链接,实际指向/private/etc。

       /lib:存放系统库文件、内核模块及设备驱动等。iOS中此目录为空。

       /mnt:"mount"的简写,存放临时的文件系统挂载点。iOS中此目录为空。

       /private:存放两个目录,分别是/private/etc和/private/var。

       /tmp:临时目录。在iOS中,/tmp是一个符号链接,实际指向/private/var/tmp。

       /usr:包含了大多数用户工具和程序。/usr/bin包含那些/bin和/sbin中未出现的基础功能,如nm、killall等;/usr/include包含所有的标准C头文件;/usr/lib存放库文件。

      /var"variable"的简写,存放一些经常更改的文件,比如日志、用户数据、临时文件等。其中/var/mobile和/var/root分别存放了mobile用户和root用户的文件,是重点关注的目录。
    ```

* UNIX系统文件权限简介(UNIX一切皆文件:读写普通文件、目录、设备、socket、管道、CPU信息、进程信息等)  
 -  系统用3位(bit)来表示文件的权限,从高位到低位分别是r(read)权限、w(write)权限,以及x(execute)权限。文件与用户的关系存在以下三种可能性:
   - 此用户是属主用户(文件所有者的权限)
   - 此用户不是属主用户,但在属主组里(组用户权限)
   - 此用户既不是属主用户,又不在属主组里(Other用户权限)

    ```
    1111 1111  = 2^0*1 + 2^1*1 + 2^2*1 + 2^3*1 + ...+2^7*1 = 2^8 - 1 

    8421
    1111  = 8+4+2+1 = 15
    1011  = 8+2+1 = 11

    rwx      r-x    r--
    111      101    100 
    所有者   属组   其他

    用3*3位来表示一个文件的权限,如果某一位为1,则这一位代表的权限生效,否则无效。例如,111101101代表rwxr-xr-x,即该文件的属主用户拥有r、w、x权限,而属主组和其他所有人只具有r和x权限;同时,二进制的111101101转换成十六进制是755,也是一种常见的权限表示法。

    可以使用chmod 命令修改文件权限,如 chmod  755  filename
  ```

* iOS的独有目录
    ```
        /Applications:存放所有的系统App和来自于Cydia的App,但不包括StoreApp。

        /Developer:如果一台设备连接Xcode后被指定为调试用机,Xcode就会在iOS中生成这个目录,其中会含有一些调试需要的工具和数据。

        /Library:存放一些提供系统支持的数据。其中/Library/MobileSubstrate下存放了所有基于CydiaSubstrate(原名MobileSubstrate)的插件(如:tweak编写的插件)。

        /System/Library:iOS文件系统中最重要的目录之一,存放大量系统组件。

        /System/Library/Frameworks和/System/Library/PrivateFrameworks:存放iOS中的各种framework

        /System/Library/CoreServices里的SpringBoard.app:iOS桌面管理器(类似于Windows里的explorer),是用户与系统交流的最重要中介。

        /User:用户目录(其实就是mobile用户的home目录),实际指向/var/mobile,这个目录里存放大量用户数据,比如:

        /var/mobile/Media/DCIM下存放照片;

        /var/mobile/Media/Recordings下存放录音文件;

        /var/mobile/Library/SMS下存放短信数据库;

        /var/mobile/Library/Mail下存放邮件数据。

        /var/mobile/Containers,存放StoreApp。值得注意的是,App的可执行文件在bundle与App中的数据目录被分别存放在/var/mobile/Containers/Bundle和/var/mobile/Containers/Data这两个不同目录下。其中/var/mobile/Containers/Data是我们常用的应用沙盒目录的起始目录:NSString *directory = NSHomeDirectory(); //获取沙盒根目录

    ```


* iOS应用(Store App)沙盒目录:
 - Application Bundle  包含应用可执行文件和资源文件
  ```
  如获取iOS上微信程序的Bundle路径,可以通过ps -e | grep  appname  
  luz-iphone:/ root# ps -e | grep WeChat
   1368 ??         5:41.43 /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
  • Application Data 包含App运行生产的数据和配置信息等

    如获取iOS上微信程序的Date路径,可以通过cycript工具
    luz-iphone:~ root# cycript -p WeChat
    cy# directory = NSHomeDirectory()
    @"/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE"
    cy# 

    Date目录结构如下:

    luz-iphone:/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE root# ls
    Documents/  Library/  tmp/
    • Document 存放应用运行时生成的并且需要保存的数据。注:iTunes或iCloud同步设备时会备份该目录

    • Library/Caches 存放应用运行时生成的并且需要保存的数据。iTunes或iCloud不同步。

    • Library/Preferences 存放偏好设置。iOS的偏好设置(settings)应用也会在该目录查找应用的设置信息。NSUserDefaults保存在该目录下。iTunes或iCloud同步设备时备份该目录。

    • tmp 存放应用运行时所需的临时数据。当某个应用没运行时,iOS系统可能会清除该目录下的文件。但不可依赖这种自动清除机制,应该及时手动清除。

4.Cycript工具介绍(作者:saurik,官网:http://www.cycript.org/
  • Cycript是一款脚本语言,可以看作是Objective-JavaScript,它可以帮助我们轻松测试和验证函数效果。

    • 在越狱手机中可以通过注入方式在第三方应用中运行

    • 也可以用静态库的方式把cycript集成到自己的应用(MonkeyDev,可以给非越狱iOS第三方App写插件,但是权限受沙盒限制)

  • 在越狱手机中安装Cycript

    • 在Cydia上搜索Cycript进行安装

    • apt-get install cycript

  • Cycript使用(注入到第三方进程空间)

    • 注入Cycript模块到第三方进程

      //确认进程名或者进程PID
      luz-iphone:/ root# ps -e | grep WeChat 
      1368 ??         6:17.44 /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
      
      //打开方式1
      luz-iphone:/ root# cycript -p WeChat
      cy# 
      
      //打开方式2
      luz-iphone:/ root# cycript -p 1368  
      cy# 
    • 退出cycript
      Control+D

    • 实战演练

    //WeChat  cycript -p WeChat
    [[UIApplication sharedApplication] setStatusBarHidden:YES]   //隐藏状态栏
    [[UIApplication sharedApplication] setStatusBarHidden:NO]    //显示状态栏
    
    [[[UIAlertView alloc]initWithTitle:@"Tanzhou" message:@"Hello luz" delegate:ni cancelButtonTitle:@"ok" otherButtonTitles:nil, nil] show]            //弹框
    
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1000]   //设置badge数字 
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]
    
    //SpringBroad cycript -p SpringBroad
    [[SBScreenShotter sharedInstance] saveScreenshot:YES]   截屏,闪光
    [[SBScreenShotter sharedInstance] saveScreenshot:NO]   截屏,不闪光
    [[SBScreenFlash mainScreenFlasher] flashColor:[UIColor magentaColor] withCompletion:nil] 屏幕闪紫色光
    
5.逆向的你基本思路
  • 正向工程(Forward Engineering)
    抽象的逻辑设计 => 具体的物理实现

    设计概念和算法 => 编写源代码 => 编译成二进制机器码

    将想法和设计理念变成具体实现的过程

  • 逆向工程(Reverse Engineering)
    具体的物理实现 => 抽象的逻辑设计
    反编译机器码 => 汇编代码(类似的高级语言代码) => 理解其算法和设计概念

    从二进制码中提取设计概念和算法

  • 程序的编译和反编译
    高级语言(C/C++/Oc/Java/Python/C#) -> 中间语言(如:汇编等) -> 目标代码(exe/lib/dll/sys/dylib等二进制文件)

              编译链接   
    高级语言   ------->    机器码   
              <------     机器码  
             反汇编/反编译
    
          编译链接
    高级语言  ===>     机器码  
            <===
          反汇编/反编译
  • 逆向的思路

    • 逆向必须是有目的的、有针对性的(明确你要做的事情)

    • 先熟悉你要逆向的目标程序,从正向的思路去猜测他可能的实现方法(使用的框架、调用的系统API等)

    • 定位关键代码

    • 通过监控UI事件的响应定位关键代码

    • 通过监控底层API的调用定位关键代码(如网络访问接口、文件读写接口等)

    • 通过观察数据的变化来定位关键代码和地址

    逆向是一个试错的过程,需要不停的猜测、查找和进行验证,既考验耐心也考验动手能力

    6.程序、进程、线程、内存结构的概念
  • 程序(静态的,磁盘上)
    程序是完成某个功能的指令集。程序一般是指可执行的二进制文件。

  • 进程(动态的,内存中)

    • 进程的概念
      进程是程序的运行实例,是系统进行资源分配和调度运行的基本单位。

    换句话说进程是一个容器,包含程序执行需要的代码、数据还有资源等信息。多任务的操作系统,可以同时执行多个进程。

    • 进程虚拟地址空间
      多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中,这个沙盘就是虚拟地址空间
      (virtual addressspace), 在32位经典模式下,它总是一个4GB的内存地址块。这些虚拟地址通过页表(pagetable)
      映射到物理内存,页表由操作系统维护并被处理器引用。每个进程都拥有一套属于它自己的页表,但是还有一个隐情,
      只要虚拟地址被使能,那么它将会作用于这台机器上运行的所有软件,包括内核本身,因此,有一部分虚拟地址必须保
      留给内核使用。
  • 线程
    轻量级进程,是进程内一个相对独立的、可调度的执行单元,是CPU调度的基本单元。

  • 函数
    包含某个特定功能的代码块,可以叫做子程序。

  • 典型的内存空间布局

    • 从低地址到高地址依次为:代码区、只读常量区、全局区/数据区、BSS段、堆区、栈区。
    代码区:存放可执行指令。
    
    只读常量区:存放字面值常量、具有常属性且被初始化的全局和静态局部变量(如:字符串字面值、被const关键字修饰的全局变量和被const关键字修饰的静态局部变量)。
    
    全局区/数据区:存放已初始化的全局变量和静态局部变量。
    
    BBS段:存放未初始化的全局变量和静态局部变量,并把它们的值初始化为0。
    
    堆区:存放动态分配的内存。
    
    栈区:自动变量和函数调用时需要保存的信息(逆向分析的重点)
    
    补充:
      代码区和只读常量区一般统称为代码段
    
      栈区和堆区之间相对生长的,堆区的分配一般按照地址从小到大进行,而栈区的分配一般按照地址从大到小进行分配。

    这里写图片描述

7.逆向工具集和安装和使用
  • iOS逆向工程的工具大致可分为四类:

    • 检测工具
      如:Reveal、tcpdump等

    • 反编译工具(反汇编工具 - 分析二进制文件并得到一些信息)
      如:IDA、Hopper Disassembler、classdump等

    • 调试工具
      如:lldb、Cycript等

    • 开发工具
      如:Xcode、theos等

    • classdump
      可以将Mach-O文件中的Objective-C运行时的声明的信息导出,即编写OC代码时的 .h文件。class-dump只能导出未经加密的App的头文件。classdump是对”otool -ov” 信息的翻译,以一种我们熟悉的易读的方式呈现。官网http://stevenygard.com/projects/class-dump/

      where options are:
          -a             show instance variable offsets
          -A             show implementation addresses
          --arch <arch>  choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64)
          -C <regex>     only display classes matching regular expression
          -f <str>       find string in method name
          -H             generate header files in current directory, or directory specified with -o
          -I             sort classes, categories, and protocols by inheritance (overrides -s)
          -o <dir>       output directory used for -H
          -r             recursively expand frameworks and fixed VM shared libraries
          -s             sort classes and categories by name
          -S             sort methods by name
          -t             suppress header in output, for testing
          --list-arches  list the arches in the file, then exit
          --sdk-ios      specify iOS SDK version (will look in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk
          --sdk-mac      specify Mac OS X version (will look in /Developer/SDKs/MacOSX<version>.sdk
          --sdk-root     specify the full SDK root path (or use --sdk-ios/--sdk-mac for a shortcut)
  • otool工具简介
    otool(object file displaying tool) :目标文件的展示工具。可以用来发现应用中使用到了哪些系统库,调用了其中哪些方法,使用了库中哪些对象及属性,它是Xcode自带的常用工具。


    -f print the fat headers
    -a print the archive header
    -h print the mach header
    -l print the load commands
    -L print shared libraries used
    -D print shared library id name
    -t print the text section (disassemble with -v)
    -p <routine name> start dissassemble from routine name
    -s <segname> <sectname> print contents of section
    -d print the data section
    -o print the Objective-C segment
    -r print the relocation entries
    -S print the table of contents of a library
    -T print the table of contents of a dynamic shared library
    -M print the module table of a dynamic shared library
    -R print the reference table of a dynamic shared library
    -I print the indirect symbol table
    -H print the two-level hints table
    -G print the data in code table
    -v print verbosely (symbolically) when possible
    -V print disassembled operands symbolically
    -c print argument strings of a core file
    -X print no leading addresses or headers
    -m don't use archive(member) syntax
    -B force Thumb disassembly (ARM objects only)
    -q use llvm's disassembler (the default)
    -Q use otool(1)'s disassembler
    -mcpu=arg use `arg' as the cpu for disassembly
    -j print opcode bytes
    -P print the info plist section as strings
    -C print linker optimization hints
    --version print the version of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool

    • 依赖库的查询
      如: otool -L WeChart

    • 是否加壳
      如:otool -l WeChart | grep -B 2 crypt

  • classdump的使用
    class-dump -s -S -H /Applications/Memenet/Memenet.app/Contents/MacOS/memenet -o ./MyHeaders

    “`
    查看某文件夹下文件的个数,包括子文件夹里的。
    ls -lR|grep “^-“|wc -l

    查看某文件夹下文件夹的个数,包括子文件夹里的。
    ls -lR|grep "^d"|wc -l
    

    “`

    定位要砸壳的StoreApp的执行文件名字TargetApp (ps -e 可以得到全路径)  

    定位要砸壳的StoreApp的Document目录:
    cycript -p TargetApp
    [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

    得到路径:#"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/"

    进入Document目录: cd  /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
    拷贝dumpdecrypted.dylib: cp  dumpdecrypted.dylib .

    DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat

 ```

 * theos(作者:@DHowett)
   越狱开发工具包

  - xcode工具集的路径需要设置正确
     查看命令: xcode-select --print-path   

    设置命令: xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer 

  - 通过github安装theos
     https://github.com/theos/theos/wiki/Installation

  - 修改所有者
    sudo chown -R $(id -u):$(id -g) theos 

    theos维基百科:
    http://iphonedevwiki.net/index.php/Theos/Setup#For_Mac_OS_X
    http://iphonedevwiki.net/index.php/Theos

  - 环境变量
     export THEOS=/opt/theos

    可以写入~/.bash_profile
    source ~/.bash_profile 

    echo $THEOS

- ldid(作者:saurik )
   维基百科:http://iphonedevwiki.net/index.php/Ldid

   越狱iPhone下的签名工具(更改授权entitlements),可以为thos开发的程序进程签名(支持在OS X和iOS上运行)。

 - 安装ldid
   $ brew install ldid fakeroot

 -  加密算法
   - 对称加密算法:RC4DES3DES、AES128AES256等。加解密双方密钥相同。

   - 非对称加密算法:RSAElgamal等。加解密双方使用密钥对。

   - 哈希算法:MD5(16Byte)、SHA1(20Byte)等。任意长度的信息转换成到某一固定长度的信息摘要(具有唯一性,不可逆性),主要作用是对数据数据完整性校验。

  -  数字签名  (苹果官方的私钥签名,公钥验证)
      - 数字签名是非对称密钥加密技术与数字摘要技术的应用。对指定信息使用哈希算法,得到一个固定长度的信息摘要,然后再使用 私钥 (注意必须是私钥)对该摘要加密,就得到了数字签名。

 - 数字证书
   数字证书是一个文件,由苹果的 Apple Worldwide Developer Relations Certification Authority(WWDR)证书认证中心进行签名,其的主要作用是用来标示身份。证书文件主要包含两部分内容:证书信息和证书签名
    - 证书信息
       包含用户的公钥、用户个人信息、证书颁发机构信息、证书有效期等信息。(这里的用户主要指开发者)

    - 证书签名
       WWDR将上述证书本身内容的使用哈希算法得到一个固定长度的信息摘要,然后使用自己的私钥对该信息摘要加密生成数字签名。

    - 证书的验证
   iOS系统原本就持有WWDR的公钥,系统首先会对证书内容通过指定的哈希算法计算得到一个信息摘要;然后使用WWDR的公钥对证书中包含的数字签名解密,从而得到经过WWDR的私钥加密过的信息摘要;最后对比两个信息摘要,如果内容相同就说明该证书可信。在验证了证书是可信的以后,iOS系统就可以获取到证书中包含的开发者的公钥,并使用该公钥来判断代码签名的可用性了。

    - 证书存在的意义
    通过证书使用过程可以看出,证书本身只是一个容器,用来承载开发者的公钥。iOS通过验证证书的合法性来确保开发者公钥的合法性。

  - 代码签名与验证(开发者的私钥签名,公钥验证)
      打包过程中使用开发者私钥对应用进行签名。   

      开发者的公钥被包含在数字证书里,数字证书又被包含在描述文件(Provisioning File)中,描述文件在应用被安装的时候会被拷贝到iOS设备中。iOS安全系统通过证书就能够确定开发者身份,就能够通过从证书中获取到的公钥来验证开发者用该公钥对应的私钥签名后的代码、资源文件等有没有被更改破坏,最终确定应用能否合法的在iOS设备上合法运行。

  - 工具的使用

    ```
    查看codesign load command 
    otool -l WeChat | grep -A 5 SIGNATURE

    查看签名信息
    ➜  tmp codesign -dvvv WeChat
    Executable=/private/tmp/WeChat
    Identifier=com.tencent.xin
    Format=Mach-O universal (armv7 arm64)
    CodeDirectory v=20200 size=448783 flags=0x0(none) hashes=14017+5 location=embedded
    Hash type=sha256 size=32
    CandidateCDHash sha1=6e2f8a93dbe63c17ea3b3a3dc032826b9eddf2b7
    CandidateCDHash sha256=d6f1afe23b598a76301711a4a62a5505a749a12a
    Hash choices=sha1,sha256
    CDHash=d6f1afe23b598a76301711a4a62a5505a749a12a
    Signature size=3925
    Authority=Apple iPhone OS Application Signing
    Authority=Apple iPhone Certification Authority
    Authority=Apple Root CA
    Info.plist=not bound
    TeamIdentifier=88L2Q4487U
    Sealed Resources=none
    Internal requirements count=1 size=96

    查看entitlement内容 
    codesign -d --entitlements - WeChat
    ldid -e WeChat

    修改entitlement内容 
    ldid -Sentitlement.xml  WeChat
    ```

- dpkg工具

 - 安装

$ brew install –from-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb
$ brew pin dpkg


  - 使用

dpkg -i/-r deb包安装/卸载
dpkg -s com.iosre.myiosreproject 查看安装包信息
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值