进行iOS逆向开发首先需要下载相关的工具。
准备工作
- 越狱手机(例如我的:iPhone 4s,系统8.4.1)
- 越狱手机上的Cydia中安装
Cycript
,OpenSSH
- Mac上安装
iFunBox
,XCode
,Hopper Disassembler
,Sublime Text
- Mac终端命令行中安装
Class Dump
,Theos
,Dumpdecrypted
工具作用介绍
OpenSSH
Mac连接手机,通过Mac的终端命令操作手机。
Cycript
获取手机中某一个运行的进程,并可以获取App进程后用OC
代码获取反编译App的Documents
目录路径。
iFunBox
Mac端的连接手机后的图形界面,比较方便的把砸壳后的文件直接导出到Mac上。下载地址:iFunBox
Xcode
这个就不用多说了,iOS开发工具。
Hopper Disassembler
这个是进行反汇编的工具,可以反汇编、反编译并且调试你的应用,我们可以通过这个工具查看伪代码的方法名和变量,还原函数体的具体逻辑。
下载破解版地址:hopper disassembler for mac破解版 v4.0.8
破解方法如下:http://www.sdifen.com/hopperdisassembler408.html
更多使用方法可以参考文章:iOS 逆向工程工具集之Hopper Disassembler破解版的安装与使用
Class Dump
对App可执行文件获取其头文件,这样我们可以根据头文件中暴露的方法名去猜测其App的编写逻辑。然后利用上述的反编译工具对某一文件进行函数的具体编写逻辑。
- 下载地址:Class Dump
安装方法:
点击下载后解压后会有class-dump和源码文件。
- 如果是OS X 10.11之前,可以直接将class-dump 复制到/usr/bin/class-dump目录下即可。
- 如果是OS X 10.11,因为没有/usr/bin文件夹的写权限,所以我们得用另外的方法。
- 1、打开Terminal,输入
mkdir ~/bin
,在当前用户根目录下创建一个bin目录; - 2.把class-dump给拷贝到这个目录里,并赋予其可执行权限:mv /path/to/class-dump ~/bin;
chmod +x ~/bin/class-dump
; - 3.打开~/.bash_profile文件:vi ~/.bash_profile,在文件最上方加一行:export PATH=$HOME/bin/:$PATH,然后保存并退出(在英文输入法中依次按下esc和:(shift + ;,即冒号),然后输入wq,回车即可);
- 在Terminal中执行
source ~/.bash_profile
;
更多class-dump
的使用可以参考文章iOS逆向之class-dump
Theos
创建一个Tweak
工程,通过定制工程文件,再通过指定的bundle id
,编译+打包+安装,从而向手机上的App注入代码,进而实现对某个App中的功能的破解(例如会员去广告、抢红包等功能)。
安装方法:
-
1、安装
dpkg
sudo brew install dpkg
dpkg是Theos依赖的工具之一,dpkg是Debian Packager的缩写。我们可以使用dpkg来制作deb,Theos开发的插件都将会以deb的格式进行发布的。所以我在安装Theos之前要安装dpkg, 当然此处我们使用强大的brew来完成dpkg的安装。
-
2、安装ldid
sudo brew install ldid
在Theos开发插件中,iOS文件的签名是使用
ldid
工具来完成的,也就是说ldid
取代了Xcode自带的Codesign
。 -
3、Theos安装
cd opt/
git clone --recursive https://github.com/theos/theos.git因为我们的Theos一般是安装在/opt/目录下的,所以先cd到/opt目录下,然后从github上相关的地址clone下来即可
下载好Theos后,还需要把theos的权限改为自己,如下命令chown $(id -u):$(id -g) /usr/local/opt/theos
最后这一步也很重要,要把theos的执行路径加入到环境变量中,在~/. bash_profile中加上这么两句:
export THEOS=/usr/local/opt/theos
export PATH=/usr/local/opt/theos/bin/:$PATHvim ~/.bash_profile加上上面两条,保存退出。
-
4、测试安装是否成功
重启终端后,cd到任意可执行目录,
执行:nic.pl
New Instance Creator开始执行则已经安装成功。
更多关于theos
的安装与使用参考文章:
- iOS逆向工程之Theos
- ios-逆向 手把手安装最新版Theos
Dumpdecrypted
俗称:砸壳
,dumpdecrypted
是个出色的app脱壳开源工具,它的原理是:将应用程序运行起来(iOS系统会先解密程序再启动),然后将内存中的解密结果dump
写入文件中,得到一个新的可执行程序文件。
下载及生成砸壳用到dumpdecrypted.dylib工具,如下命令:
qingfengdeMacBook-Pro:练习 qingfeng$ git clone https://github.com/stefanesser/dumpdecrypted.git
Cloning into 'dumpdecrypted'...
remote: Enumerating objects: 31, done.
remote: Total 31 (delta 0), reused 0 (delta 0), pack-reused 31
Unpacking objects: 100% (31/31), done.
qingfengdeMacBook-Pro:练习 qingfeng$ ls
ArchitechureExample SwiftExample 架构学习
CoreAnimationExample TouchEventExample 函数式编程
RuntimeExample dumpdecrypted 工厂方法一
qingfengdeMacBook-Pro:练习 qingfeng$ cd dumpdecrypted
qingfengdeMacBook-Pro:dumpdecrypted qingfeng$ make
`xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos
qingfengdeMacBook-Pro:dumpdecrypted qingfeng$ ls
Makefile dumpdecrypted.c dumpdecrypted.o
README dumpdecrypted.dylib
更多相关使用参考文章:dumpdecrypted介绍及其使用
Sublime Text
打开后面要用到的Makefile
文件。
下载地址:Sublime Text
实现目标
我们来破解一款“传奇来了”的游戏,在我们打开“传奇来了”APP之后,自动弹出一个警告框。先放一张结果图:
实现流程
1、利用dumpdecrypted.dylib砸壳
第一步:利用OpenSSH
命令通过mac终端来操作手机,openSSH
密码是alpine
。退出登录的命令是exit
。手机和电脑需要在同一个网段,连接同一个wifi,然后点开设置查看当前手机分配的IP
地址。如下图:
然后输入如下命令(密码是alpine
):
qingfengdeMacBook-Pro:~ qingfeng$ ssh [email protected]
[email protected]'s password:
iPhone:~ root#
第二步:查找要反编译app的路径
ps -e
获取手机中所有的当前运行的进程
ps -A|grep mobile
抓取手机上运行的APP进程
运行命令如下:
iPhone:~ root# ps -e
PID TTY TIME CMD
1 ?? 0:15.59 /sbin/launchd
32 ?? 0:11.16 /usr/libexec/UserEventAgent (System)
36 ?? 0:18.43 /System/Library/Frameworks/CoreTelephony.framework/Sup
...
iPhone:~ root# ps -A|grep mobile
382 ?? 0:14.73 /usr/libexec/mobileassetd
940 ?? 0:36.71 /var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient
951 ttys000 0:00.01 grep mobile
iPhone:~ root#
其中的/var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient
是我们要破解的app的路径。
第三步:使用Cycript
找出反编译App的Documents目录路径
这里有两个路径,/var/mobile/Containers/Bundle/Application/
下的是app的路径,/var/mobile/Containers/Data/Application
则是我们要找的Documents
路径。
我们通过如下命令来获取App的Documents
路径。
iPhone:~ root# cycript -p CQClient
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomans:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/"
cy#
其中的/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/
即是我们要找的Documents目录路径。
退出cyscript
命令环境control+z
。如下:
cy# ^Z
[1]+ Stopped(SIGTSTP) cycript -p CQClient
iPhone:~ root#
退出OpenSSH
的命令是exit
。但在这之前需要输入命令jobs
,否则无法退出。具体可以查看这篇文章Linux中 “there are stopped jobs”问题的解决方案。命令如下:
iPhone:~ root# exit
logout
There are stopped jobs.
iPhone:~ root# jobs
[1]+ Stopped(SIGTSTP) cycript -p CQClient
iPhone:~ root# exit
logout
Connection to 192.168.11.130 closed.
第四步:将dumpdecrypted.dylib
拷贝到Documents目录下,此处是使用的scp dumpdecrypted.dylib路径 root@ip:Documents路径
方式。也可以使用iFunBox或者PP助手进行文件操作(我试了不行,不知道是不是方法不对,还是在iFunBox或者PP助手展示的文件路径不对)。此处的dumpdecrypted.dylib
可以通过上面Dumpdecrypted
工具介绍的方法生成。
命令如下:
qingfengdeMacBook-Pro:~ qingfeng$ scp /Users/qingfeng/Documents/WorkSpace/Exercise/dumpdecrypted/dumpdecrypted.dylib [email protected]:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/
[email protected]'s password:
dumpdecrypted.dylib 100% 193KB 1.8MB/s 00:00
qingfengdeMacBook-Pro:~ qingfeng$
第五步:使用dumpdecrypted
砸壳
重新用mac连接上手机,首先cd
到Documents路径下,然后执行命令DYLD_INSERT_LIBRARIES= dumpdecrypted.dylib app路径
。命令如下:
qingfengdeMacBook-Pro:~ qingfeng$ ssh [email protected]
[email protected]'s password:
iPhone:~ root# cd /var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/
iPhone:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient
mach-o decryption dumper
DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
[+] detected 32bit ARM binary in memory.
[+] offset to cryptid found: @0x9980(from 0x9000) = 980
[+] Found encrypted data at address 00004000 of length 655360 bytes - type 1.
[+] Opening /private/var/mobile/Containers/Bundle/Application/CE59CF92-3C59-46B5-B3ED-81F1F7CC0440/CQClient.app/CQClient for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 16384 in the file
[+] Opening CQClient.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4980
[+] Closing original file
[+] Closing dump file
iPhone:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents root#
利用ls
命令查看后,其中QQ.decrypted
就是我们要的破解文件。
iPhone:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents root# ls
CQClient.decrypted dumpdecrypted.dylib jrdb
2、使用class-dump
将文件解析
我们同样用scp
命令将CQClient.decrypted
拷贝到Mac桌面文件夹。
qingfengdeMacBook-Pro:~ qingfeng$ scp [email protected]:/var/mobile/Containers/Data/Application/A1BA8E41-6A42-4D1F-AAA5-7F1262622D25/Documents/CQClient.decrypted /Users/qingfeng/Documents/WorkSpace/Exercise
[email protected]'s password:
CQClient.decrypted 100% 1918KB 2.5MB/s 00:00
qingfengdeMacBook-Pro:~ qingfeng$
我们再使用class-dump
进行解析。
qingfengdeMacBook-Pro:QQHeader qingfeng$ class-dump --arch armv7 /Users/qingfeng/Documents/WorkSpace/Exercise/CQClient.decrypted -H -o /Users/qingfeng/Documents/WorkSpace/Exercise/CQClientHeader
qingfengdeMacBook-Pro:QQHeader qingfeng$
这样即可获取头文件。因为我用的手机是iPhone4s,所以使用armv7
,其他型号使用相对应的4(armv7),4s(armv7),5(armv7),5s(arm64),6(arm64),6s(arm64),7(arm64)等
。
如果是用的frida-ios-dump
砸壳,砸壳出来的ipa文件,可以从里面获取.app
文件,这个时候我们可以用class-dump -H /Users/xxxx/ProductName.app -o /Users/xxxx/HearderFile
这种形式的命令来获取头文件
3、反编译静态分析 Hopper Disassembler
Hopper是一款运行在Mac、Windows和Linux下的调试(os x only)、反汇编和反编译的交互式工具。
可以对32、64位的MAC程序、Windows程序和IOS程序(arm)进行调试、反编译等。功能如下:
- 能够分析出函数的代码块、变量等
- 可以生成代码块的控制流图CFG
- 可以通过Python脚本来调用Hopper的其他一些功能,使用更加灵活
- 在MAC上还可以通过GDP动态调试分析
- 对Objective C的极佳的支持——能够解析出Selector、字符串和发送的消息
- 反编译,生成伪代码
- 分析快速,且占用资源少
我们把CQClient.decrypted
拖进去,就能进行代码分析了。具体怎么分析可以参考这篇文章[Mac OSX 之自己动手初步学习破解软件入门](Mac OSX 之自己动手初步学习破解软件入门)
4、Tweak与Theos
tweak
的实质就是iOS平台的动态库。iOS平台上有两种形式的动态库,dylib
与framework
。Framework
这种开发者用的比较多,而dylib
这种就相对比较少一点,比如libsqlite.dylib
,libz.dylib
等。而tweak
用的正是dylib
这种形式的动态库。我们可以在/Library/MobileSubstrate/DynamicLibraries
目录下查看手机上存在着的所有tweak
。这个目录下除dylib
还存在着plist
与bundle
两种格式的文件,plist
文件是用来标识tweak
的作用范围,而bundle
是tweak
所用到的资源文件。
与正常的App开发使用Xcode不同,Tweak
的开发环境是theos
或者iosopendev
。iosopendev
是在theos
的基础上实现的基于Xcode的开发环境。而theos
是一种命令式的开发编译环境,与c/c++的命令行编译形式很相像。
详情参考这篇文章:Tweak及TheOS简介
安装参考工具介绍Theos
部分。
使用步骤及文件介绍如下:
1、Tweak
工程的创建
cd到要创建tweak
的目录下,执行如下指令:
nic.pl
执行完nic.pl
指令后,会出现如下选择模板的界面:
qingfengdeMacBook-Pro:CQClientTweak qingfeng$ nic.pl
NIC 2.0 - New Instance Creator
------------------------------
[1.] iphone/activator_event
[2.] iphone/application_modern
[3.] iphone/application_swift
[4.] iphone/cydget
[5.] iphone/flipswitch_switch
[6.] iphone/framework
[7.] iphone/ios7_notification_center_widget
[8.] iphone/library
[9.] iphone/notification_center_widget
[10.] iphone/preference_bundle_modern
[11.] iphone/tool
[12.] iphone/tool_swift
[13.] iphone/tweak
[14.] iphone/xpc_service
Choose a Template (required): 13
在这里我们要开发的是tweak
插件,所以输入13
选择iphone/tweak
,按下Enter
继续。接着出现如下需要我们填写信息的步骤:
Project Name (required): AlertTest
Package Name [com.yourcompany.alerttest]: com.tianfu.alert
Author/Maintainer Name [清风]: tianfu
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.cqll.90
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: com.cqll.90
Instantiating iphone/tweak in alerttest/...
Done.
- 1、
Project Name (required):
输入工程名字,必填项。 - 2、
Package Name [com.yourcompany.alerttest]:
包名 - 3、
Author/Maintainer Name [清风]:
作者名字 - 4、
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
要注入的程序的BundleID
,默认的进程为com.apple.springboard
,这里我们填写com.cqll.90
游戏传奇来了的BundleID
。 - 5、
List of applications to terminate upon installation
安装后需要重启的应用,这里我们也填写传奇来了的BundleID
,com.cqll.90
。
2、工程文件说明
Tweak
工程新建完成后,其工程目录的文件如下所示:
2.1 control文件
该文件记录了工程的基本信息,会被打包进deb
包中,字段内容如下:
Package: com.tianfu.alert
Name: AlertTest
Depends: mobilesubstrate
Version: 0.0.1
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: tianfu
Author: tianfu
Section: Tweaks
Package
字段:用于描述这个deb
的名字,采用的命名方式和bundle identifier
类似,可以按需更改;Name
字段:用于描述这个工程的名字,可以按需更改;-
Depends
字段:用于描述这个deb
的依赖。依赖指的是这个程序运行的基本条件,可以填写固件版本或其他程序,如果当前iOS不满足“依赖”中所定义的条件,则此tweak
无法正常工作,可以按需更改。例如:Depends: mobilesubstrate, firmware (>=6.0)
表示当前iOS版本必须在
6.0
以上,且必须安装MobileSubstrate,才能正常运行这个tweak
。 Version
字段:用于描述这个deb
包的版本号,可以按需更改;Architecture
字段:用于描述deb
包安装的目标设备架构,不要更改;Description
字段:deb
包的简单介绍,可以按需更改;Maintainer
字段:用于描述tweak
的作者,可以按需更改;Author
字段:用于描述tweak
的作者,可以按需更改;Section
字段:用于描述deb
包所属的程序类别,不要更改。
control
文件中,可以自定义的字段还有很多,一般上面的信息就已经足够了。更全面的可以查看官方网站。值得注意的是:Theos
在打包deb
时会对control
文件做进一步的处理。比如更改Version
字段为:0.0.1-2,标识Theos
的打包次数,方便管理;增加Installed-Size
字段,用于描述deb
包安装后的估算大小,与实际大小可能有偏差,不要更改。
2.2 Makefile
该文件用来指定工程编译和链接要用到的文件、框架、库等信息,将整个过程自动化。字段内容如下:
THEOS_DEVICE_IP = 192.168.11.130
THEOS = /usr/local/opt/theos
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = AlertTest
AlertTest_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 CQClient"
- 第一行的
include
字段指定了工程的common.mk
,固定写法,不要修改; -
TWEAK_NAME
字段填入的是建立工程时命令行输入的Project Name
,与control
文件中的Name
字段对应,不要更改; -
ReverseDemo_FILES
字段指定工程包含的源文件,如果工程中需要用到多个源文件则用空格将各个文件名分开,可以按需更改; -
include
字段指定工程的mk
文件,这里新建的是tweak
工程,所以填入的是tweak.mk
文件,还可以根据需求填入application.mk
以及tool.mk
文件。 - 最后一行
after-install
字段指定安装程序后需要执行的操作,这里需要注入CQClient
进程并执行自己的代码,因此需要重启CQClient
进程,好让MobileSubstrate
加载对应的dylib
Makefile文件中除了自动生成的这些字段外,还可以根据功能手动添加其他字段:
THEOS_DEVICE_IP
字段用来指定要连接的手机设备的IP
,方便后面安装。如上缩写export THEOS_DEVICE_IP = 192.168.11.130
。THEOS
是存放theos命令的路径。ARCHS
字段可以用来指定处理器架构,一般情况下填写ARCHS = armv7 arm64
即可。-
TARGET
字段用来指定SDK版本,例如:TARGET = iphone:7.0
-
framework
字段可以指定要导入的框架,例如ReverseDemo_FRAMEWORKS = UIKit
,UIKit为后续测试代码需要用到的框架,另一方面,还可以通过ReverseDemo_PRIVATE_FRAMEWORKS
字段指定要导入的私有库,格式不变。例如ReverseDemo_FRAMEWORKS = UIKit CoreTelephony CoreAudio ReverseDemo_PRIVATE_FRAMEWORKS = AppSupport ChatKit
更多的可以参考这篇文章Theos
2.3 AlertTest.plist
plist文件记录工程的配置信息,主要作用是指定程序的作用范围,内容如下:
从上面可以看到,该文件的内容是一系列的Dictionary
,最外层为Root
,Filter
键,Filter
键下得array
即为要设置的部分。该部分分为三类:
- 第一类是
Bundles
,即所编写程序的作用对象,这个类型的字段就是所要注入的程序Bundle名,如果要注入的进程为SpringBoard,则填入com.apple.springboard,可以指定多个作用对象; - 第二类是
Classes
,即指定要注入的类名,同样是根据填入的字符串来筛选注入的类名; - 第三类
Executables
,及指定要注入的可执行文件名。
这三类Array
可以根据需要来设定。但按照混合配置方式,一个文件只有满足Filter
中所有Array
下的至少一个条件,tweak
才能生效。这样显然不合理。所以额外有一个Mode
键,将其值设置为Any
,那么文件满足Filter
中的任一条件就能成为tweak
的作用对象。
当Filter下的array只有一类时,不需要添加Mode和Any键值对。
2.4 Tweak.xm
该文件是实现具体功能的关键所在,是实现具体功能的源文件,这个文件支持Logos和C、C++语法。文件内容如下:
/* How to Hook with Logos
Hooks are written with syntax similar to that of an Objective-C @implementation.
You don't need to #include , it will be done automatically, as will
the generation of a class list and an automatic constructor.
%hook ClassName
// Hooking a class method
+ (id)sharedInstance {
return %orig;
}
// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
%log; // Write a message about this call, including its class, name and arguments, to the system log.
%orig; // Call through to the original function with its original arguments.
%orig(nil); // Call through to the original function with a custom argument.
// If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}
// Hooking an instance method with no arguments.
- (id)noArguments {
%log;
id awesome = %orig;
[awesome doSomethingElse];
return awesome;
}
// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
*/
以上的注释展示了基本的Logos
语法,具体可以分为三类:
- 第一类
%hook
和%end
,其中%hook
后面指定要hook
的类名,另一方面,hook的整块逻辑完成后结尾要加上%end
,在hook逻辑中可以添加要hook的函数,并在函数体内部实现想要添加的代码逻辑; - 第二类是
%orig
,该语句代表执行原函数逻辑,即完成hook操作后可以选择是否调用原函数的代码,若需要调用则加上%orig;
即可; - 第三类是
%log
,这类代码的作用是在log
中打印hook
的函数的类名、参数等信息。
除了注释中展示的三种语法外,Logos还支持%group
、%init
、%ctor
等语法,更多的Logos语法参考这篇文章。
这里我们输入代码来实现个弹出提示框的简单功能,代码如下:
%hook AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"成功注入代码" message:@"IOS 逆向工程" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alertView show];
#pragma clang diagnostic pop
return %orig;
}
%end
3、编译&打包&安装
3.1 编译
Theos采用与debian相同的make
命令来编译Theos工程。执行如下指令:
qingfengdeMacBook-Pro:alerttest qingfeng$ make
输出结果如下:
qingfengdeMacBook-Pro:alerttest qingfeng$ make
> Making all for tweak AlertTest…
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (armv7)…
==> Linking tweak AlertTest (armv7)…
==> Generating debug symbols for AlertTest…
rm /Users/qingfeng/Documents/WorkSpace/Exercise/CQClientTweak/alerttest/.theos/obj/debug/armv7/Tweak.xm.mm
==> Preprocessing Tweak.xm…
==> Compiling Tweak.xm (arm64)…
==> Linking tweak AlertTest (arm64)…
==> Generating debug symbols for AlertTest…
rm /Users/qingfeng/Documents/WorkSpace/Exercise/CQClientTweak/alerttest/.theos/obj/debug/arm64/Tweak.xm.mm
==> Merging tweak AlertTest…
==> Signing AlertTest…
从上图的输出结果可以看到,Theos完成了预处理、编译、签名等一系列的操作,此时目录下多了一个.theos
文件夹。
3.2 打包
使用如下指令打包:
qingfengdeMacBook-Pro:alerttest qingfeng$ make package
输出结果如下:
qingfengdeMacBook-Pro:alerttest qingfeng$ make package
> Making all for tweak AlertTest…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak AlertTest…
dm.pl: building package `com.tianfu.alert:iphoneos-arm' in `./packages/com.tianfu.alert_0.0.1-1+debug_iphoneos-arm.deb'
这时候目录下多了一个packages
文件夹,里面有一个.deb
文件。
3.3安装
执行指令:
make package install
输出结果如下:
qingfengdeMacBook-Pro:alerttest qingfeng$ make package install
> Making all for tweak AlertTest…
make[2]: Nothing to be done for `internal-library-compile'.
> Making stage for tweak AlertTest…
dm.pl: building package `com.tianfu.alert:iphoneos-arm' in `./packages/com.tianfu.alert_0.0.1-4+debug_iphoneos-arm.deb'
==> Installing…
[email protected]'s password:
(Reading database ... 3518 files and directories currently installed.)
Preparing to unpack /tmp/_theos_install.deb ...
Unpacking com.tianfu.alert (0.0.1-4+debug) over (0.0.1-2+debug) ...
Setting up com.tianfu.alert (0.0.1-4+debug) ...
install.exec "killall -9 CQClient"
[email protected]'s password:
qingfengdeMacBook-Pro:alerttest qingfeng$
可以看到已经成功安装。打开app,看到如下结果:
更多的介绍参考文章:
1、iOS逆向之TheOS
2、iOS逆向教程 2.1 Theos的安装及用法
参考文章
1、iOS 逆向工程--基础工具的运用
2、iOS逆向工程
3、ios逆向傻瓜入门教程(一)
4、IOS APP破解完整流程(逆向工程完整详解)
5、iOS 逆向工程-浅析