00:00
那么接下来的话呢,我们就进入到下一个环节,Facebook的学习,那么Facebook是什么呢?它是Facebook啊,注意Facebook提供的一个框架对吧?那么当然它不,它不属于一个框架了,因为它比较简单,它是一个工具啊,就是一个工具,那么呢,它是通过它是搞什么的呢?它是做这个。修改啊,修改我们的ma文件的一个工具,它是修改什么呢?它是利用ma文件的一个加载的原理,今天晚上我们就剖析这个原理啊,通过修改加载和非懒加载两个表的指针,达到C函数后的目的,有的同学一听哦,懂了,有的同学一听诶懵逼了,为什么什么懒加载,什么非懒加载,什么ma文件的加载什么指针什么东西是吧,这里面概念性东西非常多,没关系,今天我们一个一个来聊好吧,我们一个个来聊好,首先呢,我们先获取我们的这个分析后的一个代码,其实呢,就是通过我这里呢,已经给大家下载下来了啊。今天晚上的这个资料里面啊,Facebook对吧,非常简单,你看就两文件,一个点H一个点C对吧?啊,一个点H一个点C,它其实就是几百行代而已,对吧,没几百行几十行代码而已,对不对啊,So easy对吧?So easy啊啊有兴趣的同学可以看看它的源码好吧,当然它的源码呢,里面关于很多麦克文件的一些东西,大家呢,先要了解麦克户的一些API好吧,那么今天呢,我们先看一下怎么去用好不好,那么大家呢,注意我给大家看一下这个他的这个网站啊。
01:18
在ATE上面啊呃,上面啊hook。给大家看一下,就在这个GI哈,上面不要下错了,是Facebook提供的啊,Facebook提供的这个框架啊呃,大家直接去搜,第一个就是哥们,我今天网络有点问题,为什么我在开直播,开直播的时候呢,这个网络呢,就不我打开了对吧?好那就干掉呗,好那就干掉呗,那么呢,注意啊,咱们下载下来了之后呢,接下来要用的其实就这两个文件,一个点是一个点H,直接拓到你的项目里面去,知道吧,这里有个re me,大家自己看一下啊,纯英文的好,那么接下来我们来到代码里面,我们今天就写一个第一个例,好吧,写今天晚上的第一个案例啊。来001,然后呢,来一个飞hook,来一个DEMO啊,今天的第一份飞DEMO,然后呢,放到代码里面,然后呢,这里呢,我稍微改一下,你不用改对吧,你不用改,我要改改什么呢?改这个。
02:07
改这个咱们的这个,呃。帮的ID1OK,回撤好。不然的话等一下我没法增几条知道吧,我先还是在模拟器上面,我暂时先在模拟器上面玩啊好先把我们的这。资料把这个分析后的这两个文件呢拖进来啊。嘿。我卡Z干啥?卡西Z?还能撤回吗?未命名文件夹。啥玩意儿?等一下啊。那个。稍等一下。我把这个。撤回了是吧。嗯。中文输不了。是吧,不然的话,那我重新创建呗,重新创建啊。刚刚这个工程现在还能打开吗?
03:01
还能打开啊。我刚拖到哪里去了,有没有看到?在吗?资料。分析后个。这两文件被我拖到哪里去了啊?被我拖到哪里去了?好,没关系,备课代码里面有。啊,是吧,卡C神奇的鼠标好吧,啊这。变魔术一样的,好吧,我放在资料里面啊,今天晚上大家还是可以拿到资料的,好吧,放资料里面,然后呢,再拖一下啊,再拖一下。分进去啊。刚刚不知道拖哪去了,没,没关系啊。这鼠标太神奇,哎,换一个。Port又不提示了,好,那么直接来一个分析,Hook还好,不复杂点,H,好,我们先来。玩一下,首先的话呢,我们导入这个头就OK了,导入这个头了之后呢,接下来我写点代码啊,大家来看一下,我们分析后呢,简单的来H和改变一下啊,比方说我来这里。
04:02
只要我点击咱们的屏幕,哥们,你这都不提示就太坑了啊卡加K,只要我点击我的屏幕对吧,又了一下点击屏幕呢,我就调用我们的系统函数,哪个函数呢?咱们的ns log函数可以吧,完全可以卡加Q,我把这个插库的给大退了啊插插库的大退了,嗯,插库的呢,其实很好用,知道吧,我们不要在关键时刻骂他,千万不要好吧。他有脾气啊。来这里双击打开啊。终于重启了是吧?啊,这个重启能解决80%的问题,双击居然打不开啊。好,进来进来之后呢,接下来杠touch begin啊出来,哎,非常乖,好,那么这里面呢,我们ns log,哎,好爽啊,从来没有感觉到啊,从来没感觉到有提示,是一件非常爽的事啊,这个时候啊。从来没有这么强烈的感觉,好,那么接下来点击屏幕对吧,各们就来,是不是注意看同学们,今天我要做一个小小的实验,什么实验呢?当我点击屏幕,我调用系统的ns log,这们不跑了,跑到我自己这里来玩一下,有没有兴趣,有兴趣来朵鲜花,好吧,有兴趣来到鲜花啊,晚上听课呢,我希望大家跟着老师积极一点,其实我要花没什么用,我主要是希望呢,大家跟着我的思路走好不好?
05:20
呃,我们来看一下更改系统。系统。N log函数。更改系统的log调用,那么怎么改呢?注意通过分析后改。首先我们第一件事情做什么呢?先定义。一个新的函数,这个函数就是我自己的NX log,注意看啊,NX log我跳进来。跳不进去啊,跳进来这个呢,是我们的这个系统的定义,对不对,系统定义前面我们就不要导包了啊,系统定义,然后呢,来到这里啊,我定义一个自己的,自己的叫什么呢?叫做my ns log,完全没毛病,对不对,这是我自己定义的一个性函数,也就是说只要你调用它刚我就跑到这里来,是吧,很爽啊,试一下。那么这个时候怎么做呢?首先Facebook hook,注意它和run to的动态交换不一样。
06:11
运行时动态交换只需要给我两个,也就是说,哎,我告诉你这个函数和这个函数你给我进行交换对不对,但是分析后可能它需要一个指针,它需要定义一个函数指针来保存谁呢?来保存这个ns log的一个地址,要保存一下,否则的话怎么办?否则的话你再也找不到原始的函数了,能能理解我的意思吗?就是如果说我把ns log改成了my ns log,那么今后怎么办?今后你就再也找不到了,能理解吧,再也找不到ns log了,知道吗?啊,所以说呢。它和姆不一样啊,它需要借助一个三方的变量来保存,好吧,嗯,好,现在现在建议零度学习I,我什么啊,学点啥不好,知道吧,学点啥不好啊,OK啊,过来人都不希望你学,你知道吧,为什么就多了一个竞争对手,是不是啊,开玩笑开玩笑啊,等一下呢,再慢慢给你解答这个问题。其实呢,进入it行业都是有风险的,这是个高风险职业,知道吗?但是进入了这个职业,如果你做的风生水起,那也是很赚钱的,关键看你怎么去做啊,任何行业都有它行业里面的门道啊,好,那么呢,我们先看这里啊,讨论技术问题,我们先来看到。
07:18
那么首先我要定义这样一个指针来接收一下它,对不对啊,我们定一个指针接收一下啊,函数指针,函数指针啊,用来保存什么呢?用来保存原始的函数这个地址啊啊。好看着啊。用来保证原始的函数地址,那么这个函数的地址的话呢。静态的static,然后呢,注意word,它这个word回值没有了对吧?好,然后呢,注意这里面呢一个新,接下来跟上名字,这是system,注意保存原来的函数地址,原来的函数是不是C什么系统的吧,系统的N是多少个啊,我就它的名字是这个,然后呢,它的参数直接copy了对吧,参数就是这个可变参数对吧。C加C,嗯。来这里看加V,好,这就是一个指针,知道吧,这有一个指针啊啊,这有个指针好,那么呢,这个指针有了之后,接下来呢,注意我们到这里面呢,就进行一些小小的稍微做点小小的修改啊,如果你掉进来了之后,我做什么事情呢?我这个format啊,这个参数我就直接使均白喷Ding使均的我就拼接一个东西,什么东西呢?来。
08:22
啊,这个勾上了是吧,啊勾上了。或者上钩了对不对,说明如果你进来打印了这个门是不是说明什么。是不是说明你已经hold住了,对吧,你这很很明显嘛,但是ns log的内部实现你知道吗?你怎么把它放在我们的日志上面去啊,你你不知道的知道吧,啊,由于我们不知道ns log的内部实现啊,内部实现所以怎么办啊,保留原始的调用嘛。知道吧,所以保留原始的调用,原始的调用怎么办?你还能调o log吗?你还能吗?这和我刚刚的那个。
09:00
例子不是一样吗?你还进来这这干啥了,这又低位了,知道吧,所以说怎么办?System这个指针就是用来干这事的,能理解不能理解,来给我敲一这个指针就是来干这事儿的吧。知道吧,这个指针就是用来干正事的,所以说如果想要调用原始的,你就用这个指针,今后我交换了之后,这个指针就有了,现在这个指针指向谁,啥玩意没有知道吗?啥玩意没有啊,好,我们现在呢,就做到了这样一个交换,那么呃,做做到了这样一个这个函数的调用,但是呢,交换还没有,那么接下来怎么下钩子呢?我们是不是要下钩子了?对吧?Welcome是通过什么一个陷阱函数进行交换的,但是分析后不一样,我们先看一下啊,来到点H,它给我们提供了多少个函数呢?往下一滑,哎呦嘿,吓了一跳,就两个。看到了吗?就两函数一结构体,是不是非常简单呢?对吧?就两函数一结构体,接下来解读一下这个函数第一个是什么?Rebound重新绑定,重新绑定什么东西?申报是重新绑定符号。知道吗?重新绑定符号还有一个啥?还有一个是rebounding symbols,还有一个集,这是什么呢?重新绑定某块的符号,某个模块的符号,知道吗?重新绑定某个模块的符号,就这两个。
10:10
啊是吧,哎,这里哦,之前我写的注释,备课的时候写的注释啊。那个注释我怎么拖到哪里来了啊,好,那么呢,注注意看啊,这个是重新绑定符号,这个是重新绑定某一块的符号,好那么接下来紧接着我们来到这里,我们就直接用了吧,啊,我们就直接用啊,直接用刚刚的那一个函数好吧,好,我们来看一下,在view底的漏里面,我们就真正的下钩子了啊,这里面进行一个。交换好,我们来看一下怎么交换啊,首先有个函数叫什么rebo是吧,申宝石,你看就这函数两个参数对不对,一个是什么呢?注意看名称啊,一个是Jack结构体类型,结构体类型哪个结构体叫做rebing这个结构体,那么这个结构体注意它是它的指针,我告诉你在函数里面一般它的指针说白了要么就是。这个哥们的一个指针,要么就是数组,很明显这哥们是个数组,为什么它是re,你看这个参数行参reboing s是吧,也就是很多个这个结构体的一个地址。
11:09
对不对,那就是一个数组呗,啊是吧,所以说这几个参数呢,给大家解释一下。看着啊。首先。这个函数是用来干嘛的?是用来重新绑定符号。翻译过来就重新绑定符号嘛,那么什么叫做符号呢?什么叫做绑定呢?等一下会讲,不要急,ARG1参数一是什么?它是存放什么呀?Re,单顶。这样一个结构体的。一个什么数组?注意,第一个参数它其实是一个数组,它是用来存放这个结构体的。第二个参数什么?你看是一个reboing length什么东西,说白了,数组的。你觉得啥?你觉得是啥?啊,同学们觉得是啥?
12:01
是不是它数组的长度知道吗?就这个,哎,同学们为什么他要这么设计,一个是数组,一个数组长度,说白了。它同时用于交换的函数可以写成一个函数。能理解我的意思吗?就我直接我告诉你需要这个reing,这个结构体里面肯定有某些属性,可以确定你要交换哪些个函数。啊,你要交换哪些函数,新函数和旧函数是什么,然后你要交换它们,好,我知道了啊,你要交换他们,好,我知道,我放十个结构体,说明我要交换十个函数,一次交换完毕,明白了没有?明白了给我敲个一。明白了吗?明白了,给我敲个一。它用起来更爽,知道吧,它用起来更爽,好吧,它是可以一次性交换多个的啊,你看人人家Facebook写的就是不一样是吧?好,那么接下来我们来他需要什么,他需要这个结构体对不对?现在重点就在于这个结构体了,说白了,那么接下来我先第一个我先搞个数组Y。我先定义一个数组啊,定义一个数组,你不就是要一个数组啊,这个数组的类型是什么?Reing吗?啊,你放到这个结构体的一个数组叫做reing s啊S我现在只需要交换一个,我这个长数就写死了,有一个,然后呢,里面我先放个空,我先把这个什么,把这个数组给丢进去,这两个参数是不是就搞定了,一个是re s,一个是一。
13:14
这个函数不就搞定了嘛,是吧,接下来研究上面的东研究上面的东西呗,是不是首先研究数组,数组是不是搞定了,数组里面接下来需要什么,需要一个结构体,接下来我是不是要结构体了,瑞班顶这样一个,哎。顶,这样一个什么结构体对不对,这个结构体什么类型我不知道啊,知道它的类型,但是它里面哪些属性我不知道,我先定义出来是吧,好,叫做ns log的,我这个结构体肯定是交换ns log的嘛,是吧?好,那么呢,我把ns log放进去。是吧,我就把这个结构体放进去,好,那么接下来接下来这个NS它有些什么属性呢?点一下呗,啊有三个属性,一个是name,还有一个什么,还有一个这个replace replacement么是东。
14:00
来这里注意这个结构体它提供给我们的,这里面我跟大家解释一下它分别是干什么的。第一个名字,注意它是个什么Co下新C字符串对吧?它是什么呢?需要后的什么函数名称,注意它是一个字C字符串。对吧,这是第一个,第二个什么呢?第二个它是一个指针,这个指针是什么呢?这个指针是一个函数指针,也就是说函数的地址啊,函数的地址好,那么这个是什么函数呢?要替换到了哪个新的函数的,这是新函数的地址啊,新的函数的指针,新函数的地址啊,比方说这个地方,那我应该传谁?我是不是应该传my ns log是不是的,试着给老师敲个一。这个地方是不是应该传MYNX对吧,好了第三个。这个你觉得应该是啥?你说他是啥?他其实啊。就是原始那个原始函数的这个指针了,对吧,就是原始函数地址的指针,注意它是个看到没有为的什么星号星,它是个二级指针,知道吗?旧的对非常好啊H同学,是的,就是旧的NS多少个小小林前同学也对了,也说对了,就是原始的那个地子,那么注意它是由于它是什么二级指针,它其实是什么呢?它其实是那个地子的一个。
15:21
弟子。为什么?因为你传进去的是谁?你要的是谁?你要的是谁?你要传进去的是这个指针,那你要给这个指针赋值怎么办?那就是他的地址嘛。对不对,你要给他赋值的大哥,你要给他赋值的。对吧,因为你交换了他嘛,你把my ns log的地址是不是要保存到这个指针里面去啊,所以说你要拿到这个指针,你再给他赋值啊,这个指针的地址是不是要告诉你,所以说它是个二级指针,这里你就能想明白了吗?能理解吗?这个地方能理解,敲个一。对不对啊,OK,好。那么紧接着开着,那我就开始。
16:00
写了呗,N是多少个呢?什么LA是啥?NS。看到了吗?就这么简单,好,那NX rock是什么?Replacement。这是啥?这个是不是我们新函数的地址啊,啊,我们新函数谁my ns log,注意函数的名称就是函数的地址。啊,注意啊,函数名称可以就就这么函数啊,函数我说函数可以就这么写,知道吧,就是个底,就是个指针啊,那么还有一个。Replaced,它是什么?旧函数的system,这是一个,这是一个指针吧,它是个指针吧,它里面存的,现在里面没值,你要给它赋值怎么办?取他的地址给我丢进去,那么注意这个地方会报一个警告,所以说呢,把它改成我的,哎行星嘛,对不对,卡加build一下。过了吧,是不是过了吧,过了之后是不是要。哎,看着同学们不知不觉写完了整个流程。
17:01
不复杂吧?啊。明白了的这个过程,明白了的敲个一,我们等一下鉴定。整个过程没不复杂吧,对吧,新的函数旧的函数的地址丢给我这个结构体放到数组里面,Semble交换对吧?啊般symbol交换好卡加运行来看一下。交换成不成功对不对。哎呦嘿,这个模拟器怎么跑这里来了?稍等一下啊。好,看到啊。点击诶。成功了没?看到勾上了吗?看到同学可以来个小鲜花,知道勾上了吧,是不是是不是勾上了?哎,我本身ns log打印的是点击屏幕,结果你给我丢出来的是点击屏幕加上一个勾上,说明跑到了my ns log里面来了,说明什么?说明系统的ns log函数已经被我们轻松的修改了,我给大家提供一个小小的思路,同学们他能够有多爽呢?
18:03
他能够有多少呢?啊,我今天是不是要讲防护啊,对不对,我问大家一个问题。看我的PPT。看着啊,大家脑洞要大开啊,看我的PPT啊,PPT里面。咱们的。H技术有几种?三种?一种是run的特性,一种是c subtract。而c subtract。它的什么hook对于OC的方法是不是底层就是用的run to啊,那也就是说OC的方法,你要hook是不是都是用的run to是吧?OK,好,那么run to里面我们刚刚讲了method改变的时候是用的哪个函数?哪个说?改变OC的方法,你要后口UC的方是不是通过OC的1000几这个函数?是吧,好,那我问你,咱们的fish hook是不是可以修改C函数?
19:03
那么我再问你,我可不可以用fish hook hook咱们的?一个是陷阱。可不可以?啊,一旦我后了一线解,那么今后你再用一线解还能后我的OC吗?是不是不可以了?好,这个思路给了大家知道吧,是吧是吧,这个思路给了大家怎么玩,嘿嘿,今天晚上就带你们玩,有兴趣吗?啊,有兴趣来个大拇指好吧,OK啊,听课我告诉大家,其实学习就需要这种感觉,知道吧,其实并不是说这个技术有多么厉害,而是你带有一种这种心态去学的时候,你学的多带劲,知道吧,啊,咱们学起来了都有意思,这样子呢,你就绝对能记住。好,等一下我们再讲,好吧,等一下我们再讲,那么接下来我们先看这里。我刚刚说飞机后很爽是不是啊,我们今天要探究一下飞机后的原理啊,主要是探究原理,那么接下来我再建一个工程,我们来玩一下飞机后很牛逼是吧?好,那再建新建一个工程,接下来注意看啊,再建一个工程啊,再建一个工程,卡西加N看着啊。
20:06
来个002呗,002啊,来一个fish hook。DEMO。第二个工程。哎,老师你刚刚不猜脚诶,怎么跑到虚拟机了,诶还创建成功了,我的天呐。想错了,这个代码我到时候再把它挪出来,好吧,我到时候再挪啊,跑到哪里去了,跑到我的这个资源文件夹下面去了,没关系。呃,那我首先把这个。分析后给拖进来呗,是吧,那么刚刚刚刚说了啊,分析后很牛逼是吧,那可以后C函数,但是同学们有没有。有没有觉得有点,有没有觉得有那么啊,不用用6S模拟器,有没有觉得有那么点怪怪的。咱们有没有听说过C语言是静态语言呢?有没有听说过,听说过的打个一啊。有没有听说过C语言是静态语言,听说过的打个一啊。废话嘛,它不是静态,难道还动态的吗?OC是动态的,C是静态的对不对是吧,咱们一编译你你写个你定义一个C语言的这个方法,C函数的方法啊,函数的方啊,不是方法第函函数的声明对吧?你声明函数你不写实现你1BUILD的这个们不就挂了吗?是不是你能掉吗?不能掉的对不对啊不能掉的,所以说这个C点它是静态的,但是它为什么又能后呢?那想不通是吧,总有点想不通,好,那我们我们先在这里啊玩一下啊交换是吧。
21:24
先玩一下,怎么个想不通呢?思考一下,思考一下这个问题,今天值得思考啊,今天这里面的东西都值得思考,然后呢。一旦思考清楚了之后呢,接下来我们再去探索,原来你发现原来iOS系统的底层是这样的,收获才会有好,那么接下来注意看啊,我先这样来做啊,呃,我定义一个函数。啊,定义一个函数。放C,然后呢抗恰新恰新str啊啊啊。来加好在这里面的是多少个,嗯。那找摆放S。
22:01
然后呢,Str啊,你传给我什么,我就打印什么嘛,说白了放个C就是干这事的对不对,那接下来。这个是用中文的符号了。是英文的。报啥错?好来看这这里啊。我现在呢,要进行要想进行交换啊,我在在这个地方还是一样的,我只是只是把它不直接用ns log了,知道吗?能理解我的意思吗?我用fo c。能能理解我意思吗?这个时候是什么呢?这个时候我要获的就不再是系统的函数了,对不对。能理解我这个意思吗?我现在写的这个代码,你说你这这代码有有啥意义,没啥意义,我告诉你我要获的就是这个方C,我要后的是我自定义的函数好不好,那我们试一下看一下你你分析后口不是可以交换吗?是不是,那交换一下呗,试一下啊试一下,那首先我这个原始的指针和。都要定义出来是吧。这个键盘。原始。指针啊看着啊,原始的指针新的方法好吧,好,原始的指针的话呢,这里面我就先来一个static。
23:04
然后呢,Word是吧,还是word的没反回值,然后呢,这里面叫做。放C的一个指针,对吧,里面的参数是一个cost。新,然后呢,这里面ST好,这就是我们的原始的函数的指针吧,等一下呢,我要用的对不对?新方法的话呢,叫做六方C对吧,你要给我替换一下嘛,对吧,里面还是参数还是cost圈新啊,这里面是str好。那么呢,在这个里面啊,在这个里面我们就N是多少直接啊勾住了。打错了就打错了啊,大家能理解好吧,然后呢,再放个C。这是调用原来的对吧,Str。先打印对吧,先打印这能理解吧,这个东西很简单对不对,好,那么接下来注意看啊,我接下来要进行交换了,交换的话呢,是不是通过导入头。对吧,分后。
24:01
倒了之后交换很简单吧,交换怎么交换啊?一次性写完rebo。升宝石这里面是不是需要一个数组啊?对吧,这是一个数组对不对,第一个参数数组,那么这个数组的话呢,就这么写。对吧,里面是不是放结构体啊,所以说再来一个大括号,能看懂这个语法吗。放个C,我要后口的时候放回C,你的新方法的指针是不是溜放个C。是不是就是名称嘛,你的原始的函数指针是不是取放个CP。没毛病吧,当然这个地方为了不报警告,来个喂的星星。对不对,好,那么呢,为了整个过程不报警告,这里注意啊,这个数组,注意这个数组它到时候会报警告的,有可能啊,那么在这个地方呢,我强转一下。没毛病,这个地方啊,写成一行了啊ing。这个数组一个对吧,一。
25:03
一句话搞定了,那其实是一个意思啊,我就不想写那么多,行你知道吗?好,那我们就直接考加运行了。诶,没问题的,打个一好吗?同学们,你们这么沉默,我有点担心呢。没问题的,打个一好吗?啊没问题吧,就是刚刚的那个代码啊,刚刚的代码,然后呢,就是交换方C,是不是你给我调用到六方C里面去,然后接下来我点击屏幕是不是应该到这里来卡加运行。看着啊。要快。好,点击屏幕应该打印啊,这个勾住了啊,然后呢,这个哈是吧,点击屏幕应该是这样子,那接下来看看是诶诶。难道是这里写错了吗?我告诉你,这里没写错。这没写错。注意,没勾到。看到了没?没勾到。诶,这个新方法没进来。哦。不要研究这里,这里没写错啊,不要研究这里,这里没写错啊,这里没写错,一样的好吧,一样的好吧,那么原因是什么呢?
26:07
原因是飞机户口根本就勾不住你自己定义的函数。注意听好了,飞行work根本就勾不住你自己定义的函数,那同学们有没有兴趣了解一下,为什么它能勾住系统的?为什么他勾不住自己的?这到底内部有什么原理?今天我们一起来探究一下,有兴趣的。那个先画,我们进入下一个话题好吧,啊,我们进入下一个话题啊。把这个视频保存。
我来说两句