• iOS逆向之Method Swizzle
  • iOS逆向之fishHook原理探究
  • iOS逆向之fishHook怎么通过符号找字符串
    学习完上面的文章后,深感fishhook之强大,既然fishhook能hook系统的函数。那么猜想:

    如果在我们的项目中hook了Method Swizzle,那么别人还能hook我们的项目吗??

一、写上基本的防护,内部使用hook,外部没有hook

1、新建工程:基本防护,写个简单的页面

![image.png](https://upload-images.jianshu.io/upload_images/1013424-6234f137c362e7dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 代码如下: ![image.png](https://upload-images.jianshu.io/upload_images/1013424-7b711b4665a4aac6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2、需求:在外部hook btnClick2,在内部hook btnClick1,需要保证的是在外部hook btnClick2无效,在内部hook btnClick1生效。

3、拖入fishhook代码,新建hookMgr类

//专门HOOK
+(void)load{//内部用到的交换代码Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick1:));Method new = class_getInstanceMethod(self, @selector(click1Hook:));method_exchangeImplementations(old, new);//在交换代码之前,把所有的runtime代码写完 //基本防护struct rebinding bd;bd.name = "method_exchangeImplementations";bd.replacement=myExchang;bd.replaced=(void *)&exchangeP;struct rebinding rebindings[]={bd};rebind_symbols(rebindings, 1);
}//保留原来的交换函数
void (* exchangeP)(Method _Nonnull m1, Method _Nonnull m2);//新的函数
void myExchang(Method _Nonnull m1, Method _Nonnull m2){NSLog(@"检测到了hook");
}
-(void)click1Hook:(id)sender{NSLog(@"原来APP的hook保留");
}

说明: * 在做防护之前,先把自己内部需要runtime交换的代码写完,比如开放btnClick1给自己内部去hook,其他的hook则禁止 * 使用fishhook hook method_exchangeImplementations方法,这样当外部使用method_exchangeImplementations方法时,让它失效

4、运行,分别点击按钮1和按钮2,此时内部hook了btnClick1方法,外部暂时没有hook任何方法

![image.png](https://upload-images.jianshu.io/upload_images/1013424-12884fb3e0172d6a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

二、准备ipa

1. 打包ipa

  • 将基本防护.app拷贝出来
  • 新建文件夹Payload,将基本防护.app拷贝到Payload文件夹中
  • cd到Payload的上级目录,使用命令压缩,生成ipa
    zip -ry Hook.ipa Payload

三、外部hook,注入代码

1.新建工程:Hook基本防护

代码注入参考:iOS逆向之代码注入(framework)

前面在hookMgr中已经做了防护,不能交换btnClick2方法,那么我们写下hook btnClick2的代码来测试一下:

+(void)load
{Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick2:));Method new = class_getInstanceMethod(self, @selector(click2Hook:));method_exchangeImplementations(old, new);
}-(void)click2Hook:(id)sender{NSLog(@"btnClick2交换成功");
}

运行,分别点击按钮1,按钮2,发现btnClick2交换成功,防护失败了

2.思考防护失败的原因

  • 1.在基本防护工程里,hookMgr的load方法里加上NSLog(@"hookMgr--Load");
  • 2.在ViewController的load方法里加上NSLog(@"ViewController--Load");
  • 3.在AppDelegate的load方法里加上
+(void)load{NSLog(@"AppDelegate--Load");
}
  • 4.编译基本防护工程重新运行,生成基本防护.app,重新打包
    zip -ry Hook.ipa Payload
  • 5.将Hook.ipa拷贝到Hook基本防护工程的APP文件夹里,打开Hook基本防护工程,在WJHook的load方法里加上,NSLog(@"WJHook---load"); 然后运行

    发现WJHook(攻击方)是最早调用的,hookMgr(防护方)是最晚调用的,那么攻击方方法都交换成功了,你防护方才来防护,明显是没用。因此,上面的btnClick2方法仍然被外部交换了,hookMgr没起到防护的作用。

3.解决办法

1.修改Complie Sources的顺序

  • 修改前

  • 修改后

2.既然外部的动态库最先加载,那么防护方自己建立一个动态库

  • 在基本防护工程里新建动态库antiHook
  • 编译运行
  • 生成基本防护.app,重新打包zip -ry Hook.ipa Payload
  • 将Hook.ipa拷贝到Hook基本防护工程的APP文件夹里

3.打开Hook基本防护工程,运行


* 发现我们的防护hookMgr先执行,并且 检测到了hook
* 至此外部就不能通过hook “Method Swizzle”来交换btnClick2方法

4、弊端

  • 如果hookMgr内部要交换方法,需要提前在hookMgr的内部写好交换代码,然后再做防护。
  • 因为在内部是没有办法再进行hook了,所以有些三方库如果用了Method Swizzle,那么你要做的修改就比较多,需要将工程里用到的全部method_exchangeImplementations换成exchangeP

  • 如果用Cydia Substrate或者MonkeyDev来hook,依然能hook成功

5、下面用MonkeyDev来举例:

1、新建MonkeyDev工程MonkeyDemo,此过程需要先安装好MonkeyDev

2、将防护的Hook.ipa拷贝到MonkeyDemo->TargetApp文件夹下


* %hook ViewController 表示hook ViewController这个类
* -(void)btnClick2:(id) org 表示hook btnClick2这个方法

  • hookMgr是最先加载的,但是MonkeyDev还是能hook成功

6、为什么MonkeyDev和Cydia Substrate能hook成功?

1.首先了解Cydia Substrate的组成部分(MonkeyDev也是集成了Cydia Substrate):

Cydia Substrate主要由3部分组成:
* 1.MobileHooker
   MobileHooker顾名思义用于HOOK。它定义一系列的宏和函数,底层调用objc的runtime和fishhook来替换系统或者目标应用的函数.
其中有两个函数:
* MSHookMessageEx 主要作用于Objective-C方法
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP result)
* MSHookFunction 主要作用于C和C++函数
void MSHookFunction(voidfunction,void* replacement,void** p_original)

  • 2.MobileLoader
       MobileLoader用于加载第三方dylib在运行的应用程序中。启动时MobileLoader会根据规则把指定目录的第三方的动态库加载进去,第三方的动态库也就是我们写的破解程序.

  • 3.safe mode
       因为APP程序质量参差不齐崩溃再所难免,破解程序本质是dylib,寄生在别人进程里。 系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。所以CydiaSubstrate引入了安全模式,在安全模 式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。

2. MSHookMessageEx底层调用objc的runtime和fishhook来替换系统或者目标应用的函数

在我们的防护代码中,只防护了method_exchangeImplementations方法,然而method_setImplementation和method_getImplementation并没有做防护,因此猜想Cydia Substrate就是通过这两个方法来hook的。

3.实验

  • 在基本防护2的工程中,增加对method_setImplementation和method_getImplementation的防护

  • 编译生成基本防护.app,再次打包成Hook.ipa

  • 将Hook.ipa拷贝到MonkeyDemo->TargetApp文件夹下
  • 运行MonkeyDemo工程


如图,做到了防护MonkeyDev的hook,在检测到hook,强制退出APP

  • 那么,上面的防护真的就无法破解了吗?
    答案当然是否定的,提供一个思路:
    通过修改MachO文件,在防护动态库之前调用hook的动态库,就能实现hook,因为你是在我hook成功之后才做的防护。
  • 不过新手一般就破解不了上面的防护了。进攻和防护还需要不断学习!
代码已上传:https://github.com/WinJayQ/HookDefend

iOS逆向之反HOOK的基本防护相关推荐

  1. IOS逆向笔记之HOOK实现(非越狱)

    HOOK是越狱的最终目标,目的是给应用添加功能如插件或者是更改应用的某个功能来满足我们的需求,如微信中添加抢红包插件.本文将以最近比较火的"快看"漫画为例子去除付费漫画中的收费弹窗 ...

  2. 2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像

    2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程--使用theos tweak 注入hook修改游戏执行代码上传动态头像 开篇 需求&最终效果 环境要求与即将使用的 ...

  3. android r 编译找不到头文件_「投稿」iOS逆向——砸壳与反编译

    作者:疯狂的蛋神 近来对iOS逆向十分感兴趣,就在业余时间里自己在上网找了各种资料学习,发现许多资料对于一些细节描述的不够详细,所以也踩了很多坑,我也将自己踩的一些坑总结出来,希望对大家有所帮助. 注 ...

  4. 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 写在前面 逆向目标 绕过无限 debugger Hook 参数 逆向参数 PyCharm 本地联调 完整代码 J ...

  5. iOS 逆向-非越狱手机Hook App

    引子 由于对iOS逆向分析很感兴趣,所以也花了很长一段时间学习了iOS逆向相关知识,并积累了一些相关经验, 这几天又到看雪论坛逛了一下,看看最近有没有什么大牛分享心得成果的!还真让我看到一篇有意思的文 ...

  6. IOS安全、逆向、反编译1-越狱知识讲解

    之前开发了一个对安全性要求比较高的APP,所以对安全.逆向和反编译有了一些认识,最近有时间就想系统的把这些知识做一个整理.今天就开始把我的学习过程记录下来. iOS越狱环境搭建 在学习iOS越狱之前, ...

  7. 逆向工具/反编译工具 集合

    目录 Java & Jar (Android) C++ & So (Android) C# & Dll & EXE iOS Others 实用参考 逆向工具集合 Awe ...

  8. iOS 逆向 - 收藏集 - 掘金

    分分钟让你在 微信运动 霸占榜首 - iOS - 掘金 为了纪念我失去的已越狱iPad, 不得不写点什么. 所以...以下内容 不需要越狱. 微信运动 6万步是什么概念,我不知道,因为我没走过,不过有 ...

  9. IOS 逆向开发(一)密码学 非对称加密RSA

    IOS 逆向开发(一)密码学 RSA 1. 密码学发展简介 2. 非对称加密RSA产生过程 3. RSA 数学原理 3.1 离散对数问题 3.1.1 原根 3.2 欧拉函数Φ 3.3 欧拉定理 3.4 ...

最新文章

  1. chmod +x的意思就是给执行权限
  2. 每日程序C语言25-查找100以内的素数
  3. 使用OpenSSL进行RSA加密和解密(非对称)
  4. 大数据组件的各种协议与作用(持续更新中)
  5. hdu 1054 Strategic Game 最小点覆盖 = 最大二分匹配
  6. GLIBC中NPTL线程实现代码阅读
  7. 多个Email的JS检测正刚表达式.
  8. 实际运用中DataSet、DataTable、DataRow点滴
  9. HTML5能取代Android和iOS应用程序吗?
  10. 【免公众号】新版盲盒交友程序源码盲盒交友系统一元交友
  11. Electron 使用Widevine CDM插件
  12. 空手套白狼,硬阅java字节码class文件
  13. 字符串大小写字母转换c 语言,C语言中对字母进行大小写转换的简单方法
  14. 【相约上海,期待广州】甲骨文数据库大会暨38周年庆典
  15. 点击预览与按钮预览图片
  16. CNC操机的几个步骤
  17. Qt知识点梳理 —— 国际化 QtLinguist 应用(1)
  18. jqWEUI对图片压缩并上传
  19. 【打卡】求直角坐标系内两点间距离
  20. 没有学好 飞鸽传书2007

热门文章

  1. C++ 实现俄罗斯方块(附详细解析)
  2. Idea搜索的时候匹配不到,半角空格和全角空格的问题
  3. 用两片74HC138组合成4/16译码器
  4. pb 修改数据窗口种指定字段位置_PB数据窗口对象之字段的修改属性
  5. R语言 ggplot2 多图排列 Part(1)
  6. 数据预处理系列:(二)创建试验样本数据
  7. iOS 【消息处理 performSelector】
  8. 管理信息系统期末复习资料
  9. dcdc模块降额设计_DCDC模块的选择
  10. 精巧结构设计PDF版