11、HOOK原理上

news2024/11/16 11:31:40

一、HOOK

1.1 HOOK简介

  • HOOK,中文译为“挂钩”或“钩子”.在iOS逆向中是指改变程序运行流程的一种技术.
  • 通过hook可以让别人的程序执行自己所写的代码. 在逆向中经常使用这种技术
  • 重点要了解其原理,这样能够对恶意代码进行有效的防护.

1.2 Hook的应用场景

  • 描述一个HOOK实用技术流程.正常情况下: 抢红包的流程为
    • 收到红包消息
    • 等待用户点开红包
    • 等待用户点击“抢”
    • 调用抢红包代码
  • 然而通过HOOK手段: 自己定义恶意代码--->不需要用户点击"抢"红包,自动执行代码 ---> 调用抢红包代码

二、iOS中HOOK技术的几种方式

2.1 Method Swizzle

  • 利用OC的Runtime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的.主要用于OC方法
    • 在OC中,SEL和IMP之间的关系,就好像一本书的“目录”.
    • SEL是方法编号,就像“标记”一样
    • IMP是方法实现的真实地址,就像“页码”一样.他们是一一对应的关系
  • Runtime提供了交换两个SEL和IMP对应关系的关系
/** 
 * Exchanges the implementations of two methods.
 * @param m1 Method to exchange with second method.
 * @param m2 Method to exchange with first method.
 * @note This is an atomic version of the following:
 *  \code 
 *  IMP imp1 = method_getImplementation(m1);
 *  IMP imp2 = method_getImplementation(m2);
 *  method_setImplementation(m1, imp2);
 *  method_setImplementation(m2, imp1);
 *  \endcode
 */
OBJC_EXPORT void
method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
  • 通过这个函数交换两个SEL和IMP对应关系的技术,我们称之为Method Swizzle(方法欺骗)

2.2 fishhook

  • 它是Facebook提供的一个动态修改链接MachO文件的工具.利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的.
  • fishhook 作用于main函数之前/之后都可以,作用于外部函数

2.3 Cydia Substrate

2.3.1 Cydia Substrate简介

  • Cydia Substrate 原名为Mobile Substrate,它的主要作用是针对OC方法,C函数以及函数地址进行HOOK操作.
  • 当然它并不是仅仅针对iOS而设计的,安卓一样可以用.官方地址 Cydia Substrate

2.3.2 MobileHooker

  • 顾名思义用于HOOK.它定义一系列的宏和函数,底层调用objc的Runtime和fishhook来替换系统或者目标应用的函数.
  • 其中有两个函数:
    • MSHookMessageEx: 主要作用于Objective-C方法
void MSHookMessageEx(Class class,SEL selector, IMP replacement,IMP result)
    • MSHookFunction 主要作用于C和C++函数
void MSHookFunction(void function,void*replacement,void **p_original)
    • Logos语法的%hook 就是对此函数做了一层封装

2.3.3 MobileLoader

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

2.3.4 Safe Mode

  • 破解程序本质是dylib,寄生在别人进程里.系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪.
  • 所以CydiaSubstrate引入了安全模式,在安全模式下所有基于CydiaSubstratede的三方dylib都会被禁用,便于查错和恢复.

三、fishHook简单使用

3.1 获取fishhook代码

git clone https://github.com/facebook/fishhook.git

3.2 fishhook关键函数

struct rebinding {
  const char *name;//需要Hook的函数名称,字符串
  void *replacement; // 替换到哪个新的函数上(函数指针,也就是函数名称)
  void **replaced;//保存原始函数指针变量的指针(它是一个二级指针)
};
//用来重新绑定符号表的函数,使用它来交换
// 参数一: 存放rebinding结构体的数组(可以同时交换多个函数)
// 参数二: rebindings数组的长度
FISHHOOK_VISIBILITY
int rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel);

3.3 fishhook使用:

  • fishhook源码注释

  • OC动态特性: 不是直接调用方法实现的地址
  • C静态语言: 直接通过地址访问

3.3.1 下面看一个HOOK 系统NSLog函数的案例

//------------HOOK NSLog------------
- (void)viewDidLoad {
    [super viewDidLoad];
    //创建rebinding 结构体
    struct rebinding nslog;
    nslog.name = "NSLog";
    nslog.replacement = my_NSLog;
    //保存NSLog系统函数地址的指针!
    nslog.replaced = (void *)&sys_nslog;
    //需求:HOOK NSLog
    struct rebinding bds[] = {nslog};
    rebind_symbols(bds, 1);
    NSLog(@"end");
} 
    //函数指针!
static void (*sys_nslog)(NSString *format, ...);
//新函数!
void my_NSLog(NSString *format, ...){
    format = [format stringByAppendingString:@"\n我HOOK到了!"];
    //走到系统的nslog里面去!
    sys_nslog(format);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    //编译的时候,知不知道NSLog 的真实地址!
    NSLog(@"hello");//PIC
    //bl  本地代码地址.(ASLR)
    //MachO Text(只读\可执行!)
    //Data(可读\可写)  符号!! 符号表!!
    //符号绑定!!
    
}
  • 综上: 当我们HOOK 系统函数时,需要
    • 1、构建一个rebinding结构体
      • name: 符号名称、一个C字符串,用来表明我们要Hook哪个函数
      • replacement: 新函数的地址,用来表示要用哪个函数进行替换原函数实现
      • replaced: 二级函数指针,用来保存原函数的实现地址,记录原函数的实现.
    • 2、构建一个rebinding结构体数组,将要Hook的函数构建结构体完毕后,放在此数组中即可,可以Hook多个函数
    • 3、调用rebind_symbols函数,进行符号绑定.

3.3.2 接着看一个HOOK自定义函数的案例

//----------HOOK  Func -------
void func(const char * str){
    NSLog(@"%s",str);
}
static void (*func_p)(const char * str);
void my_func(const char * str){    
    NSLog(@"HOOK了!!");
    func_p(str);
}
- (void)viewDidLoad {
    [super viewDidLoad];
       //创建rebinding 结构体
       struct rebinding func;
       func.name = "func";
       func.replacement = my_func;
       //保存NSLog系统函数地址的指针!
       func.replaced = (void *)&func_p;
       //需求:HOOK NSLog
       struct rebinding bds[] = {func};
       rebind_symbols(bds, 1);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    func("HOOK Func");
}
  • 此时虽然走了fishhook的代码、但是并没有发生Hook、两者差别在于
    • NSLog属于系统框架、func属于自定义本地函数

3.3.3 静态链接与动态链接

  • build一个工程主要包含了 预编译、编译、汇编、链接 几个过程,在实际的开发过程中,我们的程序代码不可能都放在一个文件里,因此我们需要通过符号将不同的文件链接起来,链接又分为静态链接(编译时)和动态链接(运行时)。如图所示在build一个工程后生成可执行文件,发生的链接是静态链接,而在dyld加载程序到内存中发生的链接为动态链接。

1、静态链接的特点是将一个进程中用到的库都加载进内存,而不管内存中是否加载过。

2、动态链接发生在加载可执行文件到内存时,系统先检测应用程序依赖的库中有没有已经加载的,若有则直接去内存取,不会重复加载。

3.3.4 fishhook原理-- 符号重新绑定

  • 符号就是不同文件之间相互引用的函数名和变量名,比如A、B两个文件,B中调用A中的函数func(),我们称A定义了一个函数func(),B引用了A中的函数func(),这里func就是一个符号,我们可以将符号看作链接的粘合剂,整个链接过程基于符号才能够正确的完成。而我们自定义的函数是放在我们自己的文件中的,不会生成符号,所以无法Hook成功,fishhook只能Hook能生成符号表的C函数。
  • 在程序编译完成生成可执行文件时,会先进行静态链接,此时会给系统的C函数的符号指定一个无意义的地址,等到加载完共享缓存之后,会将共享缓存库中的函数地址赋值给这个符号。此时我们对符号地址进行重新绑定,使其指向我们自己的函数,就完成了系统C函数的符号重新绑定,实现了Hook的目的。如果我们希望函数保持原有的功能,则需要定义一个二级指针,用于在加载完共享缓存后,保存原有函数的实现地址。

3.3.5 fishhook如何通过符号找到函数

  • 1、在 _DATA_ 段的懒加载表 _la_symbol_ptr 找到对应的符号,如果没有则符号未定义.
  • 2、如果有则在 Indirect Symbol Table 中找到对应符号的记录 根据记录中的Data值.
  • 3、将根据Data值在 Symbol Table 中找到对应下标的记录.
  • 4、根据记录中的 String Table Index 在 String Table中找到对应的函数名或变量名.

3.3.6 fishhook总结

  • fishhook是基于对符号的重新绑定进行Hook的,可以Hook有能生成符号的函数,对于同一个文件中的函数无法Hook,因为其不会生成符号。

四、总结

  • 符号绑定的过程
    • 外部函数调用是执行桩里面的代码! TEXT, subs
      • 通过懒加载符号表里面的地址去执行!
    • 懒加载符号表里面默认保存的是寻找binder的代码
      • binder函数在非懒加载符号表里面(程序运行就绑定好了)
    • HOOK: 改变程序原有执行流程
      • iOS中的HOOK技术
        • OC方法: MethodSwizzle
        • 系统函数: fishhook
        • MobileHooker
      • fishhook:
        • 重新绑定符号做到HOOK的目的
          • 外部符号,会在懒加载和非懒加载表中保存函数的地址
          • fishhook就是找到这两张表,并且修改里面的地址做到HOOK!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

由表及里的解读数据仓库

数据仓库作为商业智能BI系统中的一部分&#xff0c;已经成长为了企业信息化建设中必不可少的重要支撑&#xff0c;在可见的未来&#xff0c;数据仓库还会随着信息化、数字化技术、理念、应用的落地&#xff0c;继续成长。 数据仓库是一个面向主题的、集成的、随时间变化但信息…

jd侧边栏以及模态框样式设置

点击图像出现模态框&#xff0c;点击按钮叉叉模态框消失 html css样式&#xff1a; <style> * { padding: 0; margin: 0; } html, body { height: 100%; width: 100%; } li { list-style: none; } .box { position: fixed; bottom: 120px; right: -10px; width: 200px; }…

看完这篇 HTTPS,和面试官扯皮就没问题了

看完这篇 HTTPS&#xff0c;和面试官扯皮就没问题了 下面我们来一起学习一下 HTTPS &#xff0c;首先问你一个问题&#xff0c;为什么有了 HTTP 之后&#xff0c;还需要有 HTTPS &#xff1f;我突然有个想法&#xff0c;为什么我们面试的时候需要回答标准答案呢&#xff1f;为什…

零成本教你部署一个ChatGPT网站

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

BPMN绘制流程的项目推荐

项目简介 Vite Vue Bpmn流程编辑器&#xff0c;基于Bpmn.js&#xff0c; Vite&#xff0c; Vue.js 3.x, Naiveui 实现了 Bpmn.js 和 Diagram.js 的 typescript 类型声明&#xff0c;typescript 可以用来在编辑器中编写代码。 整合项目地址&#xff1a; https://github.com/m…

【JavaScript】4.JavaScript对象

JavaScript 对象 1. 对象 在 JavaScript 中&#xff0c;对象是一组无序的相关属性和方法的集合&#xff0c;所有的事物都是对象&#xff0c;例如字符串、数值、数组、函数等 对象是由属性和方法组成的。 属性&#xff1a;事物的特征&#xff0c;在对象中用属性来表示&#x…

浅谈兼容性测试

兼容性测试的概念 兼容性测试是一种软件测试&#xff0c;用于确保构建的系统/应用程序/网站与其他各种对象&#xff08;如其他网络浏览器、硬件平台、用户、操作系统等&#xff09;的兼容性。这种类型的测试有助于了解产品在特定环境中的表现。 为了方便理解&#xff0c;可以…

java String 和ArrayList转换 换化

[Ljava.lang.String; cannot be cast to java.util.List 原因&#xff1a; Map<String, Object> parameters (Map<String, Object>) jsonResult.getData(); parameters 参数中refrenceIds 是个string &#xff08;比如&#xff1a;"refrenceIds": [&…

媒体查询神器:掌握 CSS3 变革性技术

媒体查询是 CSS3 中的一项重要功能&#xff0c;它使得我们可以针对不同设备和屏幕尺寸应用不同的样式。本文将深入介绍媒体查询的使用方法&#xff0c;以及如何利用媒体查询优化响应式设计。 什么是媒体查询&#xff1f; 媒体查询是 CSS3 的一项新特性&#xff0c;允许我们根据…

聚类算法:Kmeans和Kmeans++算法精讲

前言 其实Kmesns聚类算法在YOLOv2&#xff08;【YOLO系列】YOLOv2论文超详细解读&#xff08;翻译 &#xff0b;学习笔记&#xff09;&#xff09;中我们就见到了&#xff0c;那时候只是简单地了解了一下。后来在这学期的数据挖掘课程的期末汇报中&#xff0c;我又抽中了这个算…

1 分钟给 Siri 升个级!从智Z变身 ChatSiri!

原文链接&#xff1a;https://forum.laf.run/d/79/17 众所周知&#xff0c;Siri 是一个智 Z&#xff01;那么如果能接入大火的 chatGPT&#xff0c;是不是就会从智 Z 变成人工智能&#xff1f;&#xff01; 众所周知&#xff0c;Laf 是一个集函数、数据库、存储为一体的云开发…

opencv-LSD线特征库文件

OpenCv-LSD线特征库使用 下载线特征库文件在工程源码中引入线特征头文件 下载线特征库文件 下面是阿里云盘链接 https://www.aliyundrive.com/s/rPxrmusTNPM 我们需要删掉build文件夹&#xff0c;并重新创建build文件夹。 并在build文件夹打开终端执行以下命令&#xff1a; …

Redis高可用之哨兵挂了,主从库还能切换吗

通过部署多个实例&#xff0c;就形成了一个哨兵集群&#xff0c;哨兵集群中的多个实例共同判断&#xff0c;可以降低对主库下线的误判率。 考虑一个问题&#xff1a;如果有哨兵实例在运行时发生了故障&#xff0c;主从库还能正常切换吗&#xff1f; 实际上&#xff0c;一旦多…

【Java 数据结构】二叉树的经典面试题 (图解)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

【力扣-206】反转链表

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : ----------“覆蕉寻鹿”: 有的人把假的当成真的&#xff0c;而又有人把明明是真的事情当成假的&#xff0c;前者可以说是“黄粱美梦”&#xff0c;后面这种就是“覆蕉寻鹿”。以前有个樵夫…

清理C盘的几种方法,帮你解决C盘爆红的烦恼

目录 C盘空间不足的原因&#xff1a; 清理方法 一、利用Windows自己附带的磁盘清理工具 二、存储设置清理 三、开启自动清理 四、将系统文件夹进行转移 五、清理系统缓存 六、利用清理软件进行清理 C盘空间不足的原因&#xff1a; 我们使用电脑时&#xff0c;c盘总是不知不觉…

K_A32_002 基于STM32等单片机驱动红外接收模块 串口+OLED0.96显示

K_A32_002 基于STM32等单片机驱动红外接收模块 串口OLED0.96显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明时序:对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RC红外接收模块1.2、STM32F103C8T6红外接收模块 五、基础知识学习与相关资料下载…

软件测试工程师四大项目实战,再也不怕简历没项目写了

目录 1、宠明app 测试工程师 个人职责 2、薪时贷 测试工程师 个人职责 3、花花直播 测前端开房间内软件 个人职责 4、全本小说app 测试工程师 个人职责 5、总结 1、宠明app 测试工程师 宠明APP由APP用户前端和Web后台管理端组成。前端面向用户提供多功能宠物生活管理&am…

卷积神经网络分类算法的模型训练

模型训练 卷积神经网络分类算法的模型训练模型创建与编译模型训练及保存模型保存模型生成图像预处理 卷积神经网络分类算法的模型训练 启动Web服务器、应用使用说明和测试结果示例。 模型创建与编译 原VGG-16模型要求输入2242243的图片&#xff0c;限于GPU的计算能力&#x…

在线题库整理及一些刷题注意事项

在线题库整理及一些刷题注意事项 刷题站CSDN编程语言支持 LeetCode编程语言支持数据库语言支持 牛客网编程语言支持数据库语言支持 洛谷编程语言支持 AcWing编程语言支持 蓝桥编程语言支持 做题的两种模式调用模式委托模式 注意事项小结 刷题站 老顾一个人单打独斗太久了&…