iOS注入小知识:重签名、逆向分析方法

简介: iOS注入小知识:重签名、逆向分析方法

前言

tweak是各种破解补丁的统称,iOS的tweak大致可分为两种:

  1. 在cydia上发布的,需要越狱才能安装,大部分是deb格式的安装包.

iOS在越狱后,会默认安装一个名叫mobilesubstrate的动态库,它的作用是提供一个系统级的入侵管道,所有的tweak都可以依赖它来进行开发。

目前主流的开发工具有theos、iOSOpenDev、MonkeyDev,前者是采用makefile的一个编译框架,后两者提供了一套xcode项目模版,可以直接使用xcode开发可调试,但iOSOpenDev这个项目已经停止更新了,对高版本的xcode支持不好。(推荐后来的新版本monkeydev

  1. 第二种是直接打包成ipa安装包,并使用自己的开发证书或者企业证书签名,不需越狱也可以安装,可直接放到自己的网站上,可实现在线安装;对于没有越狱的手机,由于权限的限制,我们是没有办法写系统级的tweak。例如springboard的补丁是没法运行的,这种tweak大多是针对某个app,把目标app进行修改注入处理,再重新签名和发布,有点类似于windows软件的xxx破解版、xxx免注册版。

使用Theos编译的动态库依赖CydiaSubstrate,所以要想在非越狱环境上运行,还得把CydiaSubstrate库也跟着打包到APP中。当然Theos提供了解决方案 :在Makefile里Tweak_Name=XXXX下添加以下两行 :

SUBSTRATE ?= yes
TweakName_USE_SUBSTRATE = $(SUBSTRATE)

然后打包使用命令:make SUBSTRATE=no这样Theos打包时会将依赖的CydiaSubstrate中的符号加载到最终生成的动态库中,从而不再依赖CydiaSubstrate库。

I 注入原理

  1. 二次打包实现动态库的注入: 通过修改可执行文件的Load Commands来实现的, 在Load Commands中增加一个LC_LOAD_DYLIB写入dylib路径,这样程序执行的时就会编译LC_LOAD_DYLIB 找到要注入的dylib并加载它。

基于runtime的method swizzling是iOS的注入基础,它类似于windows的钩子,通常也称为hook。Mobilesubstrate为了方便tweak开发,提供了三个重要的模块:

  1. MobileHooker 就是用来做上面所说的这件事的,它定义一系列的宏和函数,底层调用objc-runtime和fishhook来替换系统或者目标应用的函数
  2. MobileLoader 用来在目标程序启动时根据规则把指定目录的第三方的动态库加载进去,第三方的动态库也就是我们写的破解程序,他的原理下面会简单讲解一下
  3. Safe mode 类似于windows的安全模式,比如我们写的一些系统级的hook代码发生crash时,mobilesubstrate会自动进入安全模式,安全模式下,会禁用所有的第三方动态库
  1. cycript的原理:其动态库注入的原理与我们常见的通过LC_LOAD_DYLIB在可执行文件中注入动态库不同,cycript的操作是 : 抓取到要挂载的应用, 由于越狱机上拥有权限,所以直接在挂载的进程上创建一个挂起的线程, 然后在这个线程里申请一片用于加载动态库的内存,然后恢复线程,动态库就被注入

1.1  mobileloader注入原理详细说明

Mach-O文件的数据主体可分为三大部分:

  • 头部(Header)
  • 加载命令(Load commands)、
  • 数据(Data)

image.png

mobileloader会在目标程序启动时,会根据指定的规则检查指定目录是否存在第三方库,如果有,则会通过修改二进制的loadCommands,来把自己注入进所有的app当中,然后加载第三方库。

下面用machoview来打开一个真实的二进制文件给大家看看,可以看出二进制当中所有引用到的动态库都放在Load commands段当中,因此我们通过给这个段增加记录,就可以注入我们自己写的动态库了。

image.png

我们自己写的代码如何新增执行的入口?

我们还需要一个”main”函数来执行我们自己的代码,这个”main”函数在oc里面称为构造函数,只要在函数前声明 “attribute((constructor)) static” 即可。

#import "CaptainHook.h"
static __attribute__((constructor)) void entry(){
//    NSLog(@"\n               ?!!!congratulations!!!?\n?----------------insert dylib success----------------?");
//    
//    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
//        
//        CYListenServer(6666);
//    }];
}

1.2 重签名

对app进行重签名:codesign -f -s "iPhone Distribution: xxxx..." --entitlements Entitlements.plist Payload/wework.app

打包APP :xcrun -sdk iphoneos PackageApplication -v Payload/wework.app -o ~/xxx.ipa

辅助命令

# 查看当前系统中可用的所有签名证书
security find-identity -v -p codesigning  
# 签名, 可以加 -f 参数 以覆盖签名
codesign -s 'iPhone Developer: Thomas Kollbach (7TPNXN7G6K)' Example.app
# 查看签名状态
codesign -vv -d Example.app
# 另外一种方式来查看签名
ldid -e Demo.app/demo

1.3 小结

把一个自己的dylib放到APP的目录下,然后修改二进制文件,以让APP加载这个动态库。这个动态库也是需要签名的,使用对app重签名的方式对这个动态库进行签名。

动态库的注入,可以使用这个工具 insert_dylib脚本.

insert_dylib --all-yes @executable_path/test.dylib Payload/WeChat.app/WeChat

II、iOS逆向分析方法

2.1 网络分析

通过分析和篡改接口数据,可以有效的破解通过接口数据来控制客户端行为的app。常用的抓包工具有:Tcpdump, WireShark, Charles;windows平台有fidller

2.2 静态分析

通过砸壳、反汇编、classdump头文件等技术分析app行为,可以有效的分析出app使用的第三方库,甚至分析出app的架构等内容。常用的工具有:

  • dumpdecrypted(砸壳)
  • hopper disassembler(反汇编)
  • class_dump(导头文件)
  • otool:查看依赖的库 otool -L taokeSearchTweak.dylib
$ otool -L  taokeSearchTweak.dylib
taokeSearchTweak.dylib (architecture armv7):
    /Library/MobileSubstrate/DynamicLibraries/taokeSearchTweak.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.55.0)
    /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1349.56.0)
    /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)

2.3 动态分析

动态分析指的是通过分析app的运行时数据,来定位注入点或者获取关键数据。常用的工具有

  1. [cycript][https://blog.csdn.net/z929118967/article/details/78200067]

运行时控制台

control+D,来退出Cydia.

  1. Logify(追踪方法的调用和数据传递) Logify.pl脚本在你安装theos的时候就自带,存放的路径为/opt/theos/bin/logify.pl

神器Logify是theos的一个模块,根据头文件自动生成tweak,生成的tweak会在头文件的所有方法中注入NSLog来打印方法的入参和出参,非常适合追踪方法的调用和数据传递

  1. lldb+debugserver(远程断点调试)

III 基础知识储备

3.1 多开原理和检测

  1. app多开实现原理: 通过创建不同进程名称运行

android开可以通过多用户方式实现

  1. 识别多开环境: 通过读取文件包的方式进行比对(获取当前app的安装目录信息)

3.2 logos 语法

%hook后面跟hook的类名,以一个%end结尾。

%hook Springboard
// overwrite methods here
%end

%orig: 当在一个method内部的时候,%orig会调用原来的方法(original method)。

Building, Packaging, Installing.依次执行的命令make, make package, make install

更多内容请点击这里

IV see also

目录
相关文章
|
16天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
51 2
|
3月前
|
语音技术 开发工具 图形学
Unity与IOS⭐一、百度语音IOS版Demo调试方法
Unity与IOS⭐一、百度语音IOS版Demo调试方法
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
138 3
|
1月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
2月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
3月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
|
2月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
49 1
|
3月前
|
开发框架 Android开发 Swift
安卓与iOS应用开发对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文将深入探讨这两大操作系统在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的差异和特点。通过比较分析,旨在为开发者提供一个宏观的视角,帮助他们根据项目需求和目标受众选择最合适的开发平台。同时,文章还将讨论跨平台开发框架的利与弊,以及它们如何影响着移动应用的开发趋势。
|
3月前
|
安全 搜索推荐 Android开发
安卓与iOS应用开发的对比分析
【8月更文挑战第20天】在移动应用开发领域,安卓和iOS两大平台各领风骚。本文通过深入探讨两者的开发环境、编程语言、用户界面设计、应用市场及分发机制等方面的差异,揭示了各自的优势和挑战。旨在为开发者提供决策支持,同时帮助理解为何某些应用可能优先选择在一个平台上发布。
46 2