iOS逆向工程(手动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),如下:

屏幕快照 2017-11-01 10.32.47.png
屏幕快照 2017-11-01 10.33.43.png

然后你再测试下
我选择了这个:在终端提前执行export THEOS=/opt/theos
然后顺利通过
我们可以看到iphone/tweak
,所以我们输入 11 选择一个tweak工程,然后回车确定后,会让我们输入一些名字 id 等等信息,上一篇文章已经讲解过了。下面我用一张GIF图来演示下:
注意:在写Packag Name:时,后面不要有大写字母或特殊字符,最好都用小写字母


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

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

1, Makefile(这里的IP是手机设备的IP,不加IP可安装在任意设备上,加上IP是可以快速自己安装)

THEOS_DEVICE_IP = 10.10.243.124  
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0

include $(THEOS)/makefiles/common.mkTWEAK_NAME = HOOKAPP
HOOKAPP_FILES = Tweak.xmHOOKAPP_FRAMEWORKS = UIKit
 include $(THEOS_MAKE_PATH)/tweak.mkafter-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已经开始重启了。
这这个过程中可能会出现一个 DVTPlugInCompatibilityUUIDs 问题,说DVTPlugInCompatibilityUUIDs里不包含一个值,
解决办法:
拷贝路径,让后将值添加到DVTPlugInCompatibilityUUIDs中,即可

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



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

MSHookMessageEx

MSHookFunction

MobileHooker

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(voidfunction,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 如图:


好了验证完毕,说明确实部分是如我们所想的那样的,上面的例子很简单,重要是简单的解开了逆向的一点点面目,更多的是靠大家去发掘和利用探索更多知识。
感谢原文章:http://www.jianshu.com/p/8982e9670fc6

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容