class-dump

简介

  • 用于dump目标对象的class信息.它利用OC语言的runtime特性, 将存储在Mach-O可执行文件中的头文件信息提取出来, 并生成对应的.h文件.

  • class-dump的对象是Mach-O格式的二进制文件. 如Framework库文件和App的可执行文件.

安装流程

  • 下载 class-dump-3.5.dmg 后打开压缩包, 将dmg里面的class-dump复制到 /usr/bin 下.
  • 然后在Terminal(终端)中执行 sudo chmod 777/usr/bin/class-dump 命令赋予其执行权限.
  • 执行命令class-dump可以看到它的基本参数.

操作流程

寻找可执行文件, 如果事先知道可执行文件名字, 可直接执行导出头文件步骤.

  • cd 到App包路径下.

  • 通过plutil工具执行 plutil -p Info.plist | grep CFBundleExecutable 查看App的Info.plist中的 CFBundleExecutable字段.

  • 其中ManageHome就是可执行文件的名字. 一般可执行文件的名字就是CFBundleExecutable字段.


导出头文件

  • 新创建一个空文件夹用于存放.h文件. 然后执行 class-dump -S -s -H 可执行文件名字 -o 空文件夹 , 然后就会在空文件夹中多出许多.h文件.

Theos

简介

  • Theos是一个越狱开发工具包. 是iOS 越狱界知名人士Dustin Howett 开发并分享到GitHub上.

安装流程

  • 安装Xcode和Command Line Tools 通过苹果商店安装即可.
  • 如果有多个Xcode可以指定其中一个如图: 把Xcode3换成你的xcode名字即可.
  • 下载Theos: 在GitHub上下载. 执行命令 sudo git clone --recursive

/opt/theos 是存放路径

Theos NIC templates内置了5中Theos工程类型模板, 方便创建多样的Theos工程. 获取更多模板, 下载后将.tar文件放到 /opt/theos/templates/iphone/ 下. 没有文件目录手动创建目录.

Theos工程配置

Idid

  • 专门用来签名iOS 可执行文件的工具, 取代越狱iOS 中Xcode自带的codesign. 把它放在 /opt/theos/bin/ 下. 更改名字为ldid. 然后执行命令 sudo chmod 777 /opt/theos/bin/ldid.dms 赋予可执行权限.

CydiaSubstrate

  • 一个动态库, 让大部分tweak正常工作的基础.
    (1) 获取CydiaSubstrate, 可以在我的github上获取.

    (2) 然后放到 /opt/theos/lib/libsubstrate.dylib 中替换无效的文件. 如果没有直接放进去.

dpkg-deb

  • deb是越狱开发的安装包格式, 而有了这个工具Theos可以把工程打包成deb文件.
  • 下载下来重命名为 dpkg-deb 后放到 /opt/theos/bin/ 目录下, 然后执行 sudo chmod 777 /opt/theos/bin/dpkg-deb

Theos工程创建

  • 首先cd到要存放工程的文件夹(最好是全英文), 然后执行 /opt/theos/bin/nic.pl 创建工程. 如下步骤:

    1. 选择tweak模板: 输入11 , 直接回车.

    2. 项目名称: LQS

    3. 项目deb包名字(类似bundle id): 直接回车默认, 或者自己手动设置一个值, 然后回车.

    4. 作者名称: LQS

    5. Tweak作用对象的App bundle id: 默认是 com.apple.springboard. 可以设置成想要逆向的App的id.

    6. Tweak安装后需要重启的应用, 进程名字表示: 直接回车则是默认的 SpringBoard App重启.

Theos工程的目录结构

  1. Makefile: 指定工程用到的文件 框架 库等信息. 内容解读:
  • include $(THEOS)/makefiles/common.mk 固定写法不需要更改.
  • TWEAK_NAME = LQS, tweak的工程名字.
  • LQS_FILES = Tweak.xm, tweak包含的源文件(不包括头文件), 多个文件间以空格分隔. 如: LQS_FILES = Tweak.xm Objc.m Tweak1.xm
  • include $(THEOS_MAKE_PATH)/tweak.mk: 根据不同的Theos工程类型, 通过include命令指定不同的.mk文件;
  • after-install:: install.exec "killall -9 SpringBoard” : 在tweak安装后杀掉 SpringBoard 进程, 好让CydiaSubstrate在进程启动时加载对应的dylib.
  • ARCHS = armv7 arm64 : 指定处理器架构.
  • TARGET = iphone:Base SDK:Deployment Target : 指定SDK版本. 如: TARGET = iphone:8.1:8.0, 意思是采用8.1的版本, 且发布对象是8.0及以上版本. 也可以把Base SDK设置为latest, 指定Xcode附带的最新版本SDK编译. 如: TARGET = iphone:latest:8.0 ;
  • LQS_FRAMEWORKS = framework name : 导入framework. 如: LQS_FRAMEWORKS = UIKit CoreAudio
  • LQS_PRIVATE_FRAMEWORKS = private framework name : 导入私有框架和上面一样; 如果在不同的版本里私有框架可能有的不能用, 那么可以通过弱链接系列函数动态调用私有框架来解决: LQS_LDFLAGS = -lx , Theos采用GNU Linker来链接Mach-O对象, 包括.dylib .a .o ; 在终端中输入man ld 定位到 -lx部分. 可以看出 iOS 支持链接的Mach-O对象全是以 libx.dylib y.o形式命令的. 完全兼容GNU Linker. 更多信息可进入具体网址查看.

  1. Tweak.xm
  • 如果后缀名是一个x, 那么源文件支持Logos和C语法. 如果是xm 支持Logos和C/C++语法.

  • Logos语法简介:

    (1) %hook 指定要hook的类, 以%end结尾.

    (2) %log 在方法内部使用, 将函数的类名 参数等信息写入syslog, 可以以%log([() , ...])的格式追加其他打印信息. 如: %log((NSString *)@“LQS”, (NSString *)@“Debug”); 打印结果就是 LQS, Debug.

    (3) %orig 在函数内部使用, 执行被勾住的函数的原始代码. 如果没有它那么原始代码不会执行. 还可以利用它更改原始函数的参数如图:

    (4) %group 用于将%hook分组, 便于代码管理和按条件初始化分组, 以%end结尾. 一个%group可以包含多个%hook, 所有不属于自定义group的%hook会被隐式归类到 %group_ungrouped中.使用如图, 意思是在%group iOS 7Hook中 勾住iOS 7的iOS 7Method, 在%group iOS 8Hook中 勾住iOS 8的iOS 8Method, 然后在%group_ungrouped中勾住SpringBoard类的powerDown函数.需要注意的是%group必须配合下面的%init使用才能生效.

    (5) %init 该指令用于初始化某个%group, 必须在hook或%ctor内调用; 可以指定group, 也可以不带参数则初始胡_ungrouped. 只有调用了%init, 对用的%group才能生效.

    (6) %ctor 用于完成初始化工作. 如果不显式定义, Theos会自动生成一个%ctor, 并在其中调用 %init(_ungrouped).

    因此这里可以生效, 因为Theos隐式的定义了如下内容:

    然后如图:

    这里显式的定义了%ctor, 缺没有显式的调用%init, 所以 %group(_ungrouped) 不起作用. %ctor一般用于初始化%group, 以及进行MSHookFunction等操作.

    (7) %new 在函数内部使用, 给一个现有类添加函数, 功能与class_addMethod相同.用法如下:

    (8) %c 等同于objc_getClass或NSClassFromString 动态获取一个类的定义, 在%hook 或%ctor内使用.

    %ctor {
    MyObject *myObject = [[%c(MyObject) alloc] init];
    NSLog(@"myObject: %@", [myObject someValue]);
    }
    复制代码

    (9) 更多Logos语法可以到 ( iphonedevwiki.net/index.php/L… )查看


  1. control 记录了deb包管理系统所需的基本信息, 会被打包进deb包里. 内容大体意思:

    (1) Package : 描述这个deb包的名字.

    (2) Name : 工程的名字

    (3) Depends : 描述这个deb的依赖. 依赖指 固件版本或其他程序, 如果不满足依赖条件不能运行 如:

    Depends: mobilesubstrate, firmware (>= 8.0)

    依赖mobilesubstrate这个框架, 而且版本必须在iOS8以上.

    (4) Version : deb版本

    (5) Architecture : 描述的时deb包安装的目标设备架构

    (6) Description : deb的简单介绍

    (7) Maintainer : deb包的维护人

    (8) Author : tweak的作者

    (9) Section : deb包的程序类别 更多信息可以移步debian 网站


  1. LQS.plist
  • 作用和Info.plist类似, 描述的tweak的作用范围.
  • Filter有三个key值

    (1) Bundles 指定一个或者多个Bundle ID 为tweak的作用对象.

    (2) Classes 指定一个或者多个class为tweak的作用对象.

    (3) Executables 指定一个或者多个可执行文件为tweak的作用对象.

    (4) 当Filter下有不同键值对时需要添加一个键值对.Mode : Any


  1. 编译 打包 安装
  • 编译: 首先cd到工程目录, 然后执行make进行编译 会看到如图:

    从输出信息可以看出Theos完成了预处理 编译 签名等一系列操作. 然后在工程里面会出现一个.theos的隐藏文件 在里面就可以得到编译好的动态库. 如果你的Mac看不到隐藏文件, 自行百度.

  • 打包 使用的make package 命令. 来自于Theos本身, 其实就是先执行make 在执行dpkg-deb. 如图:

    上面生成了一个 名字 com.yourcompany.a_0.0.1-2+debug_iphoneos-arm.deb的安装包, 而且使用这个命令后还会生成一个 “_" 文件夹, 它里面有2个文件夹DEBIAN和Library, 其中DEBIAN里面有tweak工程的control文件, Theos在编译过程中向control文件增加了几个字段而已. 而Library文件目录图 以及A在Cydia中的文件系统相同

    使用make clean 清理工程, 实际作用就是依次执行 rm-rf./obj 和 rm-rf /Users/design/Desktop/a/.theos/_ 两个命令. 从而删除了 编译和打包生成的文件.

    更多关于deb的学习 移步debian官网

    在打包的时候如果出现如下问题:

/opt/theos/vendor/dm.pl/dm.pl
注释掉第12、13行 #use IO::Compress::Lzma; #use IO::Compress::Xz;
复制代码
/opt/theos/makefiles/package/deb.mk;
第6行lzma改为gzip. 如_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
复制代码
export THEOS=你的theos安装路径.
复制代码

如果不想每次配置, 可以移步到 配置Theos的环境变量

这个问题是因为要kill的进程不存在, 造成这个问题的原因一般是在创建Tweak的时候写错了进程, 要么就是在安装的时候要kill的进程没有启动.

  • 安装deb

    第一种是图形安装法: 通过iFunBox等软件把deb拖到iOS 中, 然后用iFile安装它. 过程繁琐.

    第二种是命令行安装法: 这个方法要用到ssh命令, 所以手机要安装OpenSSH.

    • 首先在Makefile最上一行(必须在最上一行)加上手机连接局域网的IP地址. THEOS_DEVICE_IP = 192.168.1.101. 然后执行 make package install 直接安装到手. 由于每次安装要输入2次root密码所以我这里有一篇文章专门解决了这个问题.

Tweak开发

具体移步到我的另一篇文章

Reveal

由ITTY BITTY出品的UI分析工具 , 可以直观的查看App的UI布局. 很显然我们要做的就是利用它查看他人的App.

  1. 首先在Cydia中安装Reveal2Loader, Reveal Loader(如果Reveal版本过低需要用Reveal Loader)太老了而且不支持高版本的Reveal.

  2. 然后查看手机中有没有RHRevealLoader这个文件夹 如果没有就手动创建一个(mkdir /Library/RHRevealLoader), 注意路径!. 如图:

  3. 然后打开Reveal在Help选项下 选中其中的 show Reveal Library in Finder . 然后把 libReveal.dylib 通过scp或者iFunBox等方式拷贝到 RHRevealLoader 目录下. 如果不存在libReveal.dylib就把RevealServer改成libReveal.dylib.

  4. 在系统设置里面找到Reveal这个App, 然后点击 Enabled Applications, 然后进入到配置界面. 然后分析哪个app就直接打开对应的开关.

  5. 最后还要设置OSX和iOS 位于同一网段, 或者使用USB的方式更好. 然后启动Reveal和App.

IDA

是一个支持windows Linux Mac OS 多平台的反汇编器/调试器. 功能强大.

IDA的使用

把要逆向的app直接扔进IDA就好了 然后会有一个弹框选择一些东西. 架构根据我们的设备选择. 最好是向下兼容. 如图:

有个地方需要注意, Binary file这个选项是为了兼容不同的处理器, 把多种指令糅合到一个binary. 所以建议选择和我们设备对应的处理器架构.

然后就会看到如下界面:

Functions window : 展示IDA分析出来的所有函数. 双击函数会进入到函数体. 而且可以根据名字搜索函数. Search again 还能遍历这些函数名. IDA除了将class-dump导出的函数罗列出来, 还能将class-dump做不到的方法罗列出来. Class-dump 导出的大部分都是OC函数. 而subroutine只是一个代号, 没有明显意思, 分析难度大.

Main window : 首先选择一个方法然后双击跳转到函数体.然后按一下空格切换成Text view 显示模式. 而Graph view则是把程序逻辑用方块形式表现出来. 各个方块之间的执行顺序用带箭头的线表示, 当执行分支时, 满足条件的线是绿色, 否则就是红色. 当执行没有分支时线是蓝色. 如图:

当执行上面模块的时候判断R0是否为0.如果是0则走红色的线, 否则是绿色的线.

当选中一个符号时, 相同的符号都会亮起相同的颜色. 方便追踪这个符号. 双击符号可以查看它的实现.

当选中一个符号右键时, 会出现功能列表, 然后选择 Jump txref to perand 后出现的窗口罗列了这个文件中显示引用这个符号的所有信息. 意思就是这个变量在哪里被调用过.

也可以显示成图形的引用关系, 选择 Xrefs graph to 就会显示这个符号被引用的所有模块, 而Xrefs graph from会显示这个符号显示引用的所有符号. 如图:

iFunBox

一款老牌的iOS文件管理工具, 可以方便的操作iOS中的文件. 有一点需要注意越狱的iOS必须安装 Apple File Conduit 2(AFC2). 这样才能浏览iOS全系统文件. 在网上可以下载, 如果找不到也可以到我的GitHub上下载.

dyld_decache

在iOS 3.1 后包括framework在内的许多库文件存进了一个大cache里, 这个cache位于/System/Library/Caches/com.apple.dyld/dyld_shared_dyld_shared_cache_armv7 .可以使用KennyTM开发的 dyld_decache 将库中的二进制文件提取出来.

使用dyld_decache之前要把系统库文件拷贝到电脑中.

(1) 首先将 /System/Library/Caches/com.apple.dyld/dyld_shared_dyld_shared_cache_armv7(dyld_shared_dyld_shared_cache_arm64) 从iOS 拷贝到电脑中, 然后用 dyld_decache 赋予其可执行权限. chmod +x dyld_decache[v0.1c]文件路径

(2) 然后执行 dyld_decache文件位置 -o 要存放的文件位置 从iOS中导出的框架位置. 这里根据不同的设备选择自己的框架


但是如果你的手机架构是arm64, 那么用这个工具是不行的.这里给出另外一个方案:

(1) 下载提取工具dsc_extractor, 到我的GitHub上找, 如果没有请联系我.

(2) 然后在终端执行:

dsc_extractor路径  arm64框架包 要存放的路径
复制代码

出现如下图即是成功:


好了结束Mac工具篇, 下一篇是iOS工具篇, 以上所有操作最好自己实现一下, 这样对自己以后的学习帮助很大, 而且出现问题能够很快解决, 同时提升自己解决问题的能力.

本文仅供学习, 欢迎勘误, 纯手打.

转载于:https://juejin.im/post/5adda6eef265da0b9e64ad5c

iOS逆向工程Mac工具篇相关推荐

  1. iOS开发mac工具

    前言   iOS工程师一直都是那么的高逼格,用的是Mac电脑,耍的是iPhone手机,哇咔咔~~   但是,作为一名iOS开发工程师,我们除了高逼格外,还必须是全能的.你不会点UI设计.不会点后台语言 ...

  2. iOS开发笔记 - 工具篇

    工欲善其事,必先利其器.作为一个合格的iOS开发者,熟练的使用各种开发或辅助开发的工具也算是一项必备技能吧,下面是我整理的一些工具及其应用场景和使用方法. 文档浏览工具 Dash 网络抓包工具 Cha ...

  3. ios 逆向工程文档汇总

    iOS逆向工程工具集 http://www.jianshu.com/p/7f9511d48e05 移动App入侵与逆向破解技术-iOS篇 http://blog.csdn.net/heiby/arti ...

  4. iOS逆向工程-工具篇

    对于初开始学习iOS逆向工程的人来说,实现一个tweak可以算是入门逆向工程了.当然了,可能你现在还不知道tweak是什么.简单来说,你可以把一个tweak当作某一个app的一个插件(类似于浏览器广告 ...

  5. iOS逆向工程- 工具详解

    前言 一.逆向工程的要求 具备丰富的 iOS 开发经验 最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理. 拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MV ...

  6. 初涉iOS逆向工程:免越狱修改微信(外观篇)

    点击上方"iOS开发",选择"置顶公众号" 关键时刻,第一时间送达! 美国学者埃德加·戴尔(Edgar Dale)1946年提出了"学习金字塔&quo ...

  7. iOS Hook相关教程 工具篇

    iOS hook相关教程 工具篇 osx 工具集 class-dump 建议安装 class-dump,顾名思义,就是用来dump目标对象的class信息的工具.该工具利用Objective-C语言的 ...

  8. ios不能保存png_AnyTrans for iOS for Mac (强大的ios设备管理工具)

    AnyTrans for iOS已在macdown上线!AnyTrans for iOS可以全面管理您的iPhone,Android和云内容.AnyTrans应用程序包括iMobie的签名工具iWiz ...

  9. AnyTrans for iOS for mac(ios数据传输管理工具)

    AnyTrans 是一款专业的ios管理工具,以聪明的方式管理.传输.备份.导出.导入.删除.修改.上传.管理所有的iOS数据和文件,在一个便利的地方完全管理你的iPhone,iPad,iPod,甚至 ...

最新文章

  1. 2020年数据科学领域4个最热门的趋势
  2. 解决vue中对象属性改变视图不更新的问题
  3. C# ,asp.net 获取当前,相对,绝对路径
  4. Win2008 R2 WEB 服务器安全设置指南之修改3389端口与更新补丁
  5. 使用insert向表中添加数据MySQL_使用INSERT语句向表中插入数据(MSSQLSERVER版)
  6. 框架:Spring的自动装配
  7. 搭建认证服务器 - Spring Security Oauth2.0 集成 Jwt 之 【密码认证流程】 总结
  8. 奈奎斯特采样定理_通俗理解奈奎斯特带宽
  9. Java函数式编程和Lambda表达式
  10. ascll 和gbk,utf-8的简介
  11. 用RAII技术管理资源及其泛型实现
  12. php redis 投票_高性能Redis服务架构分析与搭建
  13. Pycharm TensorFolw配置
  14. mysql vc调用时内存错误
  15. 关于brvah的setEmptyView功能无法显示问题
  16. 融云即时通讯SDK集成 -- 华为推送的点击跳转处理
  17. Dest0g3 520迎新赛部分WP
  18. 【java】getResourceAsStream(“.properties“)配置文件无法读入问题
  19. 让技术Leader狂点赞的Linux速成手册,到底有多强悍?
  20. GitHub下载神器,被下架后又复活

热门文章

  1. SurfaceView使用方法简介-来自网络
  2. 文本/文章相似度数据集及使用示例
  3. 2021年4月自考总结
  4. 睿智的目标检测62——Keras搭建YoloV7目标检测平台
  5. 本地开发部署微信公众号(H5)流程和坑点
  6. 泊松分布的“入最大似然估计
  7. PCB工程师这几点习惯
  8. 每天5分钟,细读PHP手册-14
  9. java计算机毕业设计文物管理系统源程序+mysql+系统+lw文档+远程调试
  10. 怎样修改日立uax规格表_UAX型电梯调试手册