antiDebugger

前言

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

iOS 逆向分析方法

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

  • 1、网络分析
    抓包工具有 tcpdump, WireShark, Charles
    
  • 2、静态分析
    在app没运行的情况下,借助反汇编工具(hopper\otool等)查看代码内部结构、语法、过程、接口,以及二进制文件结构信息、class-dump目标对象的class 信息等分析过程。
    关键的地方做到准确提取信息:包括网络协议、数据格式、代码逻辑、控制流、表达式、接口和数据流。
    #“目标软件的二进制代码到汇编代码的翻译过程,我们称之为“反汇编”。”
    
  • 3、 动态分析(动态调试、代码跟踪)
    “分析者可以在程序的执行过程中观察程序的执行流程和计算结果。”通常我通过借助lldb、Cycript、frida、AFLEXLoader、运行时常用的API等工具进行调试、分析代码,获取内存状态甚至修改内存,该过程包括反反调试、查看寄存器内容、跟踪函数执行结果等。
    

整体套路

以下步骤没有绝对的顺序

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

Mac 端的工具

  • Theos Theos 是一个基于 Unix 平台(OS X,iOS…)和大多数的 Linux 平台下进行越狱开发的集成开发环境,由 Dustin Howett 大神开发并开源到 GitHub 上,它的特点是搭建简单、Logos语法简单、编译发布简单

当然我还挺喜欢用MonkeyDev(支持CocoaPods) 开发iPhone tool 、iPhone tweak。

  • IDA 恶意代码分析、漏洞研究、COTS验证、隐私保护;
  • otool Otool可以提取并显示目标文件的相关信息:包括头部,加载命令,各个段,共享库,动态库。
  • Charles、Wireshark
1、Wireshark可以详细的看到网络请求的三次握手,并且可支持spdy、tcp等等的网络协议抓包。

2、比较重要的是Cookie,网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据;
<!-- 3、同时Cookie在爬虫的时候也是一个必不可少的东西,那么如何自动化获取Cookie? -->
a.清除当前浏览器保存的Cookie,并重启浏览器
b.重启之后我们访问www.csdxxxn.net , 比如 Cookie在Response的Headers->set-cookie
c.做登录操作并携带Cookie在请求Headers中,登录成功之后该Cookie就会生
<!-- 某些请求携带sign参数的,例如wx,有时候不是直接的破解而是函数的Hook -->
iOS是通过IDA找到sign函数,并使用cycript调用;-- 简单的举例
4、charlesV4.2 的辅助功能:调试我们的接口
Compose:可直接自定义对应的请求,并执行该请求。这个对我们抓包用处很大。我们可以从中得到该接口的必填参数、验证我们生成的Sign等等的。
Repeat:很简单就是执行一次重复请求操作
Repeat Advanved:重复请求的高级操作,可自定义重复的次数、每隔多少秒执行、启动请求的线程数。这个功能对于我们的接口的压测是很有用的。

安全

  • 使用二进制协议传输数据
  • 类名方法名混淆、越狱检测、核心代码使用swift、c\c++ 实现
  • 反调试

class-dump的原理

利用 Objective-C 语言的 runtime 特性,将存储在 Mach-O 文件中的 @interface 和 @protocol 信息提取出来,并生成相应的 .h 文件

总结

  • 思路
    换个思路,直接访问手机的站点:手机做的站点其性能比较重要,往往做得比较简单,而且容易暴露一些API接口
    

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

  • 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);
    

参考资源

参考博客

安全论坛

附录

syscall hook

ios kext load

参考图

  • lldb
  • SSL相信大家都不陌生。其实Https就是在Http基础上通过SSL协议进行加密之后的网络传输。

转载请注明: > antiDebugger

在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。

赞赏支持

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少
最近的文章

codeshare.frida.re

前言最近觉得Frida 很有潜力,就发现了codeshare.frida.re本文演示下如何使用codeshare。ios-app-info 1、使用frida-ps 查看app 信息 devzkndeMacBook-Pro:zhangkn.github.io devzkn$ frida-ps -Uai PID Name Identifier ---- ------...…

iOSre继续阅读
更早的文章

dumpdecrypted

前言本文重点推荐使用frida-ios-dump-master,而非dumpdecrypted.dylib。frida-ios-dump-master使用frida-ios-dump-master 只需先用frida-ps查看applications Name ,之后执行dump.py 即可在dump.py 目录下生成砸壳之后的ipa包。Frida环境的搭建可以看下这篇文章dumpdecrypted.dylib *dumpdecrypted的原理:通过向宏 DYLD_INSERT_LIB...…

iOSre继续阅读
更多