iOS逆向与安全4.1:深入浅出谈Hook

HOOK

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

以现在很多应用都有的转账功能做示例;


image.png

iOS中HOOK技术的几种方式

  • 1、Method Swizzle
    利用OC的Runtime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的。主要用于OC方法。
  • 2、fishhook
    Facebook提供的一个动态修改链接mach-O文件的工具。利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。
  • 3、CydiaSubstrate
    CydiaSubstrate 原名为 Mobile Substrate ,它的主要作用是针对OC方法、C函数以及函数地址进行HOOK操作。当然它并不是仅仅针对iOS而设计的,安卓也可以用。目前iOS越狱开发主要依赖于CydiaSubstrate
    官方地址:http://www.cydiasubstrate.com/

Method Swizzle

  • 在OC中,SEL 和 IMP之间的关系,就好像一本书的“目录”。
  • SEL 是方法编号,就像“标题”一样。
  • IMP是方法实现的真实地址,就像“页码”一样。
  • 他们是一一对应的关系
image.png
  • Runtime提供了交换两个SEL和IMP对应关系的函数.


    image.png

    通过这个函数交换两个SEL和IMP对应关系的技术,我们称之为Method Swizzle(方法欺骗),另外还有class_replaceMethod以及method_setImplementation,在本系列另外一篇文章又详细介绍,相对于method_exchangeImplementations,class_replaceMethod以及method_setImplementation更为简便易用,我们了解了其原理,当灵活应用。


    image.png

Cydia Substrate

1、MobileHooker

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

  • MSHookMessageEx
    MSHookMessageEx 主要作用于Objective-C方法
    voidMSHookMessageEx(Class class, SEL selector, IMPreplacement, IMP result)
  • MSHookFunction
    主要作用于C和C++函数,voidMSHookFunction(voidfunction,voidreplacement,void* p_original), Logos语法的%hook就是对此函数做了一层封装

2、MobileLoader

  • MobileLoader用于加载第三方dylib在运行的应用程序中。启动时MobileLoader会根据规则把指定目录的第三方的动态库加载进去,第三方的动态库也就是我们写的破解程序.
    3、safe mode
  • 破解程序本质是dylib,寄生在别人进程里。 系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。所以CydiaSubstrate引入了安全模式,在安全模 式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。

fishHook

它是Facebook提供的一个动态修改链接mach-O文件的工具。利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。

关键函数

image.png

参数一 存放rebinding结构体的数组(可以同时交换多个函数)
参数二 rebindings数组的长度

image.png
  const char *name;//需要HOOK的函数名称,C字符串
  void *replacement;//新函数的地址
  void **replaced;//原始函数地址的指针!把原始的函数保存在replaced
};

fishHook使用

//    rebinding结构体
    struct rebinding nslog;
    nslog.name = "NSLog";//重新绑定的函数名称
    nslog.replacement = myNSLog;//提供要替换绑定的函数
    nslog.replaced = (void **)&sys_nslog;//原始函数,把系统原NSLog保存在sys_nslog中


//定义数组
    struct rebinding rebs[1] = {nslog};

/** 用来重新绑定符号
     *  arg1: 存放rebinding结构体的数组!
     *  arg2: 数组的长度!
     */
    rebind_symbols(rebs, 1);


//----------------------更改系统NSLog的调用-------------------------
//函数指针,用来保存原始的函数地址
static void(*sys_nslog)(NSString *format, ...);


//定于一个新的函数
void myNSLog(NSString *format, ...){
    format = [format stringByAppendingString:@"\n勾上了!!"];
    //由于我们不知道NSLog内部实现,所以保留原始的调用!
    sys_nslog(format);
}

PS ** fishHook不能hook自己定义的函数 **

DYLD加载

共享缓存库

苹果提供的系统库,UIkit等等系统库,又dyld加载,当App需要访问系统库时,dyld引导在共享缓存库查找并使用

  • mac电脑中共享缓存,手机中再system目录下,越狱手机可访问


    image.png

    image.png

探索Hook

  • OC为什么能HOOK
    运行时机制,用过运行时 找到方法的实现,并hook
    SEL-->IPM 因为动态特性,运行时再调用之前修改可达到hook的目的

  • C为什么不能hook
    静态特性
    func();
    bl 0x102606a18
    编译时func确定func地址0x102606a18,MachO文件中

PIC 位置独立代码

MachO文件中 _DATA 建立指针,指向外部函数。
func();
bl 0x102606a18 --> 指向PIC中的指针。当代码在运行时,该指针无意义,可以理解为占位,当调用时获取共享缓存库中的函数地址,赋值给0x102606a18,从而指向共享缓存库中的函数,此为Macho文件的PIC技术,间接调用。

fishHook HooK C函数

在PIC间接调用时,代码初始运行时的函数地址再被调用而去绑定共享缓存库真是函数地址的时候,把我们自己写的函数地址赋值给代码初始运行时的函数地址,从而达到调用我们代码的目的。

dyld 并不会在加载image的时候,不会给函数(lazy函数)赋值,第一次调用时才赋值,即符号绑定

核心原理:fishHook 在重新绑定的时候,给代码初始运行时的函数地址赋值,通过传入的fishHook.name函数名称,找打符号,并给符号赋值为我们的函数。fishHook并不是调用再第一次调用函数的时候替换绑定,而是fishHook rebind_symbols绑定的时候替换绑定

  • fishHook 的操作全在dyld加载在内存的地址,不是MachO真实地址 。

ps
X 0x12134434 可读内存的值,右往左读
dis - s 0x12134434 读汇编

通过符号找字符串

sysmbols Table

String Table

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容