iosre_anti

iOS 应用逆向与安全

Posted by kunnan on July 1, 2018

前言

  • 软件的逆向工程指的是通过分析一个程序或系统的功能、结构或行为,将它的技术实现或设计细节推导出来的过程。

     当我们因为工作需要,或是对一个软件的功能很感兴趣,却又拿不到它的源代码时,往往可以通过逆向工程的方式对它进行分析,探索它的实现原理。 一个生动的比喻:照着配方包饺子,是正向开发 吃着饺子推配方(API 调用顺序),是逆向工程。
    

I、iOS 逆向分析方法

  • 从二进制文件入手,尝试从汇编代码中理清原始逻辑,并修改/绕过以达到目的。

1.0 通用的分析手段

逆向流程: 逆向的整个流程基本是相同的,而这些流程可以总结为:

  • 获取应用的 ipa 包,解密(如果是越狱应用则不需要解密),导出头文件;

  • 使用工具(cycript、KNAFlexLoader:Tweak.xm,(mac 同系列工具: Reveal)knhook)通过界面查看 APP 的布局,从布局中找到对应的头文件,查看关键函数(使用CycriptUsefulCommand以及UIButton_sendActionsForControlEvents);

  • 使用tweakhook、执行相关函数的输入输出以及调用栈,分析验证关键函数;

  • 静态分析加动态调试进一步分析关键函数的实现逻辑

    1、使用hopper、ide分析代码逻辑,使用`lipo -info`   查看二进制文件的架构信息
    2、使用`lipo xx -thin arm64 -output xx_arm64` 进行瘦身
    
  • 模拟或篡改原有 APP 的逻辑;

  • 制作tweak或者移植到非越狱设备。

1.1 静态分析

  • 在app没运行的情况下,借助反汇编工具(hopper\otool等)查看代码内部结构、语法、过程、接口,以及二进制文件结构信息、class-dump目标对象的class 信息等分析过程。 关键的地方做到准确提取信息:包括网络协议、数据格式、代码逻辑、控制流、表达式、接口和数据流。

    “目标软件的二进制代码到汇编代码的翻译过程,我们称之为“反汇编
    

1.2 网络分析

  • 抓包工具有 tcpdump, WireShark, Charles

    1、Wireshark可以详细的看到网络请求的三次握手,并且可支持spdy、tcp、udp、http等等的网络协议抓包;原理:将网卡设置为混杂模式;正常情况下,网卡会过滤目标地址不是自己的数据包;将网卡设置为混杂模式,就会收到经过网卡的所有数据包
    2、charlesV4.2 的辅助功能:调试我们的接口(Compose、Repeat、breakpoints:临时修改、map:将本地请求重定向到一个文件或者将远程请求重定向到另一个请求、rewrite:对网络请求进行正则比配修改);支持http、https网络包的截取;原理是代理抓包。
    

1.3 动态分析(动态调试、代码跟踪)

  • 分析者可以在程序的执行过程中观察程序的执行流程和计算结果。

    通常我通过借助lldb、Cycript、frida、AFLEXLoader、运行时常用的API等工具进行调试、分析代码,获取内存状态甚至修改内存,该过程包括反反调试、查看寄存器内容、跟踪函数执行结果等
    

1.4 整体套路

以下步骤没有绝对的顺序

  • 先dumpdecrypted(砸壳)、class-dump(导出OC头文件)寻找分析切入点;砸壳步骤可以使用frida-ios-dump-master 一次性完成。
  • 用cycript、Frida、AFLEXLoader、hookClass 定位目标视图,获取目标的VC、delegate、关键函数
  • 使用IDA、hopper、lldb 配合使用分析代码调用逻辑
  • 编写tweak(借助theos、MonkeyDev进行编写)

II、安全

  • 数据加密:

    • 网络传输的加密使用二进制协议传输数据
    • 本地存储的加密
    • 静态字符串的加密
  • 静态混淆:类名方法名、属性的混淆

  • 代码混淆

    • 核心代码使用swift、c\c++ 实现

    • 将代码分块、扁平化、增加干扰代码

      image

  • 反调试\ 注入检测、hook检测、越狱检测、签名检测

2.0 把函数名隐藏在结构体里,以函数指针成员的形式存储

  • KNUtil.h

    @interface KNUtil : NSObject
    /**
     把函数名隐藏在结构体里,以函数指针成员的形式存储。
     编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛.
     */
    typedef struct _util {
        void (*cign)(char *kns[],unsigned int kncount, const char *knkey, unsigned char *knput);
    }CNtKNil_t ;
    #define SharedUtilStruct ([KNUtil sharedUtil])//提供给外围的接口
    + (CNtKNil_t *)sharedUtil;
    
    • KNUtil.m

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      //留给读者自己实践
      
      • 外围调用
        SharedUtilStruct->cign(key ,count,knkey, knput);
      

See Also

/Users/devzkn/bin//knpost iosre_anti iOS 应用逆向与安全 -t iosre
#原来""的参数,需要自己加上""

转载请注明: > iosre_anti