HOOK原理

Hook就是改变程序执行流程

1.常见几种Hook方式

 1.Method Swizzle

利用OC的Runtime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的。主要用于OC方法

2.fishhook

Facebook提供的一个动态修改链接mach-O文件的工具。利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。(自定义不行).  C静态是怎么修改的?请看下面问题

3.Cydia Substrate

Cydia Substrate 原名为 Mobile Substrate ,它的主要作用是针对OC方法、C函数以及函数地址进行HOOK操作。Android,iOS都能用。官方地址:http://www.cydiasubstrate.com/

Cydia Substrate主要由3部分组成:

  • MobileHooker

    MobileHooker顾名思义用于HOOK。它定义一系列的宏和函数,底层调用objc的runtimefishhook来替换系统或者目标应用的函数.
    其中有两个函数:

    • MSHookMessageEx 主要作用于Objective-C方法

    • MSHookFunction 主要作用于C和C++函数

    Logos语法的%hook 就是对此函数做了一层封装

  • MobileLoader

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

  • safe mode

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


2.fishHook原理

fishhook简单例子:

但是这个只能是系统自己的函数可以,不能hook自定义的函数(因为符号表中没有自定义的函数)

1.MachO是通过DYLD动态加载进的 (可以lldb: image list 看下 先加载MachO在加载一些它需要的库)

2.MachO文件每次加载时随机地址(ARLR :http://shengshui.com/?p=3268

3.NSLog并没有在你程序的Macho中,而是在系统的动态库中,当Macho加载进内存,它和NSLog动态库是地址相对改变的

4.PIC位置代码独立

  • 如果程序调用系统库函数时,首先在MachO中_DATA段中建立一个指针(符号)(也就是0x00000),指向外部函数 (通过DYLD动态加载)
  • DYLD会动态绑定,将MachO中的_DATA段的指针指向外部函数

  1. 在MachO中找到Lazy Sysbol Pointers符号表
  2. 再找Dynamic Symbol Table/Indirect Symbols (它和Lazy Sysbol Pointers符号表一一对应)找到Data拿到它的Index去Symbol Table/Symbols表然后拿到data
  3. 拿到data去String Table找(开始地址+编译地址)

也就是它符号表指向外部函数指针改变为指向内容函数指针


问题:

1.C是静态语言但是finshhook是怎么替换的函数?

在MachO加载内存之前它根本不知道系统函数地址,自己编写的程序在build一样确定了,但是外部并不能确定

通过PIC位置代码独。它是通过符号表来查找,通过dyld动态绑定,finshhook就是重新绑定符号表(查看下面验证)

它是怎么通过字符串找到系统函数地址的?

系统共享缓存库中函数固定地址? 不对,它每次加载其实也是改变的

查看上面图通过MachO的Lazy Sysbol Pointers符号表找到 Dynamic Symbol Table/Indirect Symbols (它们一一对应)

  1. 在MachO中找到Lazy Sysbol Pointers符号表
  2. 再找Dynamic Symbol Table/Indirect Symbols (它和Lazy Sysbol Pointers符号表一一对应)找到Data拿到它的Index去Symbol Table/Symbols表然后拿到data
  3. 拿到data去String Table找(开始地址+编译地址)
  • 如果程序调用系统库函数时,首先在MachO中_DATA段中建立一个指针(也就是0x00000),指向外部函数 (通过DYLD动态加载)
  • DYLD会动态绑定,将MachO中的_DATA段的指针指向外部函数

验证:

用上面例子先断点rebind_symbols处查看MachO文件

通过地址拿到反汇编代码

关于签名,是对每一个dylib单独签名加载进MachO,单个验证


怎么反Hook

防护App

发表回复

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud