iOS逆向学习笔记之--Theos的使用

iOS逆向学习笔记之–Theos的基本使用

  • Theos安装
sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
// 修改theos目录的所有者
sudo chown -R $(id -u):$(id -g)   /opt/theos
  • 配置ldid
    ldid是专门用来签名iOS可执行文件的工具,用在越狱环境中取代Xcode自带的codesign

方法一:
从http://joedj.net/ldid下载ldid
然后拷贝到opt/theos/bin目录下面
赋予执行权限

sudo chmod 777 /opt/theos/bin/ldid

方法二:
brew install ldid fakeroot

  • theos的使用

创建tweak工程,编写xm文件分析目标APP类和方法
1、创建tweak工程
iOS逆向学习笔记之--Theos的使用_第1张图片

操作解释如下:

// 选择工程模板,这里选择iphone/tweak
  Choose a Template (required): 11   
  //工程名称
  Project Name (required): DingDingTweakProject  
  //deb包的名字(类似于bundle identifier)
  Package Name [com.yourcompany.myfirstreproject]: com.yifu.dingding 
  // tweak作者
  Author/Maintainer Name [System Administrator]: wj  
  // tweak作用应用的bundle identifier
  [iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.laiwang.DingTalk 
  // tweak安装完成后需要重启的应用
  [iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: DingTalk
  Instantiating iphone/tweak in myfirstreproject/...
  Done.
  

2、查看创建的工程文件开始编写对应文件
Makefile

// 工程包含的通用头文件
include $(THEOS)/makefiles/common.mk  
// Tweak工程名称
TWEAK_NAME = DingDingTweakProject
// tweak包含的源文件,指定多个文件时用空格隔开
DingDingTweakProject_FILES = Tweak.xm
// tweak工程的头文件,一般有application.mk、tweak.mk和tool.mk几类
include $(THEOS_MAKE_PATH)/tweak.mk
// tweak安装之后需要做的事情,杀掉原有进程
after-install::
	install.exec "killall -9 DingTalk"
	
补充:
// 编译选项debug和release
DEBUG = 0
// 越狱iPhone的IP地址 
THEOS_DEVICE_IP = 192.168.2.122
// 如果用usbmuxd转发ssh之后填localhost
THEOS_DEVICE_IP = localhost
THEOS_DEVICE_PORT = 2222
// 如果在~/.bash_profile中配置了环境变量则上面两行可以不用写
export THEOS_DEVICE_IP = localhost
export THEOS_DEVICE_PORT = 2222

// 指定处理器架构
ARCHS = armv7 arm64
// 指定需要的SDK版本iphone:Base SDK:Deployment Target
TARGET = iphone:latest:8.0  // 最新的SDK,程序发布在iOS8.0以上
//导入框架,多个框架时用空格隔开
DingDingTweakProject_FRAMEWORKS = UIKit 
DingDingTweakProject_PRIVATE_FRAMEWORKS = AppSupport
// 链接libsqlite3.0.dylib、libz.dylib和dylib1.o
DingDingTweakProject_LDFLAGS = -lz –lsqlite3.0 –dylib1.o
//make clean
clean::
    rm -rf ./packages/*
    rm -rf ./obj/*

control文件
control文件记录了deb包管理系统所需的基本信息,会被打包进deb包里

Package: com.yifu.dingding
Name: DingDingTweakProject
Depends: mobilesubstrate
Version: 0.0.1
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: wj
Author: wj
Section: Tweaks

Tweak.xm文件
xm”中的“x”代表这个文件支持Logos语法,如果后缀名是单独一个“x”,说明源文件支持Logos和C语法;如果后缀名是“xm”,说明源文件支持Logos和C/C++语法。

%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

编译命令:
make 编译
make package 打包
make install 安装

3、Logos语法介绍
Logs语法 详细语法可参考:http://iphonedevwiki.net/index.php/Logos
%hook
指定需要hook的class,必须以%end结尾。可以被%group包含

%group
该指令用于将%hook分组,便于代码管理及按条件初始化分组,必须以%end结尾。
一个%group可以包含多个%hook,所有不属于某个自定义group的%hook会被隐式归类到%group_ungrouped中。

%new
在%hook内部使用,给一个现有class添加新函数,功能与class_addMethod相同。
注: Objective-C的category与class_addMethod的区别: 前者是静态的而后者是动态的。

%ctor
tweak的构造函数,完成初始化工作;如果不显示定义,Theos会自动生成一个%ctor,并在其中调用%init(_ungrouped)。

%dtor
tweak的构造函数,完成收尾。如果不显示定义,Theos会自动生成一个%dtor。

%init
该指令用于初始化某个%group,必须在%hook或%ctor内调用;如果带参数,则初始化指定的group,如果不带参数,则初始化_ungrouped.
注: 切记,只有调用了%ini,对应的%group才能起作用!

%ctor {
  if (kCFCoreFoundationVersionNumber > 1200) %init(iOS9);
   else %init(iOS8);
}

%c
该指令的作用等同于objc_getClass或NSClassFromString,即动态获取一个类的定义,在%hook或%ctor内使用 。

%hook SpringBoard
- (void)_menuButtonDown:(id)down
{
    %orig;
    SBScreenShotter *shotter = [%c(SBScreenShotter) sharedInstance];
    [shotter saveScreenshot:YES]; 
}
%end@

%log
该指令在%hook内部使用,将函数的类名、参数等信息写入syslog,可以%log([(),……])的格式追加其他打印信息。

Cydia内搜索安装syslogd
查看日志
tail -f /var/log/syslog | grep DingTalk
清空日志
cat /dev/null > /var/log/syslog
iOS设备tail命令不存在的解决办法:在Cydia中安装Core Utilities

%orig
该指令在%hook内部使用,执行被hook的函数的原始代码;也可以用%orig更改原始函数的参数。

%orig(arg1, …)

4、借助theos模块logify.pl来批量生成需要分析目标类的Tweak.xm

/opt/theos/bin/logify.pl ./Headers/DTAccountPasswordViewController.h > ./dingdingtweakproject/Tweak.xm 

5、layout
编写Tweak时需要加入图片或者文件,然后在代码中使用它们,这需要使用layout将文件放到指定的路径中,layout目录相对于设备的根目录
例如:在layout中放了一张图片 layout/mv.png
dpkg会将layout中的文件拷贝到目标设备, 这里mv.png就在根目录/mv.png下

// 利用dpkg 命令查看deb包的目录结构 
dpkg -c packages/com.yifu.haluo_0.0.1-40+debug_iphoneos-arm.deb 
drwxr-xr-x root/wheel        0 2018-07-10 16:30 .
-rw-r--r-- root/wheel   176983 2018-07-04 17:09 ./mv.png
drwxr-xr-x root/wheel        0 2018-07-10 16:30 ./Library
drwxr-xr-x root/wheel        0 2018-07-10 16:30 ./Library/MobileSubstrate
drwxr-xr-x root/wheel        0 2018-07-10 16:30 ./Library/MobileSubstrate/DynamicLibraries
-rw-r--r-- root/wheel       56 2018-07-10 16:30 ./Library/MobileSubstrate/DynamicLibraries/HaLuoTweakProject.plist
-rwxr-xr-x root/wheel    67872 2018-07-10 16:30 ./Library/MobileSubstrate/DynamicLibraries/HaLuoTweakProject.dylib

在手机根目录中查找mv.png
iPhone:~ root# cd /
iPhone:/ root# ls -al
total 198
drwxrwxr-t 18 root     admin       986 Jul 12 10:49 ./
drwxrwxr-t 18 root     admin       986 Jul 12 10:49 ../
d-wx-wx-wt  2 _unknown _unknown     68 Aug 20  2014 .Trashes/
----------  1 root     admin         0 Aug  7  2014 .file
drwx------  2 _unknown _unknown    442 Jul 12 10:47 .fseventsd/
lrwxr-xr-x  1 root     admin        32 Jun 16 15:26 Applications -> /var/stash/_.o3wJLh/Applications/
drwxrwxr-t  8 root     admin       340 Aug 20  2014 Developer/
drwxrwxr-x  9 root     wheel       374 Oct 22  2014 DeveloperPatch/
drwxrwxr-x 18 root     admin       816 Jul  2 11:06 Library/
drwxr-xr-x  3 root     wheel       102 Dec 26  2007 System/
lrwxr-xr-x  1 root     admin        11 Jul 12 10:49 User -> /var/mobile/
drwxr-xr-x  2 root     wheel      2040 Jun 19 11:08 bin/
drwxr-xr-x  2 root     wheel        68 Oct 28  2006 boot/
drwxrwxr-t  2 root     admin        68 Aug  7  2014 cores/
dr-xr-xr-x  3 root     wheel      1095 Jul 12 10:47 dev/
lrwxr-xr-x  1 root     wheel        12 Jun 16 15:22 etc -> private/etc//
drwxr-xr-x  2 root     wheel        68 Oct 28  2006 lib/
drwxr-xr-x  2 root     wheel        68 Oct 28  2006 mnt/
-rw-r--r--  1 root     wheel    176983 Jul  4 17:09 mv.png

  • 补充
    Theos安装的插件默认是安装在/Library/MobileSubstrate/DynamicLibraries/目录下面的,最近新版的发现插件目录安装载根目录下面了。

解决办法:

1、brew install dpkg
2、修改/opt/theos/makefiles/package/deb.mk文件内容
$(ECHO_NOTHING)COPYFILE_DISABLE=1 $(FAKEROOT) -r $(_THEOS_PLATFORM_DPKG_DEB) -Z$(_THEOS_PLATFORM_DPKG_DEB_COMPRESSION) -z$(THEOS_PLATFORM_DEB_COMPRESSION_LEVEL) -b "$(THEOS_STAGING_DIR)" "$(_THEOS_DEB_PACKAGE_FILENAME)"$(ECHO_END)
上面这一句修改为下面这一句代码就可以搞定
$(ECHO_NOTHING)COPYFILE_DISABLE=1 $(FAKEROOT) -r dpkg-deb -Zgzip -b "$(THEOS_STAGING_DIR)" "$(_THEOS_DEB_PACKAGE_FILENAME)" $(STDERR_NULL_REDIRECT)$(ECHO_END)

你可能感兴趣的:(iOS)