11.Hook原理

[TOC]

回顾

注入的相关要素:

  • 注入的形式:利用动态库的特性进行注入,包括Framework、Dylib。可以修改二进制文件,但是过于麻烦。
  • 注入的步骤:
    1. 将动态库注入进APP(配置工程cope file,让工程和动态库进行关联)
    2. 修改MachO文件中的Load Commands段,使用yololib工具进行修改,
    3. 在动态库中添加自己代码。
  • 注入的大致原理:APP在启动时会根据Load Commands段对依赖的库进行加载,在被加载的库中进行hook等操作。

HOOK概述

iOS中hook的几种方式:

1、Method Swizzle

利用runtime特性进行hook

2、fishhook

利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。

C函数部分是动态的,部分是静态。非自己APP中的函数都是动态加载到内存中的,这部分属于动态C函数。而自己当前APP的函数在编译时就指定了,不能被修改。

3、Cydia Substrate

通过动态库形式注入如到APP中,因此手机无需越狱。

Cydia Substrate主要由3部分组成

  • MobileHooker
    • MSHookMessageEx 主要作用于Objective-C方法,用于钩消息。
    • MSHookFunction 主要作用于C和C++函数。
  • MobileLoader

用于加载第三方dylib在运行的应用程序中。

  • safe mode

CydiaSubstrate引入了安全模式,在安全模 式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复

fishhook原理

fishhook简单使用

fishhook Git

钩函数,系统函数NSLog()。

  • 钩住系统函数NSLog();
  • 钩不住APP内部的系统函数;

原理探究

大致原理

图:

大致原理

fishhook所做的只能对外部的函数进行重绑定,而内部的函数是不能进行重绑定的。

需要了解APP加载到内存的流程、共享缓存区。

共享缓存中包含系统各种函数等内容,因为各系统版本的内容量大小不一致等原因造成共享区所在占用的内存大小也不一致。

macho在进行加密时Apple是对每个page进行加密,其中text 段的page是只读的,而data段的page是可读写的。

对符号表的设计是采用PIC(position independent code)技术的延伸,用动态绑定实现链接。

  1. 在生成app期间进行build,app内部的函数直接生成指向函数的地址,去除了函数名。而外部函数(如系统库、其他三方库中的函数)会在MachO文件的_Data中生成一个函数指针,以0补全;

    在此创建的指针就是常说的符号,符号指向内部函数调用,外部函数地址。

  2. APP运行前存放在磁盘上,需要通过dyld加载进内存中;

  3. 而iOS现在采用ASLR(address space layout random)技术使得app加载进内存时,macho所在的内存区域都不尽相同,采用偏移来查到;

  4. app加载进内存过程中dyld对指向外部函数的指针进行赋值(将具体系统库函数的地址存入指针),即进行动态绑定;

原理验证

  • 通过MachO查找到NSLog在lazy_symbol表中的offset1;
  • 使用image list 查看MachO相对于共享缓存区的偏移量offset0;
  • offset0+offset1得到指向NSLog的指针在运行过程中的实际内存address;
  • 通过使用dis -s address进行反汇编查看调用的函数;
  • rebinding后再次查看即可查看到address已经改变。

动态表的查找

待续

基础反hook

  • 在自己工程内对method_exchange进行交换,交换成自己的函数,并在自己的函数调用原函数;
  • 之后在使用自己交换后的函数进行使用;
  • 但其他人通过method_exchang钩的时候会不成功;
  • 另外还需要对runtime中的get/set_method方法进行反hook处理;

查看一个macho文件的动态加载表中的加载顺序,是否与工程设置有关,以及加载顺序是否与表中排序一致

反反hook

  1. 覆盖(同名)掉原有的反hook动态库,覆盖的动态库中不添加代码。
  2. 调整动态库的加载顺序,

关于指针

// 其实指针就是存放地址的变量?
    int i = 1; // 存整型数据变量,在栈内存中用一个变量指向常量区内存空间
    int *p = &i; // 存整型数据变量所在内存的地址,在栈内存中用一个变量指向栈内存中的一个变量的空间地址
    int j = *p;
    j++;
    *p = j;
    p = &j+1; // 移动四个字节空间赋值给p
    NSLog(@"%d", *p);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343