iOS:在非越狱手机上进行Hook注入

iOS:在非越狱手机上进行Hook注入,第1张

1.准备好一个自己写的app,用adhoc的证书打包

2.打包以后可以装在测试手机上

3.对这个ipa进行解压缩,得到一个app文件(先将.ipa重命名为zip,然后在解压得到.app文件)

4.显示包内容,查看原始包的内容

5.可以用命令行查看(注意当前路径). $otool -L YoungTest

6.安装iOSOpenDev

7.编写Hook,只在Hook1文件里写,其他文件均未改动

OSOpenDevDevice设置你设备的IP(例如:192.168.1.10).

iOSOpenDevInstallOnProfiling布尔值 默认为YES, 是否在build forprofiling的时候直接远程安装到设备上.

iOSOpenDevPath不要修改此项,是iOSOpenDev的安装路径.

iOSOpenDevRespringOnInstall布尔值 默认为YES,是否在安装后重启SpringBoard.

iOSOpenDev默认安装在/opt/iOSOpenDev里,在里面可以找到undocumentapi的头文件

8.把Hook1跟yololib都放到包里面(这个叫yololib的工具可以帮我们直接进行dylib的注入)

9.用yololib把hook注入到app里面

$./yololib YoungTest Hook1.dylib

10.检查一下,发现注入成功

11.注入成功以后把yololib删除,把_CodeSignature删除,把embedded.mobileprovision替换成自己的配置文件。(要在开发者账号里生成一套APP证书)

12.生成原app的配置信息(注意当前路径)

$ codesign -d --entitlements :- /Users/iOS/Desktop/ADHoc/Payload/YoungTest.app >sss.plist

13.对Hook1, YoungTest ,embedded.mobileprovision文件进行签名

youngstardeMacBook-Pro:Payload iOS$ codesign -f -s "iPhone Distribution: MingXing Yang (AX6366456P)" YoungTest.app/Hook1.dylib

youngstardeMacBook-Pro:Payload iOS$ codesign -f -s "iPhone Distribution: MingXing Yang (AX6366456P)" YoungTest.app/Sengled.mobileprovision

youngstardeMacBook-Pro:Payload iOS$ codesign -f -s "iPhone Distribution: MingXing Yang (AX6366456P)" YoungTest.app/YoungTest

如图所示

14.对整个app文件签名,根据刚生成的配置文件

codesign -f -s "iPhone Distribution: MingXing Yang (AX6366456P)" --entitlements sss.plist YoungTest.app/

15.HOOK注入已经完成,会退到上个文件,找到app,

16、通过iTunes生成ipa,在用iTool安装到手机上即可

我中间也走了很多弯路,主要是证书的混淆,最好在钥匙串里其他没用的证书都删除了,留下自己要打包的这个证书。已经尽可能的详细说明,有问题可以留言!

工具名称用途区别备注

theos、iosOpenDev生成dylib

insert_dylib、optool、yololib向二进制文件插入dylib

install_name_tool

修改dylib引用路径

iResign、sigh resign、codesign等重签名工具修改后的二进制文件是需要重签名的

二、过程

1、生成dylib

dylib的生成 可采用theos,也可采用iosOpenDev。

theos是越狱专门开发用的工具,生成的dylib可直接作用于越狱机器上。

但theos并不是apple源生支持的工具,它在Mac端编译生成deb包,安装进IOS系统,由IOS系统dpkg安装成插件模式 并随之生成dylib。theos在Mac端需要调用IOS开发SDK,目前无法调用9.3以上的SDK,theos工具没有更新。

iosOpenDev则是apple官方支持的插件生成工具,可直接由Xcode生成。

这种dylib由两种 CaptainHookTweak、Logos Tweak.

不过这两种没什么区别:Logos Tweak的语法较为简单 同theos的一致,CaptainHookTweak较为复杂。

2、插入dylib

这三种工具 均可向二进制文件插入dylib 不过各有千秋

yololib仅能对64位的二进制文件 插入 32位插入也能成功 但是 出现如下

insert_dylib既可以对64位 也可以对32位进行插入 同时 还会供选择 是否删除掉二进制文件原有的签名 即 LC_CODE_SIGNATURE

optool 则功能更强大 可供选择 是插入哪种LC LIB。本例暂用不上。

3、修改dylib引用

插入dylib后 需要对它添加cydiaSubstrate dylib的引用。即使用install_name_tool这个工具

之前就是这个地方没有做 导致签名后的文件 一直安装出现闪退 dylib也没有调用

由于目前手头没有越狱手机 之前没有调出过cydiaSubstrate dylib 所以这个步骤暂时中断(最主要 每个越狱版本系统的cydiaSubstrate dylib都是不一样的 目前没有可越狱的系统 也就没有对应的dylib)

不过 可细想 因为越狱手机上 是自己存在这个cydiaSubstrate dylib的 所以 theos插件本身不必再导入这个dylib,直接对其添加引用即可。

然而 在非越狱手机上 就需要自己把这个cydiaSubstrate dylib放进app包里 并手头添加它的引用路径了

既然这样 那apple 源生的iosOpenDev为什么还要出开发dylib的工具呢

那是因为apple 推出iosOpenDev生成dylib 根本不是让你这样玩的  apple是让你把这个dylib添加进IOS工程里 在工程里对其添加引用 如果以后该app有少量的更新 只需要更新这个dylib即可 而不必更新整个app。这个在IOS开发中 叫做 增量更新。

在完全不使用cydia提供的hook接口的基础上 也可以使用openDev使用的hook接口

*** 作如下:

a:将 dylib(如需要调用cydia substrate 的 MSHOOK函数 则 还需要添加cydia substrate dylib)到app包里;

b:insert工具插入。注意这里有一个坑 就是凡是复制到dylib里的包 除了使用install_name_tool对其添加引用外 插入到Mach-O LOAD COMMANDS里的dylib还需要添加可执行路径

首先需要cd进app包里

然后/Users/danchen/desktop/diff_hook/insert_dylib@executable_path/ios_hook.dylibhook_demo hook_demo

c:之后重签名

对app包里每一个修改的添加的文件进行签名

codesign -f -s "iPhone Developer: 694708086@qq.com (T4MM3JZDL2)" hook_demo

codesign -f -s "iPhone Developer: 694708086@qq.com (T4MM3JZDL2)" ios_hook.dylib

再对整个app包添加签名权限

codesign -f -s "iPhone Developer: 694708086@qq.com (T4MM3JZDL2)" --entitlements entitlements.plist hook_demo.app

直接安装app包即可,也可以使用xcrun将其打包成ipa 安装即可

dylib里的内容

4、重签名

完成这些步骤后

首先 要对 修改过的二进制文件、dylib、cydiaSubstrate dylib进行重签名 即把iPhone Developer: 694708086@qq.com (T4MM3JZDL2) 写入进去

然后 使用xcrun将app文件 打包成ipa 使用iResign、sigh resign等工具 对ipa包重签名 再安装进系统

重签名权限文件entitlements.plist

可使用ldid -e 二进制文件查看entitlements文件内容生成

三、区别

theos与iosOpenDev

区别theosiosOpenDev备注

来源越狱开发作者appletheos来自第三方开发,iosOpenDev则是apple官方Xcode支持的

UI无Xcodetheos没有开发UI界面,iosOpenDev的开发界面是Xcode

版本支持目前theos仅支持SDK IOS9.3以下都支持两者调用SDK,theos仅支持SDK9.3以下,目前theos作者尚未更新工具

hook 语言方式Logos TweakLogos Tweak、CaptainHookTweak

insert_dylib、optool、yololib工具差别

区别insert_dyliboptoolyololib备注

支持结构64、32位都支持64、32位都支持仅支持64位

四、总结

这种方式仅能hook app自身进程里所调用的函数 无法hook系统级别的进程

由于非越狱上的沙盒机制,本地app仅能访问本app数据,无法访问别的app的数据,访问系统数据(相册、地理位置等)也需要向用户请求权限。更别说去hook系统级别的进程。

当然 存在非越狱下 绕过沙盒机制的技术: http://chuansong.me/n/2248208

比如这个人 非越狱下一个app卸载另一个app、一个app获取领一个app里的文件内容。但这种漏洞技术没有公开 仅存在于越狱团队内部。而且这种漏洞技术也没能hook系统级进程。

理论上来讲 非越狱下hook系统级别的进程 是有可能的 只不过难度相当大(换言之 如果真有这种非越狱下就能hook系统级别的漏洞和技术的话 越狱团队干嘛还费那大力气去越狱呢)

 我们都知道在windows下可以通过API轻松的hook很多消息,IOS里面貌似还没有现成的API(可能是我还没发现吧),前段时间碰巧看到Objective-C运行时的一些东西,于是心想着是不是可以尝试一下实现hook的功能。

下面先直接上源码:1//2//TestHookObject.m3//TestHookMessage4//5//Created by mapleCao on 13-2-28.6//Copyright (c) 2013年 mapleCao. All rights reserved.7//89#import"TestHookObject.h"10#import<objc/objc.h11#import<objc/runtime.h1213@implementation

TestHookObject1415//this method will just excute once16+ (void)initialize17{18//获取到UIWindow中sendEvent对应的method19Method sendEvent = class_getInstanceMethod([UIWindowclass

], @selector(sendEvent:))20Method sendEventMySelf = class_getInstanceMethod([selfclass

], @selector(sendEventHooked:))2122//将目标函数的原实现绑定到sendEventOriginalImplemention方法上23IMP sendEventImp =

method_getImplementation(sendEvent)24class_addMethod([UIWindowclass

], @selector(sendEventOriginal:), sendEventImp, method_getTypeEncoding(sendEvent))2526//然后用我们自己的函数的实现,替换目标函数对应的实现27IMP sendEventMySelfImp =

method_getImplementation(sendEventMySelf)28class_replaceMethod([UIWindowclass

], @selector(sendEvent:), sendEventMySelfImp, method_getTypeEncoding(sendEvent))29}3031/*32* 截获到window的sendEvent33* 我们可以先处理完以后,再继续调用正常处理流程34*/35- (void)sendEventHooked:(UIEvent *)event36{37//do something what ever you want38NSLog(@"haha, this is my self sendEventMethod!!!!!!!")3940//invoke original implemention41[self performSelector:@selector(sendEventOriginal:) withObject:event]42}4344@end下面我们来逐行分析一下上面的代码:

首先我们来看19行,这一行主要目的是获取到UIWindow原生的sendEvent的

Method(一个结构体,用来对方法进行描述)

,接着第20行是获取到我们自己定义的类中的sendEvent的Method

(这两个方法的签名必须一样,否则运行时报错)

。第23行我们通过UIWindow原生的sendEvent的Method获取到对应的

IMP(一个函数指针)

,第24行使用运行时API Class_addMethod给UIWindow类添加了一个叫sendEventOriginal的方法,该方法使用UIWindow原生的sendEvent的实现,并且有着相同的方法签名

(必须相同,否则运行时报错)。

27行是获取我们自定义类中的sendEventMySelf的IMP,28行是关键的一行,这一行的主要目的是为UIWindow原生的sendEvent指定一个新的实现,我们看到我们将该实现指定到了我们自己定义的sendEventMySelf上。到了这儿我们就完成了偷梁换柱,大功告成。

执行上面这些行以后,我们就成功的将UIWindow的sendEvent重定向到了我们自己的写的sendEventMySelf的实现,然后将其原本的实现重定向到了我们给它新添加的方法sendEventOriginal中。而sendEventMySelf中,我们首先可以对这个消息进行我们想要的处理,然后再通过41行调用sendEventOriginal方法转到正常的执行流程。

为什么执行起来不报错,而且还会正常执行?因为sendEventMySelf是UIWindow的sendEvent重定向过来的,所以在运行时该方法中的self代表的就是UIWindow的实例,而不再是TestHookObject的实例了。加上sendEventOriginal是我们通过运行时添加到UIWindow的实例方法,所以可以正常调用。当然如果直接通过下面这种方式调用也是可以的,只不过编译器会提示警告

(编译器没那么智能)

,因此我们采用了performSelector的调用方式。

[self sendEventOriginal:event]以上就是Hook的实现,使用时我们只需要让TestHookObject类执行一次初始话 *** 作就可以了,执行完以后。UIWindow的sendEvent消息就会会hook到我们的sendEventMySelf中了。

下面是调用代码:

Install Hook

代码中我们还专门添加了一个button来验证,hook完以后消息是否正常传递。经验证消息流转完全正常。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11822063.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存