本套课在线学习视频(网盘地址,保存后即可免费观看):
https://pan.quark.cn/s/26206b14febd
声明:所有发布内容来自网络,仅供用户学习交流测试网速使用,部分影片如有内嵌广告,请勿上当受骗。获取的所有内容请在24小时内删除,禁止非法恶意传播或商业用途。如有侵权,请联系删除,个人微信:sumith,防失联。
你得看他,比如说你看这个进程的线程,你应该是看这个。懂吗?你应该是看这个查他的县城。你模块它是不执行的,模块执行什么?那县城跑到那里,那么你你你说你你你那个地方就内存执行了一下是吧?那那是县城跑到你才执行一下,县城不在那里,没在那里,你你有你可能就是入口点在模块里面跑一下,然后就跑跑到其他地方去了。我现在断下后,不知道是哪个县城。你调你,你的意思是你要你想知道他的县城从哪个地,哪个起始地址来的吗?还是从哪里跳过来的?你从哪里跳过来的,看返回地址。你想知道它是哪个县城?OD我是不太清楚,OD我是不是太清楚?应该看到断点里面有,但不是X64。我也不太清楚,我用的比较少,我一般都是用问题bug去调的,或者是用11。但十一我也不关注它是哪个县城啊。我不需要关注他是哪个县城。也不是因为你知道它是哪个县城,没有用。他下次启动它县,它县程变了,你还是要抓特征,知道吧?你知道它是哪个县城,真没有用的,你下次启动它又变了。而且他什么时候跑到那里也是一个问题,你应该是要记住这些点。他没进城,CS怎么是虚构的?它是虚构的,它就内核虚内核的一个进程,在这内核里面虚构的一个结构在这里,它是没有他是没有三环的,知道吗?它内核里面虚构的一个结构。然后你它代表它就你可以理解为它就代表你的操作系统,你所有操作系统系统线程都是跑在这上面的。当然也不是所有你可以指定它有创建这个进程里面的指定的这这种系统线程。但是基本上所有内核的就跑在这里面,它相当于你的内核,知道吧?因为你的内核在初操作系统初始的时候,首先就是把把一开始E运行,把把那个NT colo运行起来之后,就虚构一个这样的进程。什么?高良记是啥?高粱地就这两个是一个意思吗?不是一个意思。这个就是这我这么跟你讲,也就是说在它的这个内存,这个32位的内存划分里面高就是这个内存划分里面一共有讲,他是把这个4G虚拟概念虚拟内存给划分的。比如说八开头的到A8开80000到F000,FFFF这个就是高两G的内存地址,这两G内存地址是被共享的。不是说跟这个system的进程有什么关系,它没关系。这假设就是一个进程,对吧?这也是一个进程对吧?他俩的这一块,红色标记的这一块,这里面的CR3指向的PTPDE基本上都是一致的,只有少部分不是一致对吧?因为它还有还还不是有有一半多不是一致,因为它有一个三环对吧?但是这个内核它里面也有一半也也有一个不太一致。所以你这个两G只是说它在只是说所有进程的高2G的内存都是共享的,并不是说它是CS的吗,知道吧?而且你CR3,比如说你你你这个的system进程的CR3是1850这么一个值是吧?你这边你的这个A进程的CR3,它是可能C00011个这样的值。他俩就是我不我不在它上面运行,对吧?我切到CR3上运行高两G它也是可以的。就是因为它的内存是共享的,虚拟地址的基本都一致。对吧你改这里面搞两性的内容,这边也改了。所以在在这个高粱机里面,你切到这边,切到哪里都是差不多的,只有少部分不一样。然后你这个size怎么进程的?是是有是这个NT,注意NT模块被加载之后,首先会创建一个system进程,知道吧?这个进程只是只是只是一个虚构的结构。这个结构,它没有所谓的三环地址的,没有R3,没有R3地址知道吧?也就是你访问它的这个0到7FF其实都是不存在的,它只是一个结构而已。你也可以创建一个这样的结构,加入到他的列表里。你也可以伪造一个这样的。懂我意思吧?他没有什么特殊的。好了,各位,咱们今天要来把这个页还要过一下。就我们昨天讲的是那几个属性,我们今天还有两个属性要讲一下讲一下我们基本上它的这个英特尔的属性,我们基本上就讲完了。等一下打开它吧。在这对吧?像那个101012我就不说了,因为它没有这个29912的属性多。因为这个29912它上面多了一个属性,各位它多了一个属性叫叉低位。这个叉低位,它是解决了101012下的一个bug,对吧?因为英特尔可能在设计之初刚搞的时候,他也没有想到有这么一些东有这么一些漏洞。就是它里面的这个物理地址,在101012下,是不分这个执行和数据的。他认为的都是只要这个物理地址存在即可以执行。我这么讲能理解吗?各位?由于就是有了这么一个特点,那windows它的设计里边,因为它是面对的是市场,知道吧?你的硬件终归没有走向到C端,对不对?也就是客户端他只是流到了所谓的这个场,对吧?B to b你跟英特尔他做生意基本上是B2B知道吧?也就是企业对企业,那么这个操作操作系统,它基本上是B2C的这么一个模式。也就是说企业面对客户,在他面对客户里面的时候,因为你面对的是十多几十亿人,他总有那么一些人会去寻找你的方方面面的漏洞,是吧?在这个windows里边,它早早的就设计了这个虚拟内存的页属性,就是规划了哪些可执行,哪些不可执行。就是比如说我们申请一块页,那申请一块内存,这块内存的指定的可读可写,有些属性的指定的执行可读是吧?或者是执行写拷贝对不对?你有这样的划分对吧?但是各位你的硬件一直就有这个bug。所以在你没有它没有换入换出产生各种异常的时候,windows是接管不到的。因为你访问一块内存,你可以你直接类似的,不需要通过什么API去访问。各位访问自己的内存,读写就印的心一下子是吧?没有星号X等于10。那么这一个是不经过它API的直接使用的,翻译成汇编指令操作的。那么这种是也不经过微软,可以这么说,直接在CPUU上跑的对吧?各位,所以微软的设计这种虚拟内存里面的东西是挡不住的。那么到了229912下,就把这个洞给堵住了。它的专门在这个高位上,因为这个后面的12位,它已经规划了作用。那么你有可能会用到火哥,他以前这些地方是忽略的,或者是给留给操作系统的,是吧?是的,就是因为他以前是留给操作系统或者忽略的,可能被操作系统用了,他也不敢在这里加了。为什么?一加的话,所有的操作系统厂商可能就要改代码,所以这样不利于双方的竞争。因为你还有个阿蒙迪的对手,他不止一个人,一家独大知道吧?不是我说了算。那这个时候,他是在他头部这个地方加了一个这么东西。你以前在这上面写写画画的无所谓,反正我还是支持你以前的。在这个地方加了一个蔚来标志了。是否可执行?如果这个叉低位为一的话,就代表了你这个业是不可执行的。如果叉低位为零的话,代表了你的位,你是可执行的。那么在有些书上或者文章上,也称这个位叫N叉位。懂我意思吧?各位,所以这个叉D等于N叉。因为你看这个英特尔手册,它自己标注的是叉低位,但是在他手册里边有些地方又写的是N叉位,这个能理解吗?各位,所以当你看到这两个东西的时候,你自己要反应过来,它其实是一样的,不要觉得疑惑。好了。如果我们的页是两兆的页,或者或者这个就是这种大页是吧?在29912下以两兆为一个大页,为什么是两兆呢?等一下我再说。那么在这里边,如果我们的PDE,注意PDE你无论是两兆还是一个指向PDE的PTT的这种列表。PDE那么它只要把这个PDE的NT位,这个叉D位设置为一,那么就代表了你下面。页都是不可执行的。那。就比如说这个是我们的PDE。这个是我们的PDE对吧?那么这个PDE中的它的这个N叉位等于一是吧?那么下面这个等于0,假设好了。那么这个东西指过来,也就是它指向的这里面的这个PPDEPDE,它指向的这个PTE,注意,这个PTE它还能它指向的这个物理页还能执行吗?不能执行了,知道吧?不能执行了,它是它是整个这一它是把你整个这一块儿这一块里面所有的。所有的我操妈了个逼是吧,我他妈怎么移动这么高PDT,所有的这个PT里面的这这几这一些全部是不可执行的,它所指向的物理业全部不可执行了。这个也是我之前跟各位说的一个与的关系,这个能理解吗?各位?所以在很多的情况下,微软在在复制这个PDE的时候,它通常是可执行的。因为他的管理的业太大了,知道吧?懂我意思吧?不利于更加精细的划分。所以通常这个PDE它都是可执行的,它控制的是PTE不可执行。因为这样的话它就可以控制到PDE下某一个PTE不可执行,某一个可以执行,也就某一个页可以执行,某个页不可执行。这样的话它就更好的善于进行的管理。懂我意思吧?各位这个就好比我们的一个deal,各位一个dell的内存,各位可以知道在del的零差1000的这个部位,是读内存,是只读的只读液。不可执行对不对?中间这一段有一个test的段是吧?Test的段。这又这个又是写拷贝的。执行。是不是各位如果各位对deal还有有一定的认知的话,应该是知道的。因为你一块deal整个内存它有能执行的代码段,是待执行的不可执行的数据段或者是一些其他的是都是读写或者是只读的光只读的内存对不对?那么这个它有一些deal,你是一共才10K20K或者是一百多K对吧?它没有占到一两兆的这么大的大小。那我不可能说我来给你单独分配两兆的内存,对吧?分配两兆的内存指向全部不可执行,对吧?他没有这么干的,他都是很精细的划分某一个页,为什么?属性是什么?这样便于你控制好了,那么这个差低位,我们来做个实验。各位,因为我在之前的时候,我们写299,写101012的时候做过,就是挂您地址的时候,我们在那上面做过实验。各位,这读写的内存照样可以跑,对吧?还有印象不?各位。我们现在再来一个。好,我先把头文件先放进来。好,各位,我在这里,我申请一块内存。这个叫做v vacant,他妈的忘了怎么写了一下。好了,这里我们写到写个零差一千,这里我们提交对吧?好,申请的这个页我们只是读写。注意,我没有可执行的吧。兄弟们是不是没有可执行的?好了,我们现在拔出code。我们把这个是要扣的给它写一下,对吧?我给它跑一下。好,这边我就直接写了,因为这个我们都都已经做过一次了,都是六都写个msy box是吧,第八是吧。好了,0.413。我们把它的这个地方是九是吧,还有个靠是吧,名叉FF,名叉地名。呃。NAPI, 就这个其实我这么写,就是他。叉叉,他妈的好。我们来编一下,看一下编有没有问题。好了,这个语法依然说我们有点问题,我们把它移到上面来。我这里没有写逗号。他说我这个无法转换是吧?这里还要强转一下。好了没问题了,那么我们来个focus执行一下,然后执行完之后,我们在这个地方暂停一下。来跑一下,各位请看我现在就C005了,是吧?我们切到这边来看一下。稍等,我看一下这个是它的调试器问题,还是我们怎么这个内存是个闹。好,我们刚才这个应该是跑飞了。好,各位,我们来看一下这个地址,这个是没有错的。刚才那个可能是跑飞了那个值之后,指向的指针就不对了。好了,各位我们再来一次,顺便把这个地址我们打印出来对吧?我们来看一下已经确认的一个事实,就是我们并不可执行,对不对?所以我们来看一下,这个是F4个0。那么四个0,这里还没有九位,兄弟们是吧?没有九位,只有八位,对不对?所以他他这个我们都不用换了,直接过来。好了,这一个是吧,我们滴滴一下。DQ一下好了,买它对吧?DQ一下。还是他对吧?加零的位置。你Q一下乘以F乘以8,加上F乘以8就它了。各位请看这个最高位这个地方看到了吗?他最他的PDE,它的PDE它没有指向的是一个零?没有指向的是一个八,这个最高位不是一。那么你看它的PTE呢,它这里它的PTE它这里有是一个八对吧?在这边各位也就是我们的这个N叉位是一了,知道吧?也就意味着我们把执行的权限关了,我们没有权限,那这个时候,我们把它给它改一下。EQ. 对吧?然后这个地方我们改成0,我操。这个物理地址物理地址不能这么写,注意,所以我们把加4的位置改成0,那么我操这个地方是一滴,加4的位置改成0。好了,我们来看一下,现在我们就改成可执行的,是不是各位这个有问题?好了,那么我们放过去,放过去之后,注意这个29912它缓存久一点,所以我们换两下?随便打开一下,免得他出有缓存,缓存下来我们TLB啥之类的。我们走现在各位可以看到我弹出来一个框了,是不是?好,我们再再证明一下,再证明一下用C一打开它,我们来看一下当我们改了物理地址之后,我们的属我们的页属性是否在这个虚拟地址上也变化成可执行了,放回家F4个0。妈在这儿各位请看这个在你的虚拟管理虚拟地址的管理器中,它依然是描述的读和写,没有描述可执行。但是我们的物理地址已经悄然发生了变化,是吧?物理地址的属性大家发现了没有?所以我们依然可以执行,但是你查还是读写。对不对?好了,过去了,没有问题对吧?没有问题。好,各位这个差低位,就是补这个之前29912的这种漏洞的,知道吧?因为那个漏洞其实这个漏洞很厉害的,你们不要小看这个漏洞,你懂我意思吧?因为在他很多那种网络发包里面,有一些软件写的不够清,不够健壮,然后人家多发一点字节,他就处理不了了,就直接就崩溃了,知道吧?懂我意思吧?然后别人利用你这个崩溃,覆盖你的覆盖你的某一些返回的地方。他用堆帐在帐里面跑起来了,能能理解吧?各位从账里面跑起来了,你知道吧?然后就出就就有这么一些漏洞。那如果你一你有了这个东西之后,你的堆栈是跑不起来的,他也得想办法干掉你的第一批,对不对?所以它的难度就增加了很多了。但是在101012项这种人家就随意干,你知道吧?对,就是那个DP这就是第一批,知道吧?对,这就是第一批。第一批的本质就是这个东西。好了,各位,我们现在要接着来这个就是我们的跳B,我们的跳B跳B中我们得来做这种实验了。来,我记得我在这个里面有个图,我之前是画了一个图的,在这个上面,这个图?各位我们我再来回复,我们再来想想,就是回顾一下。之前的时候我说了,我们是从这个CPU里面转到这个MAVU部件,然后通过它他第一次并不拆,是吧?兄弟们是不是把把你的线下地址拿过来,他并不拆,只是取叶真,对不对?什么叫叶蓁呢?就是我们的一个线性地址去掉后面的12位,然后也就是左移12,右移10 12位。把后面的12位去掉之后,得到的那五位值就叫夜真。然后用这个夜针往TLB中查询,你所谓夜针对应的物理真,物理真也是后去掉后面的12位,知道吧?懂我意思吧?各位,也就是夜针对应物理真,那他用这个液液真的去跟你的物理真进行一个对比,知道吧?如果他能在这里面通过这个验证找到这个物理真,就证明你找到物理地址了。找到物理地址,他就给直接返回了,知道吗?对不对?那么我我我在这里说一下,我们的TLB大概有两种,那大概有两种类型,两种类型知道吧?一种一种就是叫做ITLB。ITLB, 还有一种叫做DTLB。这个I和D它没有所谓的直接关系,知道吧?它的内容存放的都是一样的,只是有个概念在这里,概念是啥呢?I是指令的意思,D是数据的意思,也就是指令的TLB和数据的TLB它不是一个,这个能理解吗?各位?也就是你执行和数据是分开的,知道吧?执行走执行的TLB数据走数据的TLB好了,这个TL这个ITLB和DTLB又分2个TLB,这两个一个是4KTLB。还有个人是你大爷T2B。你可以为你理解为小叶贴好币。这什么意思呢?就比如说这种只存在大页,也就是两兆页或者4G或者四兆页。或者后面你29912下的这个什么一级和两级,两兆也知道吧。这不是这个64位下的那那种大叶和中叶的那种之分知道,那也就这个只是存大业的,也就是存什么呢?存我们的这个只有PDE的这一项的,也就是这个PS等于一的,知道吧?P这个地方等于一的,那么等于一,也就是你下边你就没有所谓的PTE了,你只有一个PDE,这个PDE指向的就是物理地址,这个物理地址有两兆或者四兆的大小。好了,我这里稍微跟大家讲一下,你我们之前是比如说29912对吧,是不是这个是小叶的拆法。知道吧,真你大爷的拆法,你应该是29。RE也就是你只有两步,从PDPTE中找到所谓的PD后面的21位全是业内偏移。我这么讲能理解吗?各位,也就是之前的这个PTE的索引已然变成了业内偏移了。也就是你只要拆两步这种的那101012项,1011012项也是一样的,也就是1只要拆一个找到PDE,后面的22位全是业内偏移。它很简单,它没有它我比这个小叶拆法更简单是吧?没有很复杂的地方。但是你得知道你得知道就是这个PSV,PSV如果等于一的话,也就是大业这个地方等于一的话,那你就是按照这种拆法对吧?这种拆法。如果你是这个地方等于0的话,你就按照我们之前所学的拆法就可以了。这个更简单是不是?好了,你理解这个之后,我们再切过来。那么再切过来,也就是这个存的就是我们的大叶,用大叶状的那这个是存的是我们的小叶,用小叶状的。所以他的叶臻和他的叶真是有一定的区别的,知道吧?那也就他娶叶真的时候是怎么取的呢?比如说我们以29912为例,也就是说32位往后移动21等于验证对吧?它的小叶的夜针就是。32往后移动12位,这个,就是等于夜针。叉D被限制死了,感觉没有啥应用场景,这个是有应用场景的,大业是有应用场景的。我们的内核地址很多都是大业,就是我们的内核。我们举个例子,我们找一下,这一个。稍等,你看我们的内核模块,这个是我们的内核模块,就是我们NT color base,它会给我们打印出来,那么我们在这里PTE1下。好吧,他居然不是大业是吧?在64位下通常是大业,但是在32位下我发现了他好像不是大爷,打脸了是吧?翻车了。好了,不管了,跑路。它是为了性能,我说说一下它在内核中为什么有一些是大业呢?是因为它的这个大业的性能并更好。因为你你这个不需要老是换入换出,它本来就是一个不需要换入换出的东西,知道吧?就比如说我们内核态内核里面这个内核稳内核对吧?NTO科勒姆这个base它一直在跑的,他不需要换入换出,它也不需要这么多碎片化管理,所以他可以很明确的把它指定为大业,知道吧?这个能理解不?好吧,但是我现在没有,现在我们这个是一个小业,因为它有PTE是吧?也有PTE所以我翻车了,对吧?好了。那么你的数据你的数据TLB跟这边是一样的。他大概的格式,我只能画出它大概的格式,因为他自己也没有详细跟你说它是个什么样的格式,大概就是虚拟页证。这个是物理验证。好,这个是a tube te属性,后面有一个统计次数。到我们六四的CPU下,它还有一个东西叫做PCID,知道吧?还有一个东西,这个。这个我们后面学到64再说。那么我们在这个三位下,大概就是这么四个是一张这样的表。那也那比如说我举个例子,您差12345678好了,我的物理地址是零叉1108511985000好了,我们虚拟地址的这个页帧是12345,那么你物理地址的页帧物理页帧是这个11985。然后你对应的属性其实就是你这个PT你这后面的这几个是吧?当然了,这个地方可能是什么?867是吧?或者是16411163,或者是087。假设随便一个地址这边是一个次数,比如说我们一次、两次、三次、四次、五次,懂我意思吧?那这个是什么意思呢?比如说我现在访问了一个12345这样的地址访问了一个12345这样的地址。那么他112345678这样的地址,他会把它拆成这样。那12345到这里面进行一个碰撞,知道吧?进行一个碰进进行一个搜索,然后一搜,在这兄弟们在这,就把这一个物理验证给你返回去。你是长这样,你的物理属性是这样的好了。他就不需要再往去找其他的缓存了,是不是?那么页页页表结构缓存它不需要去找了,他就直接通过这个去L一中、L二中、L三中去拿所谓的数据值就可以了。加上偏移的话,这个能理解吧。各位,那如果没有,那比如说我现在访问的一个地址,比如说1111个这样的地址,对吧?物理验证我随便拿一串。好了,那么他如果返回这个,没有的话就是我我拿着这个在这里面一搜咖,一对比,没有,没找到,没找到的话怎么办呢?他自己去拆一下,再去把我们现在忽略掉,你把那个缓缓存结构给忽略掉,你他就直接拆。拆了之后去那个L1、L2、L三中去拿数据,对吧?拿数据拿到数据之后,它会相对应的把这个东西放到这里来。放到把这个放到这里来,属性记录记录属性,这个地方写个一,如果我们以存在的下一次来存在的碰撞了一下,好,拿到了,拿到了次数加一知道吧?再一次拿次数又加一再次拿次数又加1。但你可能会问了,虎哥这个次数有什么用?这个页表TLB它总会填满的对吧?那填满之后,哪一个访问次数少了,哪个访问次数多了,他有个心里有个数。比如说这个只访问过一次,那么我就把它画刷掉。他不没有没用了,刷掉。那么把新的东西给它挤进来,填到这里来知道吗?就把原有的给它原有访问次数最少的给它干掉,干掉之后,把这个新的插到这里来,然后以便下一次访问的时候速度更快。明白TLB的作用了没有?各位明白之后,我们要去做实验了,我们要来体会一下跳B那么怎么体会呢?我在这里有一个例子,这个例子首先我先把意思给大家表达清楚,我先先申请,注意。两块内存对吧申请两块内存A和B对吧?A和B那么申请了两块内存,我们基本上的PTE和PTE的都不一样。分别先把A内存的PTE挂到零地址上,对吧?挂到0电子上,访问零地址对不对?访问一下零地址,把结果保存。在这个保存在一个变量里。好了,再把B内存的PT挂到。零地址。那么这样的话各位这样的话就是说我不同的就是我两个A和B内存也有两个变量,对吧?我先把A的卦页先给它挂一下,再访问访访问一下,把这个A之前的内存的结果保存在一个变量里。再把B内存挂到0地址上再访问一次,把它这个B内存的访问出来的结果放在另外一个变量里存起来。那如果我我这个两个变量的值相同,代表了有TLB,如果这两个值变量不同代表没有TLB这什么意?这我说这句话我再解释一下。因为首先大家思考一个问题,我把这个A内存的零地址挂在把A内存的这个PD挂在零地址上。我去访问了一下他,此时我的零地址是不是就挂在了TLB上了,各位。是吗?对不对?各位,因为我我第一次就挂进去了。我再把B里面的内容PTE挂到零地址上,我再访问一次。各位按照我们TE的原理来说。按照我们TLB的这个原理来说,各位我首先进来的时候,先是不拆的,先走一下TOB,我跳B能不能撞上。能吧?各位,因为我我已经在这里面访问过一次了。但是我各位,我您已经在这里了,您在这里了。属性也在这里了。这个访问过一次了。那你再来一次的时候,我依然访问了一次,他把这个物理验证给你各位,这个物理验证是谁的?兄弟们是A的还是B的?第二次访问的时候是A的,这里面保存贴好B是A的。但是我们原有的线性地址的那个是挂的一个B的PTE,是不是?因为我第二次是挂了B的,所以如果他俩所以说我保存的两个变量中的值是一样的,那么也就有TLB存在。如果保存的值不一样,那就没有TLB的存在,对不对?这个。我们要接下来要做的,听懂了没有?各位我意思表达清楚了没有?好了,听懂了,我们就干开工了。好了,我再打开一个。TLB不存CR3怎么知道是哪个信息地址的进程?首先跳这个没跳B的跟CR3的关系,就是你把CR31清一刷,跳B就没了。下一个进程在哪?也就是他永远存的是当前CR3的,除了那种机位的,等一下我们要做机位的那个除外。那你实验中肯定会切换进程。会啊会。那不会,他这个怎么说呢?我我是感觉上我是感觉上他其实在32位下是有这个东西的,但是他一直没有提过这个玩意,你知道吗?我不切换进程下。也是刷新的?所以这个只是一个缓存,你得快知道吧?你得快,你不能慢。你懂我意思不?你真的想用TLB,你想干很多的事情,那个是我跟你说不太准,不是那么容易的。说实话我没有看到过这种写写的hook的,这种也是at的work的这种有他妈的文不难平的知道吧?我是感觉我是感觉它这个32位内部,它是有这么一套类似CR3或者是PCID的这么一套东西的,知道吧?怎么保证我执行的,你可以调用指令去刷一下,你可以自己刷的。你可以刷线下地址的。知道吧?这个是你可以刷的,但我觉得它内部有类似的这样的东西的。但是你去查它这上面的文档,他没有,他在32位下是没给你提有这个东西的,他只提了6后面的64位下的CR3有那么一个PCID的这种机制。每一个ID它表示的表示的这个缓存,是它自己有的记录的缓存,也就不同的ID代表不同的缓存。但他没说是吧,我不敢下结论,你知道吧?这能理解吧,我也不敢下结论。但你的疑惑。好了,这里面的柠差1000。我们还是要提交的,是吧?这个地方,我们定义读写也行,因为我们没有不需要它可执行。好了,这是B。我在这里还有两个变量,比如说我这个变量叫type 1。这个是type 2好。好了,那么我星号A我也没有判断了。比如说我等于零零差1000,它等于零差1000。这个B等于零差2000对吧?好了,那么我这么复制完之后,在这个地方我们来一个暂停一下。还有一个,我得把他的地址A和B的地址打印出来。常规。等一下我改一下。把这一个去掉。这两天,好,A和B的地址我们打印出来。我们在在这把这个就是等一下我们调用门进去,我们把它的值给它打印出来。好,OK了,打印完之后还有我们还差一个函数,对吧?那我在这里我们定一个裸函数。DEC。2、test定一个函数。好在我们还有TF对吧?好了,先把这个架子搭好啊。这里我们FQ6。0X480。跳过去对吧?我们再打印,打印之后,在这个地方我们再给它暂停一下OK了。那么在这里面我们怎么来做呢?各位我们要挂业,是吧?各位首先各位,我们我在这里就没有去判断所谓的PDE和去没有判断它PDE,PDE是否有效。我也不需要去判断了它的PDE,只要拿PTE就可以了。因为您地址基本上也有PDE,所以我们暂时做实验,我就不考虑他有没有PDE去挂这种玩意了,知道吧?所以我们只要给他挂PTE就可以了。那么在这我们在进来之前,首先push AD push FD不不不不去破坏它的东西,put push这个炮火AD好了,我们push 0X30 top FS,在这里我也加一个to push 0X3B,返回的时候我顺便修复一下FS。好了,各位,那么在这儿我首先要拿的是A内存的PTE。所以我们首先不A开始A我首先把A地址拿到,拿到。我们要摸一下AKS左移,这个是左移吧?右移左移右移是吧?右移A开始九位。我们再把这个九位之后and。And AX0X7FFF8是吧?我看一下,我取他的PTE这个FTFF8应该没有错。老了,记不住了,偷窥一把是吧,让我看一下。就他了,我们进去这边是四个F。没有错。各位,是四个F对吧?是九位吧?是九位OK我们在这再加上所谓的AA盖茨,再加上零叉C000001刷2刷3刷、四刷一刷。好了,各位这就是我们获取PTE了,对吧?没有。对不对?然后获取到PTE之后,我们得取出来吧。比如说RC好了,那么IX对不对?RDX,这个RX加4对吧?取出它的高位和低位,这个没问题。各位取出它的,因为它有八字节,但是我们32位下没法表示八字节,指它的寄存器只有四字节,所以我们得取两个。好了,取完之后,我们再挂到零地址上,对吧?PDRDS,零叉,零地址不用想,各位这就是零地址知道吧?这就是零地址知道吧?零地址因为它是第一个PTE,对不对?所以它就是零地址。我们把这个EC开始挂进去,把这个加四的位置挂进去以第二个懂我意思吧?这样我们就把一给挂好了,挂好之后我们再来。录一下。PTR应该是0。好了,访问一下0,访问到零之后,我们在这个地方在type一把它保存起来。知道吧?各位我们就把它存起来。好,接着往下复制一个,这个是B,B也访问到这里,把type 2保存起来. 会宾没有问题,各位。先还是问你们一下,对吧?免得各位在这里一脸懵逼。有有难理解的吗?其实就是你如果立过的话,应该就是这一段,对吧?就是这一段,是不是?这个地方我倒是确实忘了他到底是取地址还是用不了。所以我们等一下蓝屏再说,对不对?好了。由于我们把它设置为设置为没有随机机制的,所以它的地址是固定的,应该是40100对吧?所以我们把它先跟这个给它定一下,00401C是吧?这后面是参数调用门,这是参数。然后后面跟着的这个参数,我们在0008,这个是100。你不明白这跟TLB有什么关系。刚才我问我问的时候你怎么不说话呢?好了,现在看这个实验,好吧。好了,这个是48。我先把它弄进去对吧?我们顺便在这个地方我不是没没说代码,刚才我问问你们意思听懂了没有你也不说,等一下我再说。把这个地方,我们把它的test e给它test的给它打印出来是吧?是太死了。好了,我编一下。来看这个我们也没有错,这个也没有错,对吧?都没有错。好了,我们访问一下各位看这个。看这里。这个地方我们从A中先挂了第一个零地址。各位我把这个先去了,我们再来回顾一下。我首先挂的是A的零地址,这个六二九没问题。然后我A的地址,A的值,这前四个字节是零,差1000,这个没有问题不?然后我再挂B的,把B的地址里面的PT指向到您地址上。然后我再取出来,再从零中拿一次,把它的结果放到二中。我B的地址这里是2000,那为什么我得到的结果各位请看。我得到的结果是这个结果,各位。而不是一千和2000。有有的有的,它这个东西它满了之后会超出的,知道吧?但是这个值它又特别,这个表它也不是那么小,能理解吧?他有一些甚至有四兆八兆知道吗?有一些CPU的缓存机,TLB的机,这个大小还有16兆的,你能明白不?各位。它不是那么的小,而且我这个东西,每一个盒都有一个。能理解吗?各位?就比如说火哥这个地方是四是八核的那我有八个,懂我意思吗?各位?就一个河有四个铁壁,每一个核都有四个铁壁,对吧?分IITLB和TDTLB。那么又又又分大小吧?所以每个核有4个TLB。各位就看你看你的这个,反正有一些大有一些CPU的这个就比如说一些服务器上的CPU,他那个不是那种计算型的,是不是?反正有很多种类型。他他的那种买的那种特定的,它有些贼大内存知道吧?但一般的来说,它也有个几百K是最小的,你也有64K,这个大大的一般有四兆,大叶通常这个大液TLB通常应该是四兆。那这个小的通常是,反正至少是啊64K那不小了。所以他这个你会感觉它就算切几个你会感觉他好像也不是那么的慢,不是那么的快,被切换出去。基于是这个原理好了,那我如何我们再来做个实验,我比如说我在这个地方刷一下了,我真正的自己去刷一下了。这个就是我们的CR3,知道吧?我写完之后,我就把CR3进行了自己的刷把自己的切刷一下。好了,各位我们再来走。各位当我刷了CR3之后,各位请看我正常的不?我正常了,这个值才是正常的,就是你的期望值,对不对?你的期望值这是。好了,各位,那当当这里面有一个机制,有一个机制,就是你刷CR3也没有用,什么机制呢?就是我们接下来要看的这个机位。切换进程不会导致整个tlp切清空,知道吧?因为它还受机位的影响,还有一些其他的影响。他只有把这种跟影响没有关的才会给你清掉。跟你跟有一些未控制影响有关的,他不会给你刷掉,除非你特定的指令给你刷。我接下来会介绍到好了这个机位,各位我们再来试一下这个机位,各位请看这上面的数字,它是第九位,第八位。各位来这一个第八位,对吧?0到8第九位差100。好了,我把这个机位给他补上。那假设我在这个位置,我在挂的时候,我还挺恶心,对吧?和一下。EC0差100,我还给挺恶心。我给你把鸡也给你挂一个,给你挂一个机位,你再刷CR3,再刷CR3,我们来看一下情况走你还有用吗?各位你再刷CR3还有用吗?当我把它设置成机位设置之后,你哪怕切CR3,它依然不会切TLB。这个填好病,基本上如果没有被填充满,并且访问次数还挺多的情况下,你已经不会被切切出去了。这个能理解吗?各位?我们需求就这样,我就想把你干掉,那怎么办呢?我就想切他,懂我意思吧?你我就想把这个地这个地址给他切一下,我现在刷CR3是没有用了,那我想真正的切它怎么办呢?有这么一个指令。有这么一个指令,刷信息地址,刷哪个信息地址的零号。我写错了吗?我看一下。D word写错了是吧?没错,是这个是我指令记错了,没有加DS吗?好了,没有加DS。我们现在再来看一下,走各位这个就叫指定的。注意,这个指定的指把PTLB的某一个线性地址给它刷下,给它去掉,这个能理解吗?各位?还有没有其他方式呢?有可以把整个机位全部刷掉,就带只要带机位的现这个页表这个页全部可以刷掉。这个就是我们明天要讲的,明天要讲的这个CR4,里面有一个位是控制这个机位到底要不要被刷新的一个去管理的全全局全局标志,知道吧?那里还有一个,这个指定的是刷某一条某一个信息地址,那这个是刷,注意切CR3刷新是刷没有空标志位影响的。稍后星期一,星期一,星期一。一下没记起来,是吧,每天睡得太晚,感觉睡傻了。好了,各位,咱们贴好币,我是给你们证明它是存在的。好了,各位有什么不理解的地方没有?还有。这个你可以理解为你可以理解为这个P进程的ID。你可以理解为类似的跟进程的ID是一个概念。知道也就是比如说它这个PCID是个一的话,它本来就是一个数字,12345678这种排序的就是一种这样的数字知道吧?那么如果你是一的话,二的话,三的话,就也就是当你是这个信息吧?与这个一组合,他如果是也就是首先是这个P你的PCID是一的话,那么你在这里面查找是找来确认是某一个知道吧?来确认是某一个这个页证虚拟页证。还有个作用,这个就是一个缓存作用,知道吧?这还是一个缓存作用,因为到了这个win 10上,在win 10后面有双页表的存在。TLB的这种缓存。这种缓存它又没法,你不可能说给把有的双页表跳B就完全的没有效果了。因为你双页表意思就是三环,你的R3有1个列表,这个CR3,那你的R零也有一个CR3。那么你的R你你的RR3进R0要切换一下20进退R3又要切换下,那么就来回切,那么你的TLB就一直是处于无效的状态,可以这么讲,所以他在后面我设计了一个PCID的东西,可能是一直都存在,但是他没有公布后面是给他公布出来的。在这里边就是保通过这一种技术来保证它双页表下不就只要是同一个进程,这个ID它在切换它自身的CR3的时候,不会把原有的这这这这一些给它刷掉,知道吧?懂我意思吧?各位,就远是同一个进程的,它不会刷掉,不然的话它就会有问题。好了,是有有这个函数,是这个函数我在。其实是有格式的,在这里面叫EXUZ local。是是一我来我我来看一下,我也忘了,记不住。没找着,这里面有。但他他不导出的,你得特征搜索知道你得特征搜索不导出的,它本质上就是一个mdl,可以用它来锁。我把他发过来。它锁完之后你得解锁,你得解锁,就是你你用完之后你得给他解锁掉,知道吧?这我再说一下,这个还有一个安安look UZ知道吧?对,他不是问我吗?如何把这个锁定页锁定锁定,他不是说锁定吗?这个就是锁定。还有的三环也有。对,你可以这么理解,三环也有一个函数,也可以锁页的。各位我给你们介绍一下,你就这个,我是local。知道在这个内核里面个。他不会给你映射,懂我意思吧,各位。是的,汉堡包是吧?他不会给你映射。像你刚才那个那个首页是用mdl来给你映射一个从其他的虚拟地址,把所有的物理页给它定住,然后这个是不会的,知道吧?他他是改这个页帧里面的这个改页帧里面的一些东西,导就是那个页帧数据库里面的一些东西,导把这个页永远不会交换到磁盘上去,用它锁住的话。但是各位这种锁业千万。我这么跟你说,有些游戏好像已经破案了,知道吧?你用这个锁的太频繁,他能把游戏给崩溃掉知道吗?不知道为什么,不要问我原理,他为什么能查出来你用这种来锁,他可能是查了查了一些查了一些属性,但是他能把自身给崩掉。我具体没搞清楚他为什么能把别人给崩掉,你说你能把别人给崩掉,自己不崩。他妈的我具体也没搞清楚,但是我知道有这个现象。好了,各位这个代码需要我发吗?各位这个代码需要我发吗?我感觉你们应该不需要,就自己抄一下是吧?差不多。他应该不是检测这个。不是MD首页这个不是MD首页,我说的是这个的,不是刚才那个MMDL首页。首页有什么用?你隐藏了内存才有,用处很大。你没有隐藏内存,那好像也感觉不到它有什么用,知道吧?他。会我会,我怎么我肯定我后面会讲,我讲区总会讲的。你知道我讲驱动会讲的。对吧这个是他既然问我,我就跟他说一下,我后面会讲的,知道吧?不用着急,着急是没有用的。因为你现在的水平就这个样,是吧?都是从从从浅入深,对不对?不可能上来就差很深。更多精彩内容关注下方公众号:逆向有你
个人微信:sumith
每日自动更新各类学习教程及工具下载合集
https://pan.quark.cn/s/874c74e8040e
还没有评论,来说两句吧...