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

1,895 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

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)

在这里插入图片描述

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

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

在这里插入图片描述

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

我们还需要一个”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][blog.csdn.net/z929118967/…]

运行时控制台

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

更多内容请关注#小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域。

iOS tweak 集成CocoaAsyncSocket知识点:juejin.cn/post/701475…