逆向学习

Theos

2020-05-10  本文已影响0人  coder_feng

安装签名工具ldid

先确保安装了brew

$ /usr/bin/ruby -e "$(curl -fsSL

https://raw.githubusercontent.com/Homebrew/install/master/install)"

修改环境变量

修改用户的配置文件

vim ~/.bash_profile

在.bash_profile 文件后面加入以下2行

export THEOS = ~/theos

export PATH=$THEOS/bin:$PATH

让.bash_profile配置的环境变量立即生效(或者重新打开终端)

source ~/.bash_profile

下载theos

建议在$THEOS目录下载代码(也就是刚才配置的~/theos 目录)

git clone --recursive https://github.com/theos/theos.git $THEOS

新建tweak项目

cd到一个存放项目代码的文件夹(比如桌面)

选择[11.] iphone/tweak(由可能不同版本的theos不一样的选项数字,但是都是选择这一项)

创建theos项目

填写项目信息

1.Project Name:项目名称

2.Package Name:项目ID(随便写)

3.Author/Maintainer/Name

4.[iphone/tweak]MobileSubstrate Bundle filter

需要修改的APP的Bundle Identifier,可以通过Cycript查看APP的bundle Identifier

5.[iphone/tweak] List of applications to terminate upon installation

直接敲回车按照默认做法就行

项目

编辑Makefile

在前面加入环境变量,写清楚通过哪个IP和端口访问手机

THEOS_DEVICE_IP;THEOS_DEVICE_PORT

MAKEFILE

如果不希望每个项目的Makefile都编写IP和端口环境变量,也可以添加到用户配置文件中,编辑完毕后,$source ~/.bash_profile 让配置生效(或者重启终端)

bash_profile

如果是通过wifi安装的话,那么THEOS_DEVICE_IP = 手机wifi IP;THEOS_DEVICE_PORT=22;

编写代码

打开Tweak.xm 文件

tweak.xm

怎么知道知道这个Tweak.xm 文件怎么写,我们通过Reveal打开对应的App,然后出现广告的页面,通过Reveal可以找到相关的类,然后再通过class-dump导出header文件查找出那个类,然后从那个类里面,获取相关的方法;

reveal

就是通过类似方式去去除广告的

编译-打包-安装

编译:make

打包:make package(打包成deb)

安装:make install(默认会自动重启SpringBoard)

可能遇到的问题

1.make package的错误

error

是因为打包压缩方式有问题,改成gzip压缩就行了,修改dm.pl 文件,用#号注释下面两句

dm.pl

修改deb.mk 文件第6行的压缩方式为gzip

2.make的错误

error

是因为多个Xcode导致路径(有可能安装了好几个Xcode),需要指定一下Xcode

error error

是因为之前已经编译过,有缓存导致的,clean一下就可以了

error

上面的操作,如果成功之后,会发现在手机动态库加载的目录下有

动态库加载路径

练习

1.将桌面的更新数字去掉;

2.给微信的发现界面增加2行功能;

微信需要通过dumpdecrypted.dylib 来才能脱壳成功DYLD_INSERT_LIBRARIES= dumpdecrypted.dylib /path/wechat

theos资料查询

目录架构:https://github.com/theos/theos/wiki/Structure

环境变量:http://iphonedevwiki.net/index.php/Theos

Logos语法:http://iphonedevwiki.net/index.php/Logos

%hook,%end:hook 一个类的开始和结束

%log:打印方法调用详情(可以通过Xcode-Window-Devices and Simulators)查看日志;

HBDebugLog:跟NSLog类似

%new:添加一个新的方法

%c(className):生成一个Class对象,比如%c(NSObject),类似于NSStringFromClass,objc_getClass()

%orig:函数原来的代码逻辑

%ctor:在加载动态库时调用

%dtor:在程序退出时调用

logify.pl:可以将一个头文件快速转换成已经包含打印信息的xml文件(logify.pl xx.h > xx.xm);

如果有额外的资源文件(比如图片),放在项目的layout文件夹中,对应着手机的根路径

theos-tweak的实现过程

编写Tweak代码;

make:编译成Tweak代码为动态库(*.dylib)

make package:将dylib打包成为deb文件

make install:将deb文件传送到手机上,通过Cydia安装deb

插件将会安装在/Library/MobileSubstrate/DynamicLibraries文件夹中(*.dylib:编译后的Tweak代码,*.plist存放着需要hook的APP ID)

当打开APP时,Cydia Substrate (Cydia 已自动安装的插件)会让App去加载对应的dylib,修改App内存中的代码逻辑,去执行dylib中的函数代码

疑问?

未脱壳的App是否支持tweak?

支持,因为tweak是在内存中实现的,并没有修改.app包中的可执行文件

tweak是否永久性?

取决于tweak中用到的App代码是否被修改过

未越狱的手机是否支持tweak?

不支持

能不能对Swift、C函数进行tweak?

可以,方式跟OC不一样

能不能对游戏项目进行tweak?

可以,但是游戏大多数是通过C#、C++编写的,而且类名函数名会进行混淆操作

logify.pl 注意点

logify.pl 生成的xm文件,有很多时候是编译不通过的,需要进行一些处理

删除__weak;删除inout;删除协议,比如(@protocol XXTestDelegate)

删掉-(void).cxx_destruct(%log;%orig;}

删除HBLogDebug(@"=0x%x",(unsigned int)r);

替换类名为void,不如将XXPerson *替换为void *,或者声明一下类信息@class XXPerson

上一篇下一篇

猜你喜欢

热点阅读