本套课在线学习视频(网盘地址,保存后即可免费观看):
https://pan.quark.cn/s/3d3ec6c4aec2
声明:所有发布内容来自网络,仅供用户学习交流测试网速使用,部分影片如有内嵌广告,请勿上当受骗。获取的所有内容请在24小时内删除,禁止非法恶意传播或商业用途。如有侵权,请联系删除,个人微信:sumith,防失联。
好了,昨天我们学了一下字符串,对吧?那么今天我们还要把这个在内核里面用的非常多的一个东西,就是我们后面在立项过程中会用的非常多,就是这种链表。这个链表各位都用过吗?之前学C语言的时候,有没有学过算法之类,就是那种什么数据结构对吧?507你就不用说了,50505075507是你压根就自己太难了,说实话507太难了。
好了。我们先过来,我们首先我们首先。
说话的都没有用过,怎么可能这种三环基本上在学。你们在学语语言的时候,应该都是至少基本上都是学过简单的链表的对吧?你这个就只能去移植一下。应该你会在get hub上可以找到一些比较简单的C加加那种标准库,STL的一些库。但是它没有全部一没有人把它全部把它弄进去的,都是比较简单的一些。可能有维克特map我map也可能有,反正几个简单的还是有,反正你要太复杂的那些STL所有的,那么基本上没有。知道吧?STR所有的基本上没有。
这个跟你我现在讲的不是三环了,那你要我给你多说一点也没有用。因为我们也不是说要让让让他来去说,今天给你要用这个去实现某一个链表的增删改查对吧?这个不是我们先我们的内容,我们主要的是要把这个链表的一些API给介绍一下。你们的任务是什么呢?就是在今天任务就是我你写一个链表增删改查,然后就是你用它链表的那些函数,用来做做增删改查,然后拖到IDA中,你去看一看它翻译成汇编是什么样子。懂我意思吧?他不是让你来来学这个正向怎么写,正向改啥,这个没有用。
好了。
首先这种链表,手链表就是数组,最简单的这个结构就是数组是吧?这种数组它它的这个缺陷基本上就是属于这种定死的缺陷。懂我意思吧?
就比如说我们一个int。X那么一百那么像这种如果各位它超过了100个元素之后,就已经就不行了。你如果再写往里面写的话,像C语言或者C加加这种的强静态篇语言,它会产生一个越界的错误,对吧?因为他可能100之后的内存不是你的了不或者存在或者不存在。那么不存在,你就直接报C005,那么存在你就可能把别人的值给改了,懂我意思吧?所以像这种它有个缺陷。
然而在C加加的这种基础上,各位就做了这种类似这种vict。这种VGT它不是链表,各位能理解吧?它是一个动态数组。
这啥意思呢?
也就是也也就是。
他那是它是这样的,它首先在内部它默认的元素大概是16个,懂我意思吧?他发现当然他这个16个他不是你们想的那种定死的,它是类似这样的溜出来什么int 16是吧?大概是大概一个我就这个表达形式,让各位看起来清晰一些,又打6出来16个对吧?
当他访问的时当他已经插入满的时候,发现了已经到了16了,那么怎么办呢?它会把原有的这块内存给它丢弃掉,然后重新的6出32个或者扩大多少倍,注意扩大多少倍。扩大完之后,再把这一块以前的内存的内容复制进去,再把新的又加在后面或者你指定的位置,这个能理解吧?各位,这种叫动态数组。那你有意思吗?各位。
这种它的性能其实并不高,知道吧?我相信各位用微软的数组,这种类似的这种性能其实并不高的。当然了它非常也算非常好用,在STL中用的也其实比较常用,对吧?
第三个就是列表。这种链表它就是它就没有说什么上来我就定义多少个节点,它没有,它就是基本上就一个头部有一个节点。也就是比如说我在这里画个图,就一个这样的节点,这个节点中注意我竖着画再画几行。通常这一些这上面的这个是一个节点,下面这些是数据。也就这一部分,绿色的是我们的定义的其他类型的结构。
其他类行比如说一个int,下面再来一个什么字符串,再来一个其他的,懂我意思吧?各位,这上面是一个节点,这个节点通常是通用的,也就是它里面的这个节点是指向自己的节点。比如说。你举个例子。
我操这个不行,我感觉他这个不太行,是吧?我举个例子,这个地方没有灯。
通常他基本上可能是这样的。
好,这个是data 1,当然这个不一定是int,这是你自己定义的,知道吧?这是你自己定义的。
我操我都感觉这个玩意他妈的不好用,我直接贴个图放在这。我的妈多好,直接把这个图案放在这里算了,他妈的这个实在不好用。好了,各位,它大概的你可以理解为是一个这样的类型,或者有一些正好只有一个节点,也就没有数据。这样的话正好是符合那种我也不知道业务是什么,反正要业务来包含?符合一种这种被容纳的思想。
好了,各位,它通常只有这么。首先第一个只有个头对吧?有数据它就加一个。有数就是有新的新来有数据要挂上好了,他就创建一个节点,并且把你的数据把数据放在这里。好了,各位有一个我又加一个,有一个我又加一个,它通过了这个注意,它是通过这个头,通过这个节点,这个节点这个纸箱的。这么直向的。
这个节点指向干道,这种叫做单向链表。懂我意思吧?各位,就有一个我就创建一个这样的结构,把这个结构的指针指向下一个。有一个就创建一个,又把这个结构的指针又指向下一个,这能理解吗?各位?
就是把tag放到结构指针里边,什么什么tag它不是,就是这第一个。第一个指针它是用来指向下一个的,懂我意思吧?你只要获取他第一个成员,他的指针是指向下一个,就不停的就可以便利出他所有的所有的节点,然后直到遇到一个指向闹的位置。这能理解吧?
各位,这个就是一个普通的普通的一个单向链表,在我们驱动里面表示的是这么一种S。是这么一种类型,知道吧?我们来看可以看到。是这种类型。那么这种类型的通常它只有就是它只有一个节点,注意。各位可以看到它是这样的。它就是自它就是一个这样的结构,这个结构就是自己指向自己。
看到了吧?那么你要用的时候,你就是把这个包含进去就可以了,就是把把这个放到你结构里面就可以了。通常因为我们因为CR家里要使用这种所谓的数据结构,这种还是要对内存稍微有一点有一丢丢理解是吧?不然的话你看起来也是云里雾里的对吧?
好了,但是这种结构对于我们的,对于我们不是很常用,就是我们这种开发者并不是很常用。但是你稍微的理解,我是从这个地方给各位稍微的引入一下。因为在他这里面,在这个内核里面喜欢用的用的是什么呢?
双向,注意双向循环这个列表知道吧?双向循环链表。这种链表它通常它的结构是这样的,各位。你来看一下,这个是它里面的结构。我就这么给各位复制了。
它结构是这样的,它有一个前驱,有一个后区,那什么意思呢?就是从这个节点,只要在这个节,比如说这是一个节点。节点的第一个这个叫做后区这节节点的。第二个叫做前驱,有这个名字,它起的看起来是确实有一点,这个是指向上一个,这个是指向下一个,知道吧?那你叫前驱后驱,这个看起来好像对吧?有那么一点。好了,各位,这是它的节点。那么这边也有个节点,我们同样的把它描述一下,也是这样的是甜菊,真的是绿色来的。
好了,各位。这个注意是红色的部分指向了它这里,注意这红色的部分这个是标注的这是它的上一个节点。做到针对于这个节点来说,假设我们当前当前节点。
它这个红色部分会指向它下一个上一个,然后绿色部分会指向它下一个。它也是一样的。
好了,这边红色部分也会指向它的这个上一个,知道吧?各位好了,但是它这里面注意这种只是称为双向链表,没有构成循环。各位可以发现,因为他的这个上一个的指向是一个空的,这边的这个下一个的指向是个空的,对吧?只他只能找到有的,没有的他只找不到。那么像这种循环的话,比如说我们还加一个,这个三个看起来比较有感觉一点。
好了。这个指向的是它。
对吧?
好,各位,那么这最后一这一个没有指向怎么办呢?它会它是这么一种,他会这样注意,因为我这个画不了,画的不太,他这个太平了的话,画不了,画不了那种,所以我们得这么来。
他的上一个?
就他看到没有各位。这个就是构成了一个循环。也就是你从这个地方拿到它的上一个下一个,都可以拿到它的上一个节点和下一个节点。你在这里也可以拿到上一个节点和下一个节点,你在这里一样的可以拿到上一个节点和下一个节点。你从哪个地方拿呢?都是都可以把它自己看成一个起始地址,遍历到最后,如果便利回来了,那么就证明了你便利到末尾了。懂我意思吗?各位?
这个能理解不?我觉得你们应该能够理解,为啥呢?因为你从理论上来说,各位应该是C语言应该都是过关的对吧?你不至于学了一个语法你就过来了。
但是我从里面的表现来看,我就感觉有点他妈的好像云里雾里的,是吧?
好了,你对不是辜负了我的期望,这不是辜负了我的期望。这个应该是学语言的时候顺带学一下数据结构,对吧?是不是?但是你学数据结构,我没没说说你要把这个数或者图学的多深,但是基本上的还是学过链表。这种结这种东西,只是说可能各位在使用的过程中就觉得没怎么用过,对吧?是不是有可能就是用C加加的,直接用他的STL库。
好了,各位,这种叫双向循环列表。这种叫双向循环列表,知道吧?那么这一种各位在便利的时候一定要注意,就是判断是否到了自身。然后后面我们学这个驱动锻炼的时候,也就应该是大概明天,我们驱动锻炼的时候也会用到它,用到这种就是你在便利的时候,只有便利到哪个地方了,你才就退出,对吧?
好了,各位,针对这种,它有一些它这个微软给你提供了API,并且这个API对于它来说还是开源的,知道吧?还是开源的。比如说。你比如说我们在这里定一个头定一个头。
它首先你要用的时候首先要用它的时候,你可以手工的初始化,也可以自己初始化,知道吧?也可以调用API初始化。那么它API初始化也很简单,就这个它给你提供了,那它怎么初始化的呢?各位请看,它初始化很简单,是不是?就是自己指向自己,看到了吗?各位。
好了,那当然了,我们用的时候肯定你不可能只有一个指针,对吧?那你只有一个指你只有一个这个链表是没有用的。因为你一通常你用链表肯定是要带数据的对吧?所以我们在通常使用它的时候。比如说我随意的定义几个,叫查查,我也不知道,因为想不到什么名字了,对吧?
好了。好,这个是它的list。这是它的历史的,也就是定义在它的头部。这个定义在头部有头部的好处,但是windows通常很多东西喜欢定义在腰上。后面我们在立项的过程中讲结构的时候会接触到。好了,假设我下面的定义了一个X定义了一个AKS。
好,各位,我在这里定义了一个叉叉叉,这个我们给它初始化一下。各位,我这么初始化,我问个问题,我这么初始化和这么初始化。
有什么不一样吗?
一样的。
我我我这样呢,我如果是这样的话,还一样吗?晚安。所以要搞清楚我能这么写的目的。注意,我能这么写就是我能这么写是因为我知道我的这个第一个成员跟结就是结构结构的第一个成员就是链表,对吧?是不是各位你要自己清楚,你你你是这么干的,在头部你才能这么定义不然的话你就这样对吧?这个是各位,所以你这样,这样的话你看的清晰一些对吧?
好了。这个就是它的初始化,然后初始化完之完完之后,比如说我又来一个,这个叫做什么叉一是吧?好了,这个叉一我们把这个X定义成10。好,它其本质上你也应该要初始化一下,你知道吧?你也要初始化一下。我们给它插进去,注意。
Inside这个插入有2个API。这个是插入到我们这个链表,就是比如说我我我这么插。这是我们的链表,这个是我们的实体。各位,我这么插的话,是插入在这个链表的头部,也就是插入在它的底下一个知道吗?假设我这里面有有十个节点的,也就是假设这个是我们的刚才那个。
头开的那这个。
是我们X一不不不,我们再来一个。
哎。对,这个是我们的X1。它原本是有三个节点的,各位没问题吧?原本是有三个节点的好了,那现在我调用这个插入头部,也就调用这个API。
吊他,他会怎么办呢?他会把把他的这个上一个指向到这里来,把他的下一个只想到这。懂我意思吧?各位,那原有的注意原有的这一个,它的上一个就变成了他了。好了,它的下一个要变吗?各位。
不要。
变了,它的下一个就这边的下一个,这边的下一个就指向的是它了。懂我意思吗?各位?
这个能理解吧?也就是插入在它的下一个插入在它的头部,注意插入在它的头部。那么各位这里面也是有实现的。各位可以看到,这是检查一下链表,是不是一个正常的这种链表,这链表是什么意思呢?就是他的如果他的下一个的上一个指向他自身,对吧,不等于他自身,或者他的上一个的下一个不等于他自身,那么他就觉他就说你这个链表是一个有问题的链表。所以这也是为什么我们要初始化一下。
所以这也是为什么我们在这里初始化一下头部,懂我意思吧?因为你让他自身等于自身的,你才是一个正确的链表,不然的话你这个乱。如果是这个指向的表有问题的话,它不能允许你乱插。好了,各位,这个是插入在它的头部,还有。
插入在它的。
尾部。
好了,插入在尾部,这个就很好理解了,我们退回去对吧?好,退回去。这个插入到尾部就很好理解了。也就是说找到它的最后一个,把它的这个上一个放在这儿,把它的上一个放在指向它。它的下一个因为它已经是最尾部的,所以它变成了它的上一个,指向了这一个了,对吧?因为它是做尾部了,然后这边的这一个这边这一个的下一个,也就是这个对吧?指向到这边来了。懂我意思吧?各位,也就这条线呢就没了。
他的这个这他的下他的下一个,我看一下他的下一个指向了它它的上一个指向了它。
这边的上一个也要改一下了,这边的上一个,就是也不是他,也不是指向他的,对吧?不然的话你看起来有点乱。指向它这个没问题,各位就这么给它穿起来了。这个就指向到尾部,指向到这个尾部。好了,各位这个就是插入到头和尾的问题。这个能理解吧,各位。
那你删除也是一样的,各位好了,你删除,它也是提供了这种API给你的。这个是指把自己摘掉。来移除,因为他有他能找到它的上一个和下一个。注意他在这边是可以找到它的上一个和下一个的,所以他把指针给指一下替换就完事了,所以这个很简单。那么还有就是。
这个删除,还有头部删除。通常这个用的不多,知道吧?因为通常这个用的不多。这个其实跟删除的这个不是特别的感觉,不是特别大。
你可以你这么看一下,首先拿到的是它的下一个节点,对吧?然后拿到它下一个节点之后,这些这个是拿到我看一下,这个是拿到实体的下一个的下一个对吧?也就是从等于就是这个下一个的下一个,知道吧?各位请看,用它的下一个指向它这个下一个用用他的这个用他的这个下一个,注意用他的这个下一个的上一个指向他,这个是啥意思呢?这个就是他刚才这个API,这个API是什么呢?这个API是啥呢?就是把它自身给摘掉,知道吧?哎也就是我比如说我要把它给删了,把它给删了之后,也就这边这条线呢就变成这个下下一个。
也就是把这一条,把这个地方,把这条线呢重新指到别的地方去,对吧?
这个线我给他先切了。好了,这个就被移除了。这是掉这个,知道吧?这是掉这个。当然了,这条线我就不连了,暂时不连了,因为它连起来有点麻烦。那这个是啥意思呢?
那这个是啥意思呢?假设我们是这个head,假设是它,那么它的意思就是把它下一个的给它移除掉,也就是这个没了,让他直接指向这下一个,我们把这个给清了让他直接指向这下一个。他的上一个,由于它就两个了,所以他的上一个就直接指向的是它。
那它这一个,它的上一个又指就指向了,因为它就两个节点了。
它指向的是这个,然后它的下一个也这是他上一个。他的下一个其本质上也是只指又是指回来了,知道吧?各位这个能理解吧?这个就是删除他自身的下一个,这个就是删除他自身的下一个,这个就是删除他自己,这个能理解吗?各位。
好了,你后面你动手做个实验。好了,各位增商改查,他没有改,知道吧?兄弟们,他没有提供什么,这个改是没有的,你自己去改对吧?这种的查询,他也没有懂我意思吧,查询它也是没有的那你想便利它的话,比如说假设我还有一个。一共有三个,假设我这里是20。这个我也给他一个,这里是五个。好了,我初始化两个。那么这边我都都从它的头部插入,好插插它的尾部插入,那么这个纱我先注释掉。
好了,那你想便利的话,对吧?比如说我们拿两个指针来玩一下p type是吧?Nice, 他的下一个,因为我们如果只知道头节,因为你不需要知道其他节点的,或者是你只要反正你只要知道其他任意一个节点就可以了。那么我们先拿到它的指针对吧?拿到它的指针。好了,用它的这个指针的,如果当然了这个地方我们可以选择读威尔,因为我们指向的是它自己,不是它下一个指针。
如果这个东西它不等,如果是不等于我们的这一个不等于它就代表了我们还没有结束到没有全部循环完。因为它是一个双向循环列表,如果等于的话,我们就已经进入到下一圈了是吧?已经解已经完了,我们在这等于。它的下一个你知道吧?这个就是一个标准的循环。那么在在这上面我们就可以了。那如何。
查找。
这个地方?我们可以给它强装一下。
好了,因为我们知道它的类型,对吧?所以你在这个地方有个吧,那这个X如果等于0,差20了。我就觉得我找到我的了,这个地方,我们写个零叉。好,找到我的,我就不瑞克了,你懂我意思吧?各位在这里,我们找着了。
找到Y6。那我们还给他打印一下。
好了,这边我们给它拿过来。把属性的感谢。
还有我们的驱动设置改成了win 7。我们编一下。
找到它的值,我们跑一下。各位可以看到,我们找到了这个20,对吧?这个没问题。各位假设你不找的话,你不找的话,比如说我没有找,没有找的话,那么你来看一下它会不会死循环,对吧?我把这个字,我把这个里面的东西打印一下。这样的话我们可以知道我们遍历了几次,并且有没有产生一个死循环,对吧?
各位可以看能看得到吧?我们遍历了三次对吧?来,我们再来一次,对不对?因为我们也就是三个节点,各位这里也就是三个节点,差了两次都插在一个,都插在这个节点上,对吧?插在这个列表上,我们遍历也就是三次。
那么这里面的这里面我们来看一下,我们来看一下各位。比如说我把这个地方。我把这个地方拿过来,在打开这个IDA,知道吧?你们主要的任务是要把这个搞清楚,因为后面在立项分析的时候,会产生大量的这种链表。所以把列表捏着看一下。
好了,过来,找到我们的这个魅函数,在这里面大家请看。它这个编译的时候,各位给我是编译出出成了函数对吧?但是其本质上很多的时候它可能不是函数,我先关掉,那么这种可能看起来还不是很好看。我把这个符号给他去了,好吧。覆盖OK,不加载符号走。
那现在这个是没有符号的,各位,但是这个还是跟64的有差别。因为在64位下,像这种都比已经被内嵌进去了,知道吧?都已经被内嵌进去了。所以你在这里就能看得出来,它没有掉那么多高release的是吧,试一下。
等一下。
好了。
对数据结构为什么会那么高?那个是说实话,那个是卷。你这个是真的知道,其实他用不到。他问问题要这么问,你懂我意思吧?其实就是考官在这里给你提一些这样的东西,其实他真用不到你去里面还需要你来设计的吗?这个他妈现成的。
你觉得你数据结构设计的很好,那其实有什么用呢?你像在java里面,谁会去自己写一个数据结构呢?你像你在C的家里面,基本上你会写个数据结构用吗?不会他妈的标准库一大堆,对吧?说白了其实是卷。除非是你进入那种专门搞算法的,搞游戏引擎的那种公司,知道吗?那里面你就可能会需要设计一些这样的东西了。
对,你正常就后面就变成实实时期了。对不对?大家都996就肯定有17了。好了,各位来看这个这个。我来看一下。Are you?
这个好像。好像去好像没了。我的便利?
尼玛没了。好了,这32位下来,我房子优化一下,各位。
你妈的。
这32位下加个踹加个踹加个踹,这种补货异常的,应该是可以防止优化的。
一在这。
是这个应该各位这看起来就好一点了,各位。我我这我这样,别搞什么变量不变量了是吧?按给他按R键。真的,你看的可能会好一点。好了,各位。
首先看。
这个地方,兄弟们,这是我们的,我们正常我们没有符号对吧?你逆别人的时候很多都是这样的。各位哈他没有符号,其实长得都长得差不多这种样子,甚至这个地方你也看不出是一个打印。
知道吧?
打螺丝就是去流流水线上流水线上打螺丝。好了,各位请看在这个在这里我们一眼瞧过去,应该是知道的,就是一个值。各位大家还有印象不?这个阴影桥过去应该我们知道,它就是我们设置的这个五十是二十的这这几个值。那我们继续往下走,注意这个是妈的这个地方大家不用关注,后面讲异常的时候才有。在这里取到的是EBP减24,给了EAS。
注意各位请看哈他链表的这一种通常有个特征,这个特征会把,当然了这个也不足以说特征。因为在某些时刻,各位它可能是一个零,对吧?也是往这么往往这里进行一个初始化。但是这里有一个AREA取它的地址,往这个20和24里面塞。那么像这种其实大棒大磅是一个什么呢?就是我们的这个链表结构,知道吧?这个能理解吧?
各位其实大棒的你看到这个就大概清楚这个地方是一个链表。你自己心里要把这个特征给记住,这个特征给记住,这个单那你不能说它一定就是一个链表,知道吧?我们先给它写一下链表一,那么要再一步的确认。一般的这种链表它还有其它,它一定一在这里初始化一个链表之后,还有其他的操作,所以我们要往下才能确认列表2。
好了,我们对着它来按下按一下这个。历史的一,我们这么给它复制。好了,n list 2,给它改个名字,按N键,注意,这个NM的这个N键给他改个名字知道吗?兄弟们,刚才虎哥在这里给你切换。比如说我按一个L键,它变成这样,然后我们最终按下C键,它就变成他又把这个给还原回去了,知道吧?
我们再给它命名,比如说我们在这里?这个地方我比如说它是一个长得这样的,它本质上它应该是这样的。各位,本质上它是这样的。刚才我们二路见了,变成这样了,对吧?我再对着它按一下C键,它又还原回来了,对吧?我们再对着它按一下N键,然后历史答案。各位好,给他改个名字好了。
那么各位这个地方又来了,又来了。它有你可以看到这上面的类似的就是我们的初始化。在这里又取到了我们的这个列表,看到没有?取到了我们的链表一,拿出了这个链表一,就这么来吧,拿出来这个链表一看到吗?把这个链表一塞入到这个链表二中,对吧?这是什么意思呢?
这是什么意思呢?各位,这个其实就是我们一个链表的下一个和上一个知道吗?对吧?一个列表的上一个和下一个,他把把这个塞入到它的下一个下。那你各位我们按R路键,各位可以看到,这个是上一个。
应该是。
减30,这个是减2C那么照这个说,这个应该是它的下一个前驱,这个是后驱,然后给他给给把把这个给他拉进去,我们再过来。
来看一下,这是链表一,链表一取到它的EAKS对吧?就是取到这个,注意是拿他的地址。拿到地址之后,我们把这个放到了EBP加历史的二中,放到这里面。把这个顺便也放到一份二十一中,再取到这个链表2,注意把它放到了这里,这个好像等价于各位可以理解交换的一个位置,把这一个也放在了加20的位置,那这个其等价有点像交换一个位置,我们再往往下。
把这个东西我们给它整理一下,它大概各位我知道知道在这里,你在这个位置就对了,这一招我也要教你们。在这个位置我们选中这一个,按alt加Q,我点一下,注意点一下,点一下之后,我们对着这一个按这个alt加Q,知道吧?Alt加Q,当然了,我们这里也没有。导入一下,它没有给我们引入对吧?在这里把这个链表的结构写输在这里,我们对着它按alt加Q,在这个位置我们选中它,然后这边也是一样的。
alt加Q.
然后在这里也是一样的alt加Q好了,各位这个就是我们的结构的那个数据,我们没有给它定义成数据那种东西。我们过来过来之后,过来之后,我们来看一下,它现在就长这样了。各位这个就跟我们刚才看到那个代码差不多了,就是你在这里给它初始化了。各位可以看到,这边我们也按一下,取到它初始化,这是链表三对吧?拿到链表一样,链表一我们把把它把这个链表一的,因为我们现在只有两个节点,注意你现在只有两个节点,对吧?所以也就是当他执行这一句话的时候,各位因为你只往这一个节点中插入一个节点,而当这个节点里面也没有内容,也就是第一个插入的节点。各位我们把我我我把这里给它显示一下标准。这样免得我看起来不会乱。在这里各位可以看到这拿到我们的头部,拿到我们头部,拿到头部之后,在这个地方把把它让我们的插入到我们的链表二指向投了,那指向链表一的头,那这个是对的。
各位我把这个。
给各位列一下,这假设是我们的三个三个,我们刚刚初始化完它,对吧?刚刚初始化完它,那么现在我们要把这第二个插入到第一个节点的尾部对吧?那么插入的时候,由于我们其实其本质上我们都是自己指向自己,那现在才开始真正的插入。那么也就是在擦的时候,会把会让我的这一个的我的上一个去指向它,对吧?上一个指向它对不对?各位我的下一个,因为我们就两个人两个,所以我下一个我其实我循环循环,所以我下一个我仍然指向的是他。
这个能理解,各位,因为我就两个,现在你这个第三个还没有加入进来,他的上一个和下一个都指向他,我这边的上一个和下一个也只能指向他,对吧?所以它看起来就是这么一种这么一种感觉。你可以看到它就是把把我们列表一的取出来,上一个下一个的都指向它,对吧?
好了,我们再看一下它取消链表2,那么这个就是成功的把一个就注意这一段,这一段一定要把把他那种你这种大概的特征,你要给它记下来。那这个是。链表2插入到链表一维度。好了,各位这个就他这样的就差完一个了,注意这样的就差完一个了。那么各位在这里再看这个,它紧接着由于我们要再插入一个,各位再对着这个链表头插入一个码。但是现在由于我们这里面也多了一个因为我们这里面多了一个链表2,知道吧?那各位请看这里,他拿到这个链表一的时候,把它插入到列表二的线下一个,对吧?各位再拿到列表2,把这个列表二插入到它自己的上一个,那也就是说也就是什么这个。
它的上一个各位,它的下一个,因为它是双向循环的,各位,所以它的下一个就变成这样了。这边的下一个就擦掉了,注意下面的下一个就要擦掉。
了。
它就变成这样了,他的上一个直过来了。各位你看这个用它的下一个指向链表一对吧?用它的这个上一个指向链表2,看到没有?好了,再取出链表3,再取出链表3,让我们的链表2,链表二的下一个指向链表上。那么各位也就是这一个链表二的下一个指向链表3,各位再用我们链表一,链表一的上一个指向链表3,对吧?那这个也是就构成这样了,各位。
好了,那这边的他的这个下一个,我画一下下一个仍然没有改是吧?仍然没有改就指向这里,这个没问题。各位弄个笔画画,我画的这个不行,我画的这个太丑了,它这个好像只有这种这一种,这一种还有那种钢笔的,知道吧?还有那种钢笔的那这个能理解吧,各位。现在我们做了这种这一步操作之后,你按照它这个上面的连连线你体会一下,它大概构建成这样了。
构建成这样之后,各位请再往下看啊,因为我们的这个可以知道它已经初始化完了,初始化完了。在这里各位ED这个是ESI,也就取到我们的链表第一个加八的位置,进行干什么呢?这是我们格式化字符串对吧?这个是我们770进行调一个call,也就是打印下来了,就在这里进行打印,那这些话其实被优化了对吧?也好了,各位打印完之后,各位这里是平衡这个平衡这个靠,用它的,各位可以看到。自己用汇编操作还可以优化这些代码。
对,好了,各位,不会的这编译器编译的各位,我们对着它按T,注意对着它按T选中这个,选中它你要的结构,如果没有的话,你就按control加F进行搜索。各位可以看到,从这里这么看,这样看你就比较清晰一些,然后拿到它的结构的下一个对吧?拿到下一个之后,这边是什么呢?再拿到我们链表的头部的这个地址,然后进行比较。如果这一个地址与这个如果他下一个与他这个链表头相等,那么我们就不跳转,这个是不相等才跳,那么相等我们就直接跳到这下面来了,各位看到了吧?就返回了。否则我们就继续循环,直到遇到等于为止,等于我们就不走循环了,没问题,各位。
主要是这个这个你给我立一立好吧,就自己构建一个增项改查。然后通过这些API,你把它的去分析一下这里面的这个链表是怎么一回事儿,知道吧?因为各位我们来看一下,就是我们之前在在知道这种进程。比如说你看我们这是这种的是进程结构,在这种进程结构中进进程结构中,各位你看这个是一个链表,对吧?我们来找一下,这呢各位可以看到又是一个链表,各位可以看到这又是一个链表。我们继续你看这里又是一个链表,这又是链表,看到吧?它它里面有大量用到了这样的链表,为什么不知道相等就不再循环了?
为什么相等就不再循环呢?因为我们是循环链表,你注意理解他,你看他,就比如说这个产你从这里开始便利,你在这里面我就想问一下,你拿他的下一个是谁?你看这是宁浩,这是一号,这是二号。你拿他的下一个是一是谁?是二号吗?还是零号,你让他下一个2639。
为什么为什么我要知道这个链表,这不是你不是这不是我们写的代码吗?这不是我们写的代码吗?因为我这里一直往下拿下一个,我一直拿下一个。
首先你要这样看啊,假设我我是一号,我是一号节点,我从一号节点开始便利的,那么我拿下一个就是二号对吧?我的下一个在这儿就是零号了。然后我零号再拿下一个,我又变成一号了,对吧?是不是因为我我这个只我这个是这么转过来的,对吧?然后这边也是一样的,它的上一个对对对不对?所以你拿一直拿,他总会撞到他自己。这就好比这个地球,说这个地球是圆的,你从一直向一个方向走,那最终还是会走到原点,那你走到原点之后,你才知道我走了一圈了,把地球逛了一圈了,是不是?这没问题吧。
很很简单各位,你们任务很简单,就是因为我让你们去立项一下,所以我不知道各位基础怎么样,所以我也不再讲其他的了。就是你你把这个写自己动手来插入这个列表,你去分析一下对吧?写个结构,注意写一个结构,你不你可以写复杂一点,不要写的我这么简陋对吧?去分别赋值,去观察你的你初始化干了一件什么事,然后你调用这个删除关了做了一件什么事,你调用这个删除了做了一个什么事。然后记住,别小看这个,各位别小看这个,你们要把这个把它们呈现成一个图,就是他干的事情,你最好用一个图形来表达出来,然后这样的话你自己会清晰很多,知道吧?
慢慢的你就感觉,主要是这个步骤搞定之后,后面在你立项的过程中,你再看到这个链表,你就不慌了。不然的话你就会问了,火哥,你怎么知道是个链表?我就看不出来它是一个链表。就有这样的疑问来了,可以后面我会讲好吧,后面我们讲SSDT的时候,我带你来创建好吗?
好了,内容不多哈,各位。
欢 迎 关 注
更多精彩内容关注下方公众号:逆向有你
个人微信:sumith
每日自动更新各类学习教程及工具下载合集
https://pan.quark.cn/s/874c74e8040e
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...