引子


由于对iOS逆向分析很感兴趣,所以也花了很长一段时间学习了iOS逆向相关知识,并积累了一些相关经验,
这几天又到看雪论坛逛了一下,看看最近有没有什么大牛分享心得成果的!还真让我看到一篇有意思的文章【原创】微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析 ,通过读完这篇文章,让我又有了站在巨人的肩膀上,也来探究和学习一下非越狱设备如何Hook App的兴趣了。

思路


越狱和非越狱Hook iOS App的关键就是让App在启动的时候加载自己的dylib。那么在非越狱上加载dylib的思路就是利用:Mach-o LC_LOAD_DYLIB , 在App在被加载的时候,把我们的动态库dylib也一起加载起来。

关于非越狱设备Hook App网上有很多资料,下面摘抄来自阿里安全工程师的博客“iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook”关于非越狱手机Hook App的思路。也可以在IOS应用逆向工程官方论坛搜索更多关于逆向的资料。

今天我就来介绍一种不需要越狱就能hook iOS app方法,也就是Mach-O LC_LOAD_DYLIB Hook。这种方法是通过修改binary本身来加载第三方dylib并实现hook,具体思路是:

提取ipa中的二进制文件 -> 修改二进制文件的Load Commands列表,加入要hook的dylib –> hook.dylib在函数constructor函数中完成对特定函数的hook->对修改后的ipa进行签名,打包和安装。


工具

MachOView
iReSign
yololib
同步助手(或者pp助手、iTools)

本文实践工程

被注入目标代码工程:AppRe
生成动态库dylib代码工程:dylib


1.目标App

也就是要被注入的App。这里我们自己写一个简单的App,代码非常简单:点击“点击我”按钮弹出一个窗口,显示一句话“Hello iOS!”以及app的bundleid。

- (void)viewDidLoad {[super viewDidLoad];//布局UIButtonself.view.backgroundColor = [UIColor whiteColor];UIButton *button  =[UIButton buttonWithType:UIButtonTypeSystem ];[button setTitle:@"点击我" forState:UIControlStateNormal];[button setFrame:CGRectMake((self.view.frame.size.width-120)/2, (self.view.frame.size.height-40)/2, 120, 40)];[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];
}- (void)buttonClick:(id)sender
{[self say:@"Hello iOS!"];
}- (void)say:(NSString *)string
{NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];UIAlertController *alert = [UIAlertController alertControllerWithTitle:string message:identifier preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];[alert addAction:okAction];[self presentViewController:alert animated:YES completion:nil];
}

2.生成动态库dylib

由上面的代码可知,在viewController类中有一个say的函数,该函数完成了弹窗的功能。
那么我们接下来要做的是,将通过hook viewController 的say方法,把“Hello iOS!”改成“Hello, Android!”

xcode本身不直接提供构建dylib的工程,但是可以通过其他方式来构建,这里也直接使用“iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook”提供的代码工程直接修改一下。我也是从文中学习到CaptainHook的使用,摘抄下来:

下一步就是要实现对特定函数的hook。在这里我推荐使用CaptainHook这个framework。作者已经帮我们实现了hook所需要的各种宏,只要按照如下步骤就可以完成针对特定函数的hook:

使用 CHDeclareClass() 声明想要hook的class

在构造函数中用 CHLoadClass() 或 CHLoadLateClass() 加载声明过的class

使用CHMethod() hook相应的method

在CHMethod()中可以使用CHSuper()来调用原函数

在构造函数中使用CHClassHook()来注册将要hook的method

CHDeclareClass(ViewController);
//参数个数、返回值类型、类名、selector名称、selector的类型、selector对应的参数的变量名
CHMethod(1, void, ViewController, say, id, arg1)
{NSString* tmp=@"Hello, Android!";CHSuper(1, ViewController, say, tmp);
}__attribute__((constructor)) static void entry()
{CHLoadLateClass(ViewController);CHClassHook(1, ViewController,say);
}

注意:

  • 生成动态库dylib使用的签名方式要和你要注入dylib的可执行文件重签名后的签名方式一致。

通过“iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook”提供的源码生成的dylib注入app之后,会导致App闪退,通过调试和各种折腾发现在生成dylib工程中配置正确的Entitlements.plist即可解决。

2.注入dylib

注入dylib这一步,如果要深入理解的话,就需要学习mach-o文件结构相关知识了。这里只需知道在mach-o文件结构的Load Commands 中的如何LC_LOAD_DYLIB指定了一个要加载的dylib,那么App在启动的时候就会自动加载该dylib。

注入dylib实际就是修改mach-o的结构体,插入一条新的load command 即LC_LOAD_DYLIB。这里也使用大神提供的工具yololib来进行修改mach-o结构体注入dylib,使用很简单。也可以使用二进制编辑器010Editor来进行修改,手动修改会比较麻烦。

./insertdylib AppRe hook1.dylib

这里,我将该工具yololib重新命名为insertdylib,方便自己快速记忆。

注入后我们使用machOView工具可以发现mach-o结构体成功被插入了一条load command(如果你熟悉命令行也可以使用otool查看)。

这张图是旧的图O(∩_∩)O哈哈~,因为machOView有时会闪退,该死的,写该文章的时候就一直闪退。图片中dev_sfa.png,实际也是hook.dylib重命名过来的,伪装成一个png图片!!

注意:

这里有个坑!在执行insertdylib的两个参数binary文件dylib文件,不要带上全路径。要把dylib文件拷贝到AppRe.app目录,然后cd 到AppRe.app目录,然后直接insertdylib binaryfile dylibfile如果带上了全路径那么路径也被插入到mach-o结构体中,导致注入失败。

3.重签名

当AppRe.app注入之后,剩下的就是打包和重签名了!对于重签名我推荐大牛的iReSign

把AppRe.app 转成ipa 很简单,新建一个Payload目录,把AppRe.app放到Payload目录里面,在执行下面命令即可

zip -qry AppRe.ipa Payload/

进行重签名.步骤如下:

  1. 拖拽进对应的AppRe.ipa文件到iReSign中.

  2. 拖拽进对应mobileprovision文件,这里我使用的是dev的开发授权文件

  3. “entitlements.plist的路径”可以不填,在iReSign源码中看出来,iReSign会自动成成一个entitlements.plist文件的。

  4. 勾选修改ID。 即修改Info.plist的bundle identifier 。因为我们一般情况下是没有原App的证书的,所以需要修改bundle identifier

  5. 选择对应的签名。这里的签名一定要和生成dylib的时选择的签名是一致的!这里我使用的是dev的签名

  6. 点击“重新签名!”,会在ipa所在目录重新生成一个AppRe.-resignipa的包。

4.安装

使用同步助手或者pp助手都可以,拖拽安装到手机并运行!

iOS 逆向-非越狱手机Hook App相关推荐

  1. iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook(转载)

    作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & iOS)方向博士,曾在腾讯.百度以及硅谷的FireEye实习.在博士期间发表了多篇移动 ...

  2. iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook

    作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & iOS)方向博士,曾在腾讯.百度以及硅谷的FireEye实习.在博士期间发表了多篇移动 ...

  3. 在非越狱手机上进行App Hook

    作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & iOS)方向博士,曾在腾讯.百度以及硅谷的FireEye实习.在博士期间发表了多篇移动 ...

  4. 动态库注入app以及在非越狱手机使用

    动态库注入app以及在非越狱手机使用 1. 动态库编写 动态库编写有多种方式,可以使用Xcode创建动态库,也可以通过tweak生成动态库 对于越狱手机,可以直接编写tweak,将tweak打包成动态 ...

  5. iOS逆向-ipa包重签名及非越狱手机安装多个微信

    前一段时间学了点儿逆向相关的一些东西,但是都是基于越狱手机上的操作,给视频类应用去广告之类的.随着苹果生态圈的逐渐完善.及苹果对自身系统的保护越来越严格,导致现在的iPhone手机并不像以前那样存在大 ...

  6. iOS逆向(10)-越狱!越狱!远程连接登录手机

    之前的九篇文章讲述的是在不越狱的情况下,详细的讲解了对APP重签名的原理,如何动态库注入,以及之后的各种调试技巧.这些功能其实已经很强大了,能够帮助咱们在绝大多数情况下去分析并且更改对方的APP了.这 ...

  7. 海马苹果助手ipad版_iOS逆向-ipa包重签名及非越狱手机安装多个微信!

    前一段时间学了点儿逆向相关的一些东西,但是都是基于越狱手机上的操作,给视频类应用去广告之类的.随着苹果生态圈的逐渐完善.及苹果对自身系统的保护越来越严格,导致现在的iPhone手机并不像以前那样存在大 ...

  8. iOS逆向工程——非越狱调试

    其实iOS的逆向分析业界已经十分成熟了,网上也有许多有趣的尝试(一步一步实现iOS微信自动抢红包(非越狱).本文着重于如何在非越狱机器上进行调试,出于学习及总结的目的,记录于此. 本文以破解游戏梦幻西 ...

  9. iOS逆向 非群主@所有人

    iOS 逆向开发交流群 微信中只有群主才有@所有人的权限,下面用iOS逆向实现一下非群主@所有人的功能. 1.Makefile文件代码如下: THEOS_DEVICE_IP = 192.123.10. ...

最新文章

  1. STM32F103C8T6学习笔记_时钟
  2. 掌握 Angular2 的服务 (service)
  3. 【经典回放】多种语言系列数据结构线性表之一:顺序表
  4. python无所不能_python-列表
  5. yum 安装包的用法
  6. matlab imformats,그래픽스 파일에 이미지 쓰기
  7. freeswitch三方通话配置
  8. junit mockito_Mockito存根异常– JUnit,TestNG
  9. 双击事件 转载 http://blog.sina.com.cn/s/blog_739365a30100vk8p.html
  10. 类图中表达总体与局部的关系_软件工程测试题3
  11. log4j配置文件以及控制日志级别
  12. 计算机桌面个性化怎样设置方法,桌面文件夹图标个性化【设置方法】
  13. 日本日野汽车因尾气数据造假问题受到调查
  14. BDBR和BD-PSNR
  15. Python音频处理——pydub
  16. Baumer工业相机堡盟相机如何使用自动曝光功能(自动曝光优点和行业应用)(C++)
  17. VG、PV、PP、LV、LP
  18. 【学习笔记】斯特林反演+单位根反演
  19. LogicFlow自定义业务节点
  20. 基于jsp酒店管理系统设计

热门文章

  1. BigDecimal类型计算和比较大小
  2. 我擅长英语和计算机用英语怎么说,我很擅长英语,用英语怎么说,(擅长于) 用英语有几种表达,列举出来...
  3. gentoo on macbook pro driver for the Broadcom Facetime HD webcam
  4. 婴幼儿常见八大疾病及护理方法
  5. 青村茶舍||“麦穗飘香”文旅推介直播活动
  6. Mathtype如何打出偏导、一撇
  7. 四阶代数余子式怎么求_已知四阶行列式,试求A41+A42与A43+A44,其中A4j(j=1,2,3,4)是D4中第4行第j个元素的代数余子式. - 搜题宝...
  8. c4d python_【C4D开发】C4D中的python生成器
  9. 搭建微信小程序基本的https与wss环境
  10. java项目-第135期ssm台球厅收费系统-java毕业设计_计算机毕设