iOS逆向工程(手动HOOK自己编写的APP)

发布时间:2017-10-20 8:04:32
来源:知识图谱

前言:上一篇文章已经介绍过逆向开发需要用到的一些工具,theos的基本介绍也讲过了,今天来实战HOOK一个自己的APP。

一、使用Xcode创建自己的一个用于测试的App。

目的:拦截一个自己写的方法,然后进行重写。
APP大家可以自己创建,我这边已经创建好了。

Bundle identifier:com.dasen.HOOK-APP
APP Name : HOOK_APP

拦截一个按钮的点击方法:

- (void)buttonClick {
    UIAlertController *alerView = [UIAlertController alertControllerWithTitle:@"提示"
                                                                      message:@"未被HOOK"
                                                               preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *cancelAction =[UIAlertAction actionWithTitle:@"取消"
                                                          style:UIAlertActionStyleCancel
                                                        handler:nil];
    [alerView addAction:cancelAction];
    [self presentViewController:alerView animated:YES completion:nil];
}
二、下载和配置theos

大家可自己手动下载官方theos然后放入ldid、CydiaSubstrate、dpkg-deb等等到目录中,或者使用脚本下载我这边已经放入好的theos。
脚本下载地址:https://github.com/DaSens/Theos-Script

三、创建theos项目

1,首先我们配置和准备好theos后,我们进入终端,然后cd进入你要放工程的文件夹目录比如桌面上我新建好的一个文件夹iosDev,然后执行启动 NIC(New Instance Creator),如下:。

zhangdasendeMacBook-Pro:iOS Dev zhangdasen$ cd /Users/zhangdasen/Desktop/iOSDev
zhangdasendeMacBook-Pro:iOSDev zhangdasen$ /opt/theos/bin/nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/application_modern
  [3.] iphone/cydget
  [4.] iphone/flipswitch_switch
  [5.] iphone/framework
  [6.] iphone/ios7_notification_center_widget
  [7.] iphone/library
  [8.] iphone/notification_center_widget
  [9.] iphone/preference_bundle_modern
  [10.] iphone/tool
  [11.] iphone/tweak
  [12.] iphone/xpc_service
Choose a Template (required):

我们可以看到iphone/tweak,所以我们输入 11 选择一个tweak工程,然后回车确定后,会让我们输入一些名字 id 等等信息,上一篇文章已经讲解过了。
下面我用一张GIF图来演示下:


然后我们进入工程目录会发现生成四个文件:

这四个文件的配置在上一篇文章已经简单介绍了,下面我就直接贴上文件内容。
1, Makefile

THEOS_DEVICE_IP = 10.10.243.124  
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = HOOKAPP
HOOKAPP_FILES = Tweak.xm
HOOKAPP_FRAMEWORKS = UIKit
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
    install.exec "killall -9 SpringBoard"

2, Tweak.xm

%hook ViewController

- (void)buttonClick
{
    UIAlertController *alerView = [UIAlertController alertControllerWithTitle:@"提示"
                                                                  message:@"已经被HOOK了"
                                                           preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *cancelAction =[UIAlertAction actionWithTitle:@"取消"
                                                      style:UIAlertActionStyleCancel
                                                    handler:nil];
    [alerView addAction:cancelAction];
    [self presentViewController:alerView animated:YES completion:nil];
}
%end

其它这两个文件 control 和 iosproject.plist 可以保持原样。

三、打包并安装dylib到设备中.

走到这一步需要注意几点

  • iOS设备一定要已经安装了Open ssh (默认密码alpine,如果忘记密码可自行查找如何修改密码)
  • 设备和电脑保持在同一局域网下。
  • 保证你的theos配置文件没有问题。

1,这个时候我们差不多都配置好了,可以把自己写的APP,然后运行到设备上了,运行之后点击测试下未HOOK之前的按钮点击方法:



2,接下来我们利用终端cd进入你创建的tweak项目目录,然后执行make package install,然后输入两次ssh的连接密码(ssh 默认密码alpine),然后设备就会重启SpringBoard,然后我们再次打开HOOK的APP发现按钮的点击方法已经被替换了。
如果提示_Prefix/NullabilityCompat.h 说明你是自己clone 的官方的theos,里面没放入这些头文件,可手动clone header头文件到目录中:

sudo git clone https://github.com/theos/headers /opt/theos/include

或者重新更新下我上传的theos git pull 一下,
还有环境变量记得设置下:export THEOS=/opt/theos
下面gif图演示操作下:


这个时候输入成功后这个时候SpringBoard已经开始重启了。

(由于上传图片大小限制5M,我分了两个GIF来演示,下面演示HOOK成功后)

到这一步很多人一定会好奇,怎么这么就成功了,下面说说原理。
其实原理不敢说,只能说是一些自己的理解吧。
讲到这里就不得不需要提到一些关键词。

  • Cydia Substrate、Mobile Substrate
    • MobileHooker
      • MSHookMessageEx
      • MSHookFunction
    • MobileLoader
    • Safe Mode
  • Logos

下面进行一一说明

四、基本原理说明

1,Cydia Substrate 和 Mobile Substrate

* Cydia Substrate 原名为 Mobile Substrate 已经正式更名为 Cydia Substrate。

* 它是越狱后cydia插件/软件运行的一个基础依赖包。提供软件运行的公共库,可以用来动态替换
  内存中的代码、数据等所以iOS系统越狱环境下安装绝大部分插件,必须首先安装Cydia Substrate。

* Cydia Substrate主要由3部分组成:MobileHooker,MobileLoader 和 safe mode。

2,MobileHooker、Logos

* MobileHooker用于替换覆盖系统的方法,这个过程被称为Hooking(挂钩)
* 它主要包含两个函数:
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
void MSHookFunction(void*function,void* replacement,void** p_original);
MSHookMessageEx 主要作用于Objective-C函数
MSHookFunction 主要作用于C和C++函数
Logos语法就是对此函数做了一层封装,让编写hook代码变的更直观,上面的例子用的就是logos语法。
MSHookMessageEx 和MSHookFunction 使用方法这里就不介绍了,大家可去看书籍或者查询相关资料。

3,MobileLoader

* MobileLoader用于加载第三方dylib在运行的应用程序中。
* 启动时MobileLoader会根据dylib的同名plist文件指定的作用范围,有选择的在不同进程里通过dlopen函数打开目录/Library/MobileSubstrate/DynamicLibraries/ 下的所有dylib。

4,safe mode

* 因为APP程序质量参差不齐崩溃再所难免,tweak本质是dylib,寄生在别人进程里,如果注入Springboard等。
  系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。

* 所以CydiaSubstrate引入了安全模式,在安全模
  式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。

* 本人建议自己测试的时候如果HOOK Springboard的时候一定要注意!如果出错,进入安全模式删除插件即可。

总结:
在我的理解就是:我们在Tweak.xm文件里用封装后的logos语法编写代码(底层利用了MSHookMessageEx,MSHookFunction函数,使用 Object-C 的runtime特性发送了method_setImplementation消息)然后theos自动打包成dylib,上传到/Library/MobileSubstrate/DynamicLibraries/里面后,重启Springboard, 利用MobileLoader寻找目录并根据dylib的同名plist文件加载里面的dylib动态库,这时候当我们再打开APP后执行方法时,方法就被替换了。


下面我们可以来验证一下,我用PP助手连接pad, 进入
/Library/MobileSubstrate/DynamicLibraries/目录,发现了我们编译后的dylib如图:


然后看下HOOKAPP.plist文件:



里面的com.dasen.HOOK-APP就是自己需要HOOK的app id
说明已经放入这个目录了,然后进入Cydia,查看已安装插件:

发现目标插件已经安装进了Cydia 如图:



好了验证完毕,说明确实部分是如我们所想的那样的,上面的例子很简单,重要是简单的解开了逆向的一点点面目,更多的是靠大家去发掘和利用探索更多知识。

待续。。。。。。


iOS逆向知识涉及繁多,以上自己的个人整理和心得,如有误,希望大家多多提醒。
推荐下:http://bbs.iosre.com/ 这个论坛是《iOS逆向工程 第2版》书籍作者创办的论坛。

参考书籍: <iOS应用逆向工程-第2版> 沙梓社 吴航 * 著
感谢作者

返回顶部