00:00
好了啊,那我就正式开始了,我应该打不了几分钟的广告,所以请大家稍安勿躁,给我支持支持我哈,好了啊,那我们就正式开始了,我现在正式的介绍我自己一遍,我是吉安裕信安全研究院的小助理柠檬。我今天的任务就是来热场,然后顺便宣传一下公司也希望一会儿呢,大家积极互动,我感觉刚才就非常积极,大家。Four。好了啊,然后。我先来简单的介绍一下我们公司,我们的前身是瑞逆向工程学院,我们创建呢是2020年成立了北京吉安裕信科技有限公司,呃,中间的概况我就略过,不再介绍了。大家可以自己简单的看一眼。然后我们创建呢,原创课程超过了500节。
01:03
嗯,涉及到的是什么呢?是漏洞代码涉及到的,Sorry,涉及到的是恶意代码,漏洞游安全,内核安全和向工程这些方面,后续呢,我们也会在这个移动安全,物联网安全,还有呢,渗透测试这些方面推出精品课程,希望大家多多支持啊,我们平常的时候会在我们的这个微信号啊,就是公众号和服务号上分享一些技术文章,还有视频,有时候也会发布一些免费课程,还有就是进行我们的活动预告,所以请大家掏出你们的手机扫码关注一下。我给大家一点时间,大家赶紧扫,然后一会儿的时候呢,嗯,啊,当然了,加小助理也可以,我们每一个今天因为是在三个平台联播,每个平台都安排了一个小助理,呃,如果你需要加群,或者是有任何其他的问题,都可以直接联系到他们。
02:13
加我可以啊,但是我现在在直播,我得等一会儿才能回答大家的问题,因为今天我的任务是腾讯课堂。嗯,是这样的,左边的这个是订阅号,然后技术文章比较多,然后服务号上会有一些我们的活动,活动的预告,所以我建议大家都可以关注,然后我们也开了视频号。然后大家也可以扫一下视频号,到时候啊就可以就手关注一下视频号。嗯。好,那我就往后了啊,其实我今天的活超级少,我给自己减了好多任务,然后到下一部分就是我们今天的这个呃直播内容介绍,我们今天其实进行的是呃软件逆向工程方方面的直播,具体内容就是获客专题,然后明天的时候,也就是1月9号我们进行injec注入专题啊,如果大家有什么问题,或者是嗯,想对这个相关的具体的知识有所了解,或者说想试听我们公开课的,都欢迎大家来啊。好,然后下边我们来说一下今天讲课的老师,就是我们的刘莲老师,鼓鼓掌,鼓鼓掌,欢迎一下他。
03:26
给他营造一下感觉好啊,然后呢,他曾经就职于国内多家大型安全企业,名字不方便透露,你们应该都知道为什么,嗯,然后呢,也曾经担任过某个安全企业的技术总监,然后参与过多项国家级的这个安全项目,他还拥有一项专利技术,其实也有人他也有人找他写过书,但是因为时间和精力有限,所以就没有嗯系列的进行这个事。当然了,他也是看学讲师,并且也是各大专业论坛的啊,到处发帖的这么一个人儿吧,然后呢,擅是C加pyon编方擅长的比这可能多一些,因为在他家有四个书架的书啊,整整四个书架的书叹为观止啊,我觉得然后呢,他的研究方向是二进制漏洞啊,还有后边的这些我就不具体介绍了啊,然后最后我再来。
04:36
说一下啊,这是我们的那个微信群,然后如果大家想要在里讨交流或者是分享资料,可以扫码进群,然后下边是QQ不啊,我这映这个联系小助理,有的同学说听说榴莲流光头了,是的,但是头发已经长出来一点了,好了,那我今天的活就完了啊,五分钟我们就请刘莲老师来给我们开始正式上课了。
05:22
我就下线了啊,拜拜,下次再见。关门啊,好吧,到我了,是的啊,这个出其不意啊,换人了啊,到我了。哎,我来扭一扭我的凳子啊,然后咱们准备开始啊。
06:01
今天呢,咱们刚才也说了啊,主要讲这么三个东西啊,这还跑偏了呢,这怎么诶诶。嘿,然后今天呢,咱们来这个讲这么三部分啊,一部分是依赖户OOK,一部分it户OOK啊,一部分是理论上的无痕啊,这个玩意儿别人吹是无痕啊,但一会儿其实我会告诉大家,这个东西无痕不无痕的在于你自己啊,啊其实是并不是那么的这个有效啊好,那么我们就直接来开始咱们的这个课程啊,我们首先呢,来看这么一个程序啊,我在这儿写了一个小程序啊,就这么一个东西,这个玩意儿呢,我们一回车啊,它就会出现一个什么呢?出现一个弹框啊,然后标题是一个RKX,然后中间的内容呢,是一个test这么一个东西啊,然后我们点击确定啊,它就会结束啊,然后呢,我们的目的是什么呢?我们今天的目的呢,是把它这里边使用的API啊,进行一个OOK啊,首先呢,我们啊,因为这个是一个hook专题,我就不给大家解释什么东西是一个API的一个概念了啊,这是Windows编程相关的一个东西啊,需要一定的基础啊。
07:11
然后呢,我们现在呢,直接来看这个东西啊,我们右键啊,直接通过这个叉debug啊来给它进行一个分析啊,这个情况下呢,你可以使用两种方式来找到的,一个是什么呢?一个就是你去首先F9运行到程序空间,然后呢往里走啊,然后进入call啊,进入第二个call啊,然后呢,你在这儿找。找到他的这个。主函数,然后再进到最后一个call啊,这个再进去啊,这就是主函数了啊,这是第一种方式啊,然后呢,这个是根据它辨析规则来找主函数的,还有一种模式呢,就是什么呢?啊,我们就直接右键啊,然后搜索啊,找他字符串啊,这是很多这个大手子啊很喜欢的一种方式啊。这样啊,你直接啊看到这个玩意儿啊,也能找到,也能定位到它的功能啊是一样的,那当然这个不是重,不是我们今天的重点啊,我们重点是什么呢?我们首先要来看一下我们这个API里面啊,这个你看啊,它这里调用的是一个ma box a,我们首先进入到这个ma boxx a里面啊,我们进去,进去之后啊,我们首先看到是这么样的一个汇编代码啊,从这个木EDIEDI进去,然后呢,从这个return啊结束,这个呢,就是我们这个ma boxx a,它的第一层的一个汇编实现,那么我们这个hook呢,分为很多种方法,那我们要讲的第一种hook,也就是我们所谓的依赖hook呢,是基于一种什么样的实现呢?就是基于它这几个部分啊,首先呢,我们这里呢,可以了解一个原理啊,就是我们在正常的使用一个A的时,它么进行实现的,我们正常调用,比如说我们调用的就是这个A啊,那这个时候你在这个写了一个啊,写了一个,比如说写了一个A,一个调用,那么这个时候。
08:54
停到这里边来啊,然后执行返回,返回之后呢,再回到你正常代码继续走,那也就是说呢,它在执行这条这个里边的时候,跟你调用正常的函数没有区别,它也会执行这些东西,那我们赖OOK的原则是什么呢?就是把它这里啊这里啊进行替换啊,把它的应变码进行替换,替换成我们想要的东西,比如说我们现在呢,它的前面的编码是什么呢?是8B5BE这一个码,它的这个码就是木EDIEDIE,然后呢,木这个EP啊,正好五个这个,呃,五个五个这个硬编码,那这五个硬编码呢,其实可以对它进行一个替换,替换成什么呢?就是我们的这个jump占啊叭,如占到12345678啊,占到这种地方,那大家想一想啊,我们的地址啊,我们的地址12345678啊,刚好替掉了这个四个硬编码,而我们的占在硬编码里,它是一九啊,一九就一个硬编码,然后。
09:54
那我们这个时候呢,在硬编码里,实际上就是这个情况啊,一九,然后呢,后边跟地址啊,这个意思能不能理解啊,就是这个情况,那我们实际上而言呢,就把它的前五个字节给替换了,大家想一想,一个状态啊,就是当你调用这个函数的时候,首先你会到这个地址上来,就是768134D0这个地址上来,因为它会调用到这里来,继续进行一个执行,那么当这个时候它执行到这的时候,如果它是原来的硬编码,它就会往下执行,但是如果你被它替换成jump了,那这个时候就jump跳到jump上的地址去执行啊,那jump到哪呢?就这个你就可以自己提供一个API啊,提供一个这个接口,或者说提供一个函数给跳啊给跳,这种情况下你就可以跳到自己的函数内去,然后执行完了之后呢,你想让回来你就再调用一下啊,你不想当让他回来,你直接飞了就完事儿了啊,这个就跳到自己的这个位置上去,那自己的位置怎么来定位呢?这个时候呢,就提到一个地址的问题了,那么这个。
10:54
地址呢,实际上是要在计算一个相对地址啊,它不是绝对地址,它是相对地址,这个相对地址呢,它的公式啊,大家先不用在乎啊,它这个东西公式怎么得来的,先记住这个公式啊,你这节课,这节课我们是互个专题,你先记住它怎么用,然后再理解它是怎么来的,那么我们怎么用呢?就是目标的啊,目标的函数地址减去啊,减去自己这个需要hook的函数地址,然后再减去五,这五是指令长度啊,这五是指令长度啊,这个是随着你替换的指令长度替换的,这个呢,就是它的一个基本公式得出来你所要跳转的一个位置啊。
11:35
好,那么我们正常情况下啊,理论上依赖客的一个理论就是这样了,那我们就来实践一下啊,实践一下我们首先打开一个这个程序啊,不是打开一个项目。首先啊,我们新建一个项目。然后呢,我们创建一个动态链接库啊,我们可以创建空项目,也可以直接创建一个动态链接库啊,这就随便了啊,点击确定。
12:13
好,然后呢,我们先把它这个系统带的这些乱七八糟东西一删啊。然后在我们应该这边吧,这个叫。啊,我们把预编译头啊,我们把预编译头换成不使用预编译头,然后呢,预处理器呃,不用改了,代码生成啊,我们改一下这个,呃,Mdd改一下MTD啊相当于一个静态编译,然后把这个缓解关掉啊。因为我没有下环境库啊,点击应用点击确定。好,然后这样就可以了,然后我们把它自带的这些头文件啊都给删掉。
13:08
好,那接下来呢,我们开始写它的一个这个实现代码,就是依赖OOK是一个如何实现的,那首先呢,我们肯定是要给它写一个OOK函数啊啊,它的返回值呢,就是一个布尔值,判断的呢,就是它到底是成功与否啊,如果成功了呢,就是true,如果不成功呢,就是一个这个false啊然后呢,我们现在呢啊来给大家写一个这个hook的相关的一个函数,然后呢,它需要几个参数,首先啊,你需要hook的这个函数位于哪一个模块里啊,我们这种API或者说其他导入的它都位于某一个模块里,是它自己的这个啊,也有可能是于它的的个主模里,所以你要给提供一个呃模块的一个啊。然后呢,我们还要提供一个你要的函数的函数名。
14:08
最后呢,你要把自己啊,要提供给他的,要劫持过来之后,执行了自己的函数的一个函数地址也提供给他。好,然后呢,我们就开始进来实现啊,那你进来之后,你首先啊,干的第一件事就是什么呢?就是获取啊。获取指定模块中。指定函数的地址啊,获取指定模块中指定函数的地址,那我们指定模块名在这儿啊,指定函数模名在这儿啊,我们现在呢,就可以来这个获取了,那么我们现在啊就来获取它啊,首先怎么获取呢?我们这里呢,调用一个Windows的一个这个API啊,首先调用的是这个get啊。
15:11
PLC address,然后呢,它的两个参数,第一个参数呢,是要你获取的啊,获取的这个函数是位于哪一个模块里的,这个呢,我们就可以直接调用一个get啊get。Handle a。然后呢,我现在呢,就可以怎么样呢?我传一个传一个什么呢?传一个它的模块名,把模块名传进去,传进去之后啊,我继续我就可以干嘛呢?第二个就是你要找的这个函数,函数名是什么啊,我这里函数名传进来完事了,完事儿之后呢,我们可以F12看一下这个函数啊,它的一个说明,它的说明呢,返回的呢,实际上就是相当于一个函数的一个地址,但这个地址呢,你需要干嘛呢?需要自己转换,转换成你想要的一个这个呃地址类型啊,那我们现在呢,我们可以通过一个全局变量啊,来对它进行一个保存啊。
16:08
好,我们用它来对它进行一个接收,但是这个之间呢,它存在的一定的不一样啊,就是它这个类型呢,和刚才类型呢,有一一定的可能啊,不是完全的可能,可能会有一定的问题啊,你可以给它进行一个强制转换,但是呢,也可能不出问题,不强制转换也行啊,这个呢,根据你的实际情况决定要不要进行强制转换啊,然后呢,我们获取到了这个它的这个指定函数的一个函数地址,那就相当于什么呢?相当于我们现在呢,已经到了这个位置上了,我们已经找到了768134D0的这个东西了,那么我们现在呢,就要把它前五个字节给替换了,但是因为我们要替换的,所以我们要先把它怎么样这五个字节保存起来,否则我们就没有办法对它进行一个还原了,对不对,所以说呢,我们要先对它进行一个保存,那我们要保存呢和这个hook呢,我们需要两个这个五个字节对不对?保存它需要五个字节,这个替换它也需要一个五个字节,那我们就给它进行一个什么呢。
17:08
进行一个数组啊,用数组来对它进行一个保存。啊,老的五个字节呢,我们对它进行一个保存。然后呢,新的五个字节呢,我们对它呢,进行一个构造,我们构造的是什么东西呢?一会儿大家知道啊,就是实际上就是跳到我们这个指定位置的一个这个指令啊好,那我们现在呢,已经有了,有了之后呢,我们首先干第一件事儿,就是保存函数的头五个字节。这个呢,就方便我们啊,还原它,还原它。保存到这个里边来啊,那我们要保存它,肯定是要读取它,但是因为我们是动态链接库,实际上我们已经注入到目标体内了,所以这时候我们有两个选择,一个选择呢是用,还有一个选择呢,是用这个API,但是我选择用A,为什么呢?因为如果是字节直接便,但是因为它比较长啊,是五个字节啊,那我不如直接用API啊,想读是一个字节,读几个字节啊,Read press memory啊,然后read press memory呢,它第一个参数呢,就是你要提供一个进程的一个句柄,但是因为我们已经注入进去了啊,我们是一个动态链接库,所以说呢,我们获取一下本进程的句句柄就可以了。
18:37
获取完之后呢,我们下一个啊,就是你要这个去哪里读取啊,那我们肯定要去这个函数的这个位置上读取,对不对,那么函数的地址我们已经获取到了啊,我们就直接使用就行了,去函数这里读读取,然后把这个东西存在哪,这个函参数呢,就是它的buffer,那我们要存到什么呢?存到我们的olds里啊到这儿,然后呢,读多长啊,提供五个字节就可以了啊最后一个参数呢,它的目的呢,是给你一个实际上的返回判断,你到底读了啊,读了几个字节回来啊,那这个呢,用一个door啊来存储就可以。
19:19
然后你需要把它啊作为一个地址啊,取个地址传进去啊,然后由系统给你填充好,这样呢,我们就去完成了一个读取啊,这个时候如果你需要判断一下的情况下,你就在这儿啊给它进行一个判断,它的返回值实际上是一个布尔值,然后如果说啊,你可以判断一下它失败了。如果他失败了啊,那这个时候呢,你就可以直接return一个false。如果他成功了呢,你就不需要啊,你就不需要管它,你直接往下一步走就行了,走的情况下是什么呢?实际上你就要造一个新的五个字节,然后呢,把这五个字节对它进行一个替换啊,进行一个替换,那么此时我们应该怎么做呢?我们就直接啊构造一下,首先第一个字节,毋庸字节肯定是一个站吧,对不对,我们这里要构造什么呢?
20:14
构造啊,Jump jump rice这么一个情况啊,那么jump它就是一九,那所以说呢,我们它的第个啊,第个元素那必然就是一九。后边呢,跟的是什么呢?后边四四个字节呢,就是什么呢?就是你的这个地址啊,也可以说是你的偏移啊,因为刚才也说了,我们这个不是一个绝对地址,是算出来的一个偏移啊,那我们现在呢,就要对它进行一个这个计算,那么首先呢,我们这个计算啊,我们后边这四个字节,因为它是一个这个后边还剩四个字节刚好是什么呢?刚好是一个底的啊,那我们这个数组啊,我们用这个数组啊,这个数组的这个名字呢,相当相当于它的首地址,我们把它加一,那就实际上就是移到了它这个所这个下标一的这个位置上,我们把它圈起来。
21:14
圈起来之后干嘛呢?对它呢,进行一个类型的一个强转换啊,用一个ord星啊,强转成or星类型,那此时这个块里就相当于一个ord了,那我们现在呢,就可以直接给它进行一个赋值了,但是还不行,为什么呢?现在我们只是强转了,然后我们如果要它是地址啊,现在我们要把它取出值啊,再加一个星,把它值取出来进行改写,然后呢,我们此时改写的要什么呢?首先我们要改写的计算公式,第一个目标的函数地址啊,是不是这个我们目标的函数地址,然后呢,减去什么呢?减去我们当前的函数的函数地址,然后干嘛呢?再减去指令啊,这么样就计算出来了,但是这两个它的类型有点问题,我们需要进行产生转换,转换成什么?
22:08
好,那么我们现在呢,就已经啊,给他这个搞上了,搞上了之后呢,我们这个就已经啊,构造完新的五个字节了,构造完新的五个字节之后,实际上我们就把它写到这儿去就行了,对不对啊,所以说呢,我们现在呢,就要进行写的一个操作,写的操作跟读的操作一样啊,我们可以用指针,也可以用这个API,当然了,我还是觉得啊,我的API用着更舒服啊,更方便啊,我就用API了,我这个呢,就调用一个process memory。啊,它的它们俩的参数呢,基本上没有太大的区别,第一个呢,还是一个进程的一个这个句柄。第二个呢,就是它的一个函数地址啊,要写到哪去嘛,我们还是写到这个位置上,然后呢,新这个新这个是八位什么要写过去的东西啊,我们就把新的五个字节啊给它放过去,放过去之后呢,我们要写多长,写五个字节,然后呢,我们还需要一个啊,具体写过去多少的一个,返回1WORD。
23:16
嗯,DW啊。好,这样就可以了啊,这个这一步呢,我们再给他写一个注释啊,这是第四步写入啊,构造好的五个字节啊,好,然后呢,我们还是可以对它啊进行一个判断,如果说我们返回失败了,那说明出现了问题啊,我们直接return。给他一个boss。然后如果不是这种情况呢,我们可以干嘛呢?我们可以直接啊return一个true啊,因为到这一步实际上就已经成功了啊,因为如果说写过去没有问题,而又没有false的情况下,我们就应该一个了啊,这里就应该已经可以了,没有问了,我们的呢,实际上到这一呢就已经啊成功了,那么我们这是OOK,但是我们啊想一个问题啊,如果说我们这样就直接OOK之后,那我们是不是每一次调用的时候都会到我们自己函数里,那我们想要调用流程怎么办啊,就是我还想要调用它这个过程怎么办?那是不是我们还要给它还原回去,以及以及做一些其他的事情,那我们要还原回去呢?实际上啊就需要两步啊,我们正常情况下,我们把这个东西替换回原来的老的五个字节,就是相当于把这个户客卸载了,但是我们如果说还想就是在执行完他的原来的直,呃是直播啊,是直播啊,你这个呃,我能看见啊,然后如果说他这个东西啊,是这个我刚才想说到哪来着你。
24:55
我都忘了啊,那个如如果说是我们要把它卸载之后啊,我们要把它再还原回去啊,还想继续勾它,那这时候我们要把这个勾子重新挂回去,因此呢,我们还需要两个函数啊。
25:12
一个呢,就是我们要一个卸载函数啊,就是我们在必要的时候把它卸载掉,然后进行这个原来的流程的一个执行啊,那这个就是一个卸载函数。哎,上面说什么毛病了。啊,没问题啊,这个东西呃,On hook on hook啊,就不需要什么参数啊,我们直接写就行了,UN hook怎么样呢?我刚才也说了啊,实际上UN hook就是把你这个东西啊老的这个五个字节啊给替换回去啊替换回去但是呢,需要注意一下什么呢?你必须要判断一下啊,你这个函数有没有效,因为你这函数无效的情况下,实际上你没有进行hook啊,你就没有必要卸载hook,一定要这个东西呢,是不等于零的情况下啊,函数地址不等于零的情况下,你才是已经获取过函数地址了啊,已经获取过函数地址了,然后呢,现在呢,我们就可以干嘛呢?我们就可以直接啊对它进行一个替换了,那替换的过程呢,实际上就是我们在这里啊进行了什么呢?进行了写入操作啊,我们直接复制过来,但是啊,需要注意的一点是什么呢?就是我们这个写入操作,写入的不是新的五个字节,而是老的五个字节啊构造好的老字,老的五个字节替换回去就把它卸载了,然后呢,我们现在这个东西搞完之后呢。
26:25
那我们还需要一个,就是如果我们需要把它重新挂上啊,我们还需要一个。那跟刚才没有什么区别啊,Reook嘛,其实呢,就是判断一下,如果我们这个已经OOK过了,我们就把这个新的五个字节啊重新挂回去啊,就不相当于reook嘛啊那这个呢,就是基本上的我们的这个呃,Hook的一个基本代码就写完了,写完之后呢,我们这里呢啊,就要来真实的进行给它进行一个OOK了,那我们如何进行OOK呢?首先呢,就是我们要找一个OOK的这个API,那我们现在要的API呢,就是我们刚才这个测试的这个东西啊,就是这个box a啊那我们这里呢,可以直接找一个函数,在函数内呢写一下这个box,然后呢,我们直接F12啊进来之后呢,就能拿到它的函数原型,注意注意啊,这个when user API的这个宏不要复制进来啊,它复制进来有时候会出现一些问题啊,那我们把它复制过来,复制过来之后呢,我们就可以在底下啊,做成一个什么呢?做成一个这个我们的互函数啊,把这个去掉啊,然后直接。
27:32
这样这个函数呢,我们需要给他改一个名字啊,比如说是my box a啊,这样就可以了,然后呢,我们在里头呢,可以做点事情啊,比如说我进来之后,我啥也不想干,我就想给他改一个参数,让他重新弹出去,那这个时候行不行呢?没问题,你首先啊,用一个on hook把他的这个OOK掉。啊,我这写错位置啊,我这hook写底下了,我首先用一个on hook把它的hook摘掉啊,替换成这个我们原来的流程嘛,我们所以我们要把这个on hook先执行一下,执行完之后呢,之后呢,我想重新挂钩啊,我就给他写一个什么呢,写一个OOK。
28:08
在中间呢,我干嘛呢,我调用它原有的流程啊,我直接调用这个box a啊,这样就行了啊,比如说我现在呢,第一个啊,第一个我的这个句柄啊,我继承啊,我继承的这个调用,然后呢,但是无论他原来想谈什么,我现在呢,都要干嘛呢,都要给他替换成我自己的。啊,然后呢,按钮呢,我还是继承啊,就这样就可以了,然后呢,我调用了原来的这个流程,我执行完之后呢,再把它重新挂上勾,下一次呢,他还是会被截到我这来啊就这么一个流程,好,那么接下来呢,我们就来写他的这个第二啊,首先我还是需要几个break啊,如果这几个break不写呢,会出现一定的问题啊。呃,有回音了。
29:00
哎,咋会有回音呢?现在还有吗?突然有的,啥也没变呢,他咋会突然有回音呢?这什么毛病啊?喂喂喂。还有吗?还有吗?B站这边还有回音吗?哎,奇怪。
30:07
他啥东西会造成婚姻呢?喂喂喂。回音,回音大吗?影响吗?啊,不影响就先这样啊,先这样啊,我也不知道什么情况啊,然后呢,我们继续啊,我们要这个写这个hook嘛,我们就要在它主函数来对它进行调用嘛,我们先把这三个全局变量进行一个初始化啊。
31:10
好,那我们现在呢,就对它进行初始化完事了啊,接接着呢,我们就要调用我们的这个互函数啊。三个参数,第一个参数啊,你的这个动态链接库啊,这个呢,我们可以直接写啊,但是如果大家不知道它这个是基于什么动态连接库呢,其实呢,可以写一下这个函数。麦bos a啊,然后F1一下。好,然后你就可以看到啊,这是它的MSN的一个介绍啊,然后呢,你可以在最下边啊找到什么呢?找到它的这个呃位置啊,你可以看到它实际上就位于什么呢?u432.d里啊,那你就可以直接把这个u432.d给它复制过来,然后呢,填到你的户的第一个参数里,没有问题。
32:18
这个U32也不知道大写小写啊,应该不影响啊,我们来接着写啊,然后第二个啊是boxx a啊,就是它的一个函数名。然后呢,就是你要呼到哪去啊,呼OOK到我自己的函数里去啊,就这个啊,那我们就把它的函数名啊给它放在这儿,然后强制转换一下啊。PC啊,这样就行了。好,然后呢,我们我们这样之后呢,我们就已经完成了我们的户的操作啊,那我们重新生成一下,然后测试一下啊。
33:04
呃,必须返回一个值啊,这需要返回一个值,我给他一下啊。这个值呢,我可以调用它原流程的一个返回值啊,它原流程返回值应该就是看一下应该就是一个int啊,那我们就用这个来确定啊,它的返回值实际上就是按钮到底按了什么啊,那我现在用一个返回来接收一下,然后把它掉。好,然后重新生成。好看,这回其实就是成功了啊,然后我们首先把它拿出来。放这儿啊。16啊,把15和14删了,然后呢,我们打开这个正常的啊,我们先看一下它正常弹出是什么样的。看没头是RK里是T。我们把新打。
34:05
我们随便打开一个注入器啊,用自己的和用其他人的都行啊,然后我们直接啊给他以管理员身份打开。注入我们的动态链接库啊。回车,诶,你看他的头和内容都变成了我们的瑞,这个是我们自己改的啊,刚才他的第一次的内容是不是这样的,说明什么呢?说明我们这种方法已经成功了,那么这个呢,就是我们今天的第一种方式啊,依赖啊,那我们这个第一种方式讲完了吗?没讲完啊,这是依赖顾客的一种常规操作套路啊,常规操作套路啊,那么他还有一些比较特殊的操作套路啊,啊那么什么特殊的操作套路呢?我先把我的这个东西呢,我给他保存一份啊,先保存一份。
35:01
然后如果需要这种代码的啊,可以事后啊加咱们的群,然后呢,进行这个代码的获取啊,然后呢,我们现在呢,这是hook依赖hook之后呢,我们有一种特殊的依赖hook啊,就是。什么呢?就是一种叫做热补丁的户OOK,什么叫热补丁呢?就是我们我们这里呢,现在的这种状况呢,我们是干嘛呢?我们每一次调用它的时候,实际上都是怎么样的,都需要先把它卸载,然后再把重新替换回去,这样呢,就其实呢,就是已经有了两次啊两次它替换操作,每一次调用都有两次替换操作,实际上效率不高啊,那这种情况下呢,我们其实有一个更好的一个解决方案,就是什么呢?使用一种啊一种方式叫热补丁的方式,这种方式呢,其实是微软给我们提供的一种方法啊,然后呢,我们就可以直接用啊,那我们这个东西呢,首先我们看一下他投这里有一句指令叫8BFF叫木个东,实上这不存在任何的影响,不存任何影响,所以如果我们用个字完成这个hook啊,那其实呢,我们就可以干嘛呢,我们可以在这个执行的时候,直接从后边开始,就从五五开始执行,而不要前两个字节了啊,那这样呢,其实就。
36:15
是比较舒服。那我们怎么能做到这件事儿呢?这呢我们就要来实际上给大家演示一下啊,比如说我们这是8BF啊,那我们可以给进行一个编辑啊,我们给替换成什么东西呢?替换成EBF9。点击确定,这个呢,你看它就变成了一个短跳啊,这跳到哪去了?Jump u332里的这个768134CB,那这个是在这儿啊,你看到跳到这个位置上,跳到这个位置上,实际而言它对底下你看一个C息,两个信息,三个信息,四个C息,五个C息刚好五个字节,这其实就是一个五个字节,这个短跳跳到上方五个字节处,那么我们这五个字节刚刚好啊,能完成什么呢?能完成我们的一个正常的依赖的那个跳转对不对,那我们就可以把上边五个字节给它替换成一个,然后跳走,而不影响其他东西,对不对,然后呢,我们底下还可以正常执行,完全不需要给它摘摘掉这个户口,所以说呢,我们可以这样来实现一下啊,稍等喝口水。
37:31
然后呢,我们现在呢,就可以干嘛呢,我们就可以来这个。编写一下啊,编写一下,那么我们这个方法呢,是个方法呢,理论上而言啊,我们在这方面啊,这方面呢,就不需要什么呢,就不需要这个,呃,不需要改动了啊,就是我们还是需要一个模块名,一个模块,呃,还有需要一个函数,还是这三个东西啊,但是呢,我们内部的写法呢,就不太一样了啊,我们先把内部清空。
38:00
然后首先啊,我们这里,我们首先需要一个两个字节的一个短跳代码。就是我们刚才写的啊,短跳的0XEB。0XF9啊这两个短片,然后下边呢,就是一个正常的一个跳转。这个为什么不要不需要写全局变量了呢?这个是因为我们完全是不需要这个给他往回替换了啊,所以说我们直接跳两个格,我们就能正常执行了,我们就不需要给这个替换回老的代码了,所呢也就不需要那么做了。这是五个字节啊,我们直接把一九给它放进去,然后呢,我们接下来呢,我们先干一件事,就是还是获取到我们的这个函数的一个地址啊。
39:22
还是调用刚才那个函数啊啊。I,嗯。啊,前面写错了,好,然后呢这呢给他强转一下啊。第一个参数啊,第一个参数还是啊盖特摩托哈诺。第二个参数函数名。好,获取到,获取到完事之后呢,我们现在要干什么呢?我们要改变这个位置原有的一个保护属性啊,这个呢,保属性呢,我们要改改多长呢?要改这两个字节,加上上面这五个字节啊,一共七个字节长度的这个保护属性啊,那我们现在就来改一下啊,然后是错。
40:19
嗯,Protect protect啊,然后第一个是。呃,我们首先呢,是要一个位置啊,我们我们要改变的位置,首先是我们这个头啊,就函数头这个位置减五的位置啊,就是把它上边啊,从上边开始数往下的起一个,所以说是函数减五,然后往下起一个,那我们就是拿到函数。拿到函数头,然后减五啊减五这儿呢,因为它是一个前面那个类型的,所以说呢,我们要给它改成divor的一个类型,然后改成divord类型之呃,强转成底类型之后呢,我们还需要给它转换一下啊,类型不符,所以说呢,需要类型强转换,呃,我看一下这里是。
41:13
啊成转换还有皮word啊,这样就对了啊,然后地址有了,地址有了之后,第二个就是你改变这个属性有多长啊,改个字节啊,改个字节啊,然后呢,改成什么属性啊,这个属性呢,我们就给它改成可读可写,可不是对可读可写可执行啊。啊,可读可可执行改成之后呢,我们还需要干嘛呢,还需要把它原来的属性呢,给它进行一个保存。这个呢,方便一会儿我们把它的宝物属性呢,给它进行原始的一个替换回去啊,所以说呢,我们现在呢,把它的原始属性呢,给它进行一个保存保存啊,然后呢,我们在最后的时候呢,我们要替换回去,我们现在直接给他写一下。
42:05
啊,这样就替换回去了啊,然后呢,我们代码呢,加这两个东西中间写啊中间写,那我们在中间做的事情呢,实际上呢,就是对他的进行一个,嗯,可以说是进行一个替换啊,进行一个这个字节的替换,跟刚才没什么本质上的一个区别,那首先呢,我们还是要定位一个地址啊,然后来计算一下。计算一下偏移啊。D wa等于等于我们目标函数啊,目标函数。减去啊,减去我们当前的这个函数地址。我们先把这个位置啊,这个偏移给计算出来。
43:00
照个呢这个。那我们跟刚才一样啊,还是使用一个这个底的转的方式给它来一起啊,我们就是这个纽扣的。New new扣加上一啊加上一就是后边不正好四个字节嘛,然后呢,用一个D啊星对它进行强转,然后再取出来,就可以对它进行的值的一个改变了,现在呢,我们就可以给它改变了,改变之后啊给它写什么呢?写刚才计算出来这个地址啊就可以了,可以完之后呢,我们现在呢,就已经构造完之后,构造完这个字节了,然后干什么呢?然后呢,我们进行一个拷贝啊,要拷贝部分,一个呢是把这个短跳拷贝到我们函数开始的两个字节上,一个是把长跳改到我们上面这五个字节上啊这么两个部分好,那么现在呢,我们就进行一个一次的一个拷贝啊,就是我们可以直接用一个memory copy啊进行一个拷贝,因为我们已经注入到它的内部了,所以可以直接拷啊。
44:06
嗯,我们拷贝的位置就是我找一下啊,刚才写来着,这儿呢啊这儿呢,就改变属性这个啊。首先是这个,然后呢,我们这块要写的是他的纽扣,就是它上面五个字节写的是他的纽扣。五个字节,然后呢,我们再写一个memory copy,这回呢是考的两个字节,这回考的呢是我们的这个目标函数的old code这个,呃,不是old这个啊,这个,然后呢写两个字节,写什么呢?写我们短。两个字节啊够使好这样呢,我们就给它都拷过去了啊,考完之后我们把这个属性给改回来,改回来完事之后呢,我们直接return一个处啊判断一下我们是已经成功完事了,好,那这个呢,就是它的一个这个hook,那这个hook是这样的,那on hook呢,就跟刚才有点不一样啊,我们这个hook也是一样的,我们要给它替换掉,那怎么去做一个这个on hook呢?
45:10
我们把这个代码先复制过来。啊,原名让它复制过来,那怎么做呢?啊,这个on hook也需要你提供上边那些东西啊,也需要提供什么呢?我们的这个函数名啊函数名。和函数的这个模块名。然后呢,我们现在呢,需要这两个东西获取完之后啊,我们现在要干嘛呢,我们就不需要去这个我想啊。嗯,我想想这个需要是。我这好像不太对啊,我先我先把这底下啊分开,然后咱们一行一行对,看看它是不是一样写啊,我们首先要获取它的旧的函数地址,但上面这个短跳啊,短跳我们要给他改回去啊,改回什么呢?改回它原始的东西啊,原始的东西不知道大家还记不记得啊,我们给他改回来啊。
46:01
编辑啊,他原来是什么东西,原来不是18F9啊,原来实际上是8B啊。看啊,木屋EDIEDI啊,然后所以说呢,我们要把它替换回去这两个字节啊,那所以说呢,我们这是8B8B。啊,然后呢,底下这个啊,这五个字节啊,你就完全不需要给它替换成原来的这个CC了啊,你给它替换成九零就行啊,就是noe。好,然后呢,我们就可以获取它的这个函数地址了,获取完函数地址之后呢,我们对它的内存属性啊进行一个修改啊,这块都没有问题,修改完啊修改后啊,那么就是中间的问题了,中间我们给他。想啊,中间我们给拷贝一下,拷贝到我们的这个。
47:02
减五的位置上啊,给它替换成什么呢?替换成我们的这个,呃,新的扣的,然后呢,这个位置上给它替换成我们的这个短片。嗯,对啊,那这个新的扣子不需要获取是因为啊,我们这块给它删掉就行了,我们直接两个拷贝啊,这块我们不需要给他构造,所以两个拷贝就行了啊,给他直接拷贝过去,然后直接一个这样啊,这儿就不需要return了,这样就卸载完了,好,那么我们这个卸载完之后呢,我们接下来呢,还需要给他构造一下它的这个,嗯,构造一下它的这个hook函数嘛,那我们这儿呢,就不需要on hook了。但是我们这儿呢,还是需要一个,需要另一个东西啊,怎么需要另一个东西呢?因为我们如果现在直接去它,它直接调用它,它还是回到原来的位置上,我们现在要干嘛呢?我们要从它加二的位置上开始执行,那如果想要从它加二的位置上开始执行呢,你实际上就需要一个函数指针啊,那我们现在呢,就来复制它一下。
48:00
我们在它上面呢,我们构造一个函数指针啊,我们用一个type。好,然后呢,我们用这个函数针啊,在这儿呢,构造一个这个我们的对象。它等于什么呢?等于我们的这个我们的box这个函数啊,加二的这个位置啊,但是呢,这个你不能直接这么写上,你要给它进行一个类型传输转换啊,你要把它的函数D函数名转换成底沃的类型,然后加二,加二之后呢,它就处它就处于这个五五这个位置上了,让它从五五开始执行,然后呢,你在前面呢,给它转换成你的这个含水针的类型,然后进行接收,嗯,这是怎么出问题的,我看一下。嗯,太。
49:01
啊,这啊。Win API方案。没问题了啊,应该是没问题。诶。这什么毛病?啊,括号写错了。好,这回没问题了啊,然后我们直接啊,这回新调用,我们就用我们构造构造的这个函数值来进行调用啊就可以了。好,这样就完事了啊,我们就试一下,然后我们在这边呢,在这个调用里呢,还需要给它进行一个替换啊,我们hook这里啊,没有什么区别,还是这样调用,但我们on hook那里呢,就需要在它的函数卸载这里啊,进行一个on hook。
50:05
在这里进行一个on hook啊,它就不需要第三个函数啊,它需要前两个。嗯,我这户我是on户口。嗯,没有on吗?好,然后重新生成啊。好,我们放到桌面上啊。我们运行一下,然后我们注入。
51:01
嗯。崩了。输入失败。不对劲啊,这有点问题啊,我看一下。
52:00
稍等啊。哎。
53:13
稍等啊稍等你们,你们太吵了,我天。好了。我重新试一下啊。这微信咔咔弹,我终于给他把声关了,我的天。
54:04
出问题了啊,咱们看一下。EBF9F90啊没问题。获取。歼五七可读可写,可执行旧的保护属性。然后地址啊减。啊,这写错了啊,目标函数减啊。
55:24
好可以啊,我们已经护成功了,好,这个呢,就是热补丁方式啊,也是一种类似于依赖hook啊,给他进行了一个hook。好保存一下这个代码。好,然后呢,我们这两种讲完之后呢,我们就来讲一个新的方式进行户OOK啊,那么我们这个hook呢,实际上还有还有还有一种方式啊,不是还有种一种啊,还有很多种方式啊,我们首先把这个先关掉啊,这种呢就不是基于它这个代码了,而是基于什么呢?而是基于其他方式了啊,我们首先来看一下我们的这个啊PE结构啊。
56:19
它P结构里,在数据目录表里呢,有一个叫导入表的东西啊,这个导入表呢,就是你你在函数里用的动态链接库,以及它导入的这个函数啊,给你显示出来,比如说我们这有一个uc2.dr,然后有一个这个我们的ma box啊,那你像是你这个东西呢,这个导入表里呢,你存的时候呢,实际上有三个东西啊,三个类似于子表的东西,你像是这个序号表啊,函数表和函数地址表,那我们这种it的方式,It指的是什么?实际上就是导入地址表,那我们这个导入地址呢,实际上就是你在调用的时候,你这个东西去这个动态链接库的哪一个位置寻找你这个函数,那我们只要把这个东西所替换掉,那么你就干嘛呢,完成了你的,那我们这种方法呢,就是基于这个的啊,基于这种PE模式的,那么我们来尝试一下。
57:07
呃,我们这回还是。还是人还是留着啊,然后上边这个hook on hook。我就不写hook了啊,我们就写一个hook。库呢,我们也不需要参数啊,因为我们是基于P结构的,所以说里头也不需要参数啊。然后呢,我们现在呢,就来直接来做这件事儿啊,首先第一件事儿啊,我们是要获取这个,哎,不对,也需要参数啊,我这个疏忽了啊,大意了。目标函数需不需要我想想啊?我先先放在这儿吧,我管他需不需要先放在这儿啊,然后呢,首先啊,我们还是要获取一下它的这个函数地址啊,老的这个函数地址,然后我把这两个东西我先放上边。首先呢,我需要一个这个旧的这个函数的函数地址,函数值呢,我已经声明出来了啊,那我现在呢,就直接用一个。
58:09
啊,给他声明一个它的函数对象。不是指针,指针函数指针的对象啊,Old my box a啊。好,然后呢,我们在这个这里啊,我们就来获取。
59:01
获取我们的这个函数地址啊,这个我们刚才都讲过了,我们就不重复说了,我们直接用。获取完它的这个旧的函数地址之后呢,我们现在呢,就要来分析它的这个函这个PE结构了啊,首先我们要拿到它的这个到头。这个稻子头呢,我们就可以直接通过这个get摩handle来获取啊,你只要给到这个get摩handle传一个now,实际上获取就获取到当前模块的一个,这个到头了。
60:00
获取完字头之后呢,我们来获取NT头,NT头呢是在稻子头上边来进行获取的。我们用我们用我们的道字头这个位置啊,就是起始位置啊,然后嗯,这个需要给他强转换一下,嗯位置啊,然后加上啊,加上我们道头里的一个成员啊,这个成员就指向了你N头所在的一个位置。
61:04
好,然后呢,找到这个NT头之后呢,我们还需要给他来获取一下我们的这个拓展头,因为我们一会儿呢,要在拓展头里寻找它的这个数据目录表,所以说呢,现在呢,你要来拿到一下它的扩展头。嗯。好,然后呢,我们就用这个拓展头啊,来进行获获取一下这个拓展头啊,这个拓展头呢,是NT头里啊,来进行一个指向啊。
62:07
这个啊,就是他要拓展头所在的一个位置,然后呢,接下来呢,我们要拿到它一个这个数据目录表的一个这个偏移啊。这个呢,就通过我们拓展头啊,里边的这个数据目录表。拿到啊,这个数据目录表呢,它是一个数组,它这个数组呢,是索引呢,你可以用数字也可以用我们这里呢,就用啊来进行代表。
63:00
这个是导入表导入address address接啊,直接获取到这个导表导入表啊。嗯,接下来啊,我们用一个NT啊,不是用一个稻子头啊稻子头。来加上它的这个导表偏移来获取它的实际位置。
64:00
好,这样就找到了,找到之后呢,我们接下来声明一个变量啊。开始循环,便利这个导入表的一个结构。来获取我们导入表啊。应该是。我的心。
65:34
然后继续循环遍历这个里边的这个内容啊,它相当于一个数组啊,相当于一个数组,所以说我们开始对它进行一个遍历。
66:02
做一下判断啊。如果说我们当前的这一项啊,当前这一项和我们要找的函数是一样的。那就说明我们找到了我们的要找的这个地址。如果我们找到了这个地址啊,就是我们要现在要替换它,把它替换到我们自己的这个函数上面,在替换之前呢,我们还是首先啊,要修改它的保护属性。
67:07
依然是给它改成这个可读科学可执行啊。然后保存啊,就有的属性。改变完它的属性之后呢,在之后肯定还是要把这个东西改回去啊,所以直接复制一份,然后呢,把它这个就有属性在之后改回改回去啊,然后我们在中间啊做点事情就是什么呢?首先我们要给它来获取一下我们的这个函数地址啊,然后把这个函数地址呢,写入到我们的这个导入导入地址表的一个项里。
68:02
我们自己的函数啊,在这儿。给它写进去啊。这个没用上啊,就这样好删掉啊,然后呢,我们来实现一下这里边的东西啊,这里边儿东西实际上现在就不用这么写了,因为咱们已经不需要加二了,我们可以直接调用它原来的这个原来的这个流程啊。
69:09
第一个和最后一个还是调用原来的啊,然后中间的调用我们自己的。然后啊,在这儿调用户。第三个删掉就行了啊。重新生成啊。必须返回一个值啊。
70:06
我们注入进去啊。嗯。稍等啊,我看一下。哎,反而这边人多了啊,现在。
71:04
啊,我看一下这是哪出的问题啊。NT头,然后是。
72:22
偏移,然后获取加上。便宜。然后他的or。嗯,LLVM以后会出现在没有。嗯,对,这个日常bug出bug了就调嘛看看。迪沃森。然后。加上我这个。
73:32
啊,循环这里全都没有自增啊。
74:34
好,这回这个也正常了啊,刚才就忘了个自争。然后这个方法就也结束了啊,然后这就是itook啊,基于这个导入表的一种方式,然后呢,我们把这个保存起来。
75:01
然后今天来讲最后一种护方式啊,就是我们的这个所谓的这个无痕护OOK啊,三环的无痕护OOK,它其实呢,本质上而言是基于什么呢?基于这个硬件断点和我们的这个呃,异常的啊啊,基于异常的V异常的啊,我们首先看一下这个英特尔手册啊。首先说这个断点之前呢,我们要简单了解一下这个硬这个这个硬件调试器这个东西啊,就是不是硬件调试器是那个啊,硬件寄存器啊,硬件调试寄存器这个东西,就是这个DR20到D27啊,那首先呢,我们正常情况下,我们使这个调试器里使用的呢,我们自己用的呢,就是DR20DR1DR22D23这四个东西啊,就是这个四个玩意儿是干嘛的呢?是存储这个你下断点的断点地地址的啊,所以说你为什么硬件断点只能下四个呢?那就是因为我们这个东西呢,它只有四个寄存器在纯地址,然后呢,我们再来看上面这些东西啊,这些东西呢,其实呢有很多啊,但是我现在就给你说几个,然后呢,比较有用的就首先这个LEN0到LN这个三啊,这四个四个位啊,这四个是什么呢?都占俩不嘛,它是长度位啊,它是长度位就决定了你这个,嗯,你这个断点它有多长,因为下硬件断点的时候,大家也知道啊,是这个248这种啊,1248这种啊,那实际上就是四种状态啊零零。
76:24
0111和这个一零啊这四种状态,然后呢,还有这个R域RW呢,就是什么呢,也是这个四种状态,它其实是读写读读写这个啊读写位啊,读写域,或者说啊,它实际上就决定也是四种嘛,就是001001,还有这个一一嘛,它际上就是什么呢?就是你这个是这个访问断点呀,还是写断点啊,还是执行断点啊,就是决定这些东西的,然后呢,我们还有比较重要的呢,就是这个啊这个基地位啊,它实际上是保护位啊,然后呢,我们这个这节课要了解的呢,是L0这个位和这个L1这个啊,当然不是S0啊,是L0L1L2L3这四个位啊,他们呢都这刚才包括刚才的啊这些01234,实际上都跟四个地址相关啊,比如说LLN3就对应的是DR3啊,这个LL0呢,就对对应的是DR0啊,就这么一个关系啊,那我们这个为什么要着重说一下L0和G0这种的呢?因为这个呢,实际上是硬件断点的一个这个开啊,就比如说你这。
77:24
啊,D0里存了一个地址,但是呢,你L0没有设置,那这个时候实际上你的硬件断点设置的是无效的啊,一定要开启了它才行啊,那我们就简单的说一下啊,如果有具体的呢,我们可以去领咱们的户客的资料啊,那里头会说的更为详细啊,每一位都是做什么的?好那么我们现在呢,就来了解一下啊,我们这个无痕到底怎么做的,以及这到底为什么叫它无痕啊,其实无痕这东西很扯淡啊,为什么呢?因为它本质上啊只是内存无痕,什么叫内存无痕呢?就是意思就是说啊,我们这个现在刚才讲那几种,无论是你去改它的it,还是改它的这个内,还是改它上边,那实际上你要你都动了它的内存,那这个时候如果说啊,对方的程序有一个CRC342的一个完整性检查,那这时候你就逃不过去。
78:14
那无痕hook就是我们当前这种无痕OOK,它怎么样的呢?它因为是基于硬件寄存器的,它所以说呢,它在这个内存上是没有进行任何改动的啊,它是以触发异常的形式来进行护卡,所以说呢,它没有那种明显的特征啊,但是呢,你你说它真的无痕吗?别人去监控你的这个调试寄存器啊,这个DR20,比如说你DR20你用了别人一看你这里有值了,L0也开着呢,那别人就知道了,对不对,他去检查了一下,是不是这个有有什么问题就了解了,它也不是那么真的无痕,但是相对于这个虾西32这种东西来说,它是可以突破的啊,可以突破这种东西的啊啊所以说呢,就是简单告诉大家一下啊,这个东西这个无痕不无痕的呢,其实是一个相对的东西啊,相对的东西不是绝对的啊,这都是攻防相关的一个东西。
79:03
然后呢,我们把它这个,嗯,这个就用不上这个互函数了啊,我们把这些东西都删了。我们就留他的第二啊,然后呢,我们现在干嘛呢,因为我们这个东西呢,是基于异常的啊,基于异常的,所以说呢,我们现在呢,就开始给他加异常。呃,我想想啊,我们在这儿呢,首先给它加一个这个V的一个结构化异常啊,不是结构矢量矢量异常啊,说错了,不是结构化异常啊,质量异常,然后呢,我们首先第一个啊,第一个参数呢,我们传个一啊,如果是零的话,它排位比较靠后啊,我们传个一,它排位比较靠前,第二个呢,是它的回调函数啊,我们可以直接进去啊,然后拿它的原型。从这啊,我们拿它原形回来之后呢,我给填到上边,就相当于它的回调了,然后他叫什么名呢,我们也可以直接进去啊,把它这个名拿回来。然后给它填上啊,这样呢,我们就增加了一个啊,增加了一个异常,然后呢,它是类型不符,我们直接把它类型拿出来,然后对它进行一个类型的强制转换就可以了。
80:08
然后呢,强转换之后呢,我们现在呢,呃,真正无痕是有的啊,也不是说真正的无痕,你比如说你像是这种你用VT做,你用V看你他没有发现你,但是他发现了你的VT的本体啊,因为VT这个东西的动静很大啊,或者说ept这个东西动静很大啊,所以说呢,这个也也是相对的啊,你还要做VT隐藏啊。然后我们添加了这么一个东西之后呢,我们开始写它的这个户口的函数啊,我们现在呢,要给他写一个这个设置户口的函数啊。我们这个设置函数呢,实际上是干嘛呢?实际上就是在设置一个这个映射断点啊,但是啊,这里说要注意一点,就是我们这个东西呢,它是基于现成的啊,就是我们的这个调试调试寄存器这玩意儿呢,它是基于线程环境的啊,你可以看到它,它其实处于这种里啊,这里边东西都是基于线程的。
81:20
你看啊,它都是基于线程的,所以说呢,你在下这种断点的时候,你要给每一个线程都下,否则你的断点就只有某一个线程生效啊,你要让它所有线程都生效啊,所以说呢,你要给他所有的线程都下,那么我们现在呢,就要干嘛呢?你要所有线程都下呢,你要给他下这个什么呢?你要循环啊,你要循环去便利它的快,我要这个文啊。就是TL32啊好,我们要包含这么一个东西啊,然后呢,现在呢,我们先创建一个进程快照。
82:09
嗯。怎怎怎怎怎么没有那个补全呢,To啊,这回有了,然后我们是TH32CS啊,我们是一个线程快照啊s na three的,然后它所属的进程呢,我们直接获取一下当前的进程ID就完了。好,我们获取完之后呢,我们还需要一个这个结构啊,来对它进行一个填一个保存它的一个相关的性能信息啊,Three的ENTRY32。
83:12
好,然后呢,我们有了这个东西之后呢,现在呢,我们还要给他初始化一下,初始化它一下它的尺寸啊。然后我们初始化一个handle啊,这个是现成的一个句柄啊,一会儿我们要用,接下来呢,我们就开始循环啊,循环什么呢?循环我们的这个的。32。我们就开始不断的找县城啊。啊,它第一个参数呢,就是你的进程快照的一个句柄,第二个呢,就是你的存储的这个结构的这个,呃,这个变量我们开始啊,开始循环,我们在里边呢,我们现在呢,就需要来判断啊,因为这个线程呢,实际上现在是所有线程啊,我们需要判断我们当前的线程和我们当前的这个,呃,我们当前线程的这个复据柄,就是这个线程信息里的啊,这有一个复据复进程啊,TH32啊就这个,嗯,对,不是复进程啊,当前进程说错了啊,是当前进程,当前的进程的ID啊,是不是和我们这个现当前获取到的这个进程ID一样啊。
84:40
啊不对,这是获取句柄啊,再加个ID啊啊这回就一样了,好,然后呢,我们现在呢,来获取之后啊,获取之后呢,我们要继续来进行操作,就是什么呢?就要给这个每一个线程下,那我们首先要给线程下呢,我们要打开这个线程啊,Open的open three的第一个参数啊,就是它的一个权限啊,Three all啊所有的返回权限。
85:06
第二个呢,我们false啊,它是继承句柄相关的,第三个呢,就是你这个呃,现成的线程ID啊,这现程ID呢,在所的info里头是有体现的啊,我们直接去拿它的这个呃T32所的ID就可以了啊,现在就打开了,打开之后呢,我们现在呢,要干嘛呢?我们在用完之后啊,我们要给它把这个豆关上啊,关上。然后在最后也需要关一下啊,如果说没有用到的话,我们在后边也需要给它关一下,然后我们在这个位置上,我们还差一个函数是干嘛呢?是真正设置断点的函数啊,给某一个线程啊,设置断点的函数啊,那这个呢,我们要单独给它拎出来,至于为什么要拎出来写呢?是因为我们一会儿要给它作用在新线程上啊。
86:02
首先呢,我们要获取一下这个县城上下文啊。然后呢,我们要设置一下contextt的一个flag啊,就是我们要获取到什么样的一个信息,我们这儿呢,可以把这个context的一个all给传进去啊,就是获取所有的信息,然后呢,调用这个get啊,Get three get three的contest啊来进行获取。第一个是你要获取的线程啊,是哪一个线程的上下文,第二个呢,就是你要获取的这个上下文的结构的一个地址啊传进去,然后现在我们获取完之后,因为我们要下一个断点啊,所以说呢,我现在呢,就要干嘛呢,就要来设置它的DR0啊,要把这个第零的地址呢,设置成我们的一个断点,那这个断点你要下在哪呢?我们要下一个这个函数啊,这个函数呢,我下在一个函数的地址上,那这个函数我们怎么获取呢?我们可以通过这种方式来获取啊,这是系统A啊,如果不是系统的,你可以自己来这个写一个啊,来这个直接去分析出来地址,然后给它进去就行了,那我们这种系统的API呢,我们可以直接通过这个刚才这种get PR address这种方式来获取。
87:40
好,这样呢,我们就获取完地址了,然后呢,我们要把它这个断点呢,就设置在这个位置上,设置到这个位置上之后呢,然后呢,我们现在呢,就可以干嘛呢,我们在这个开关上啊,我们刚才说了L0,我们要给它设置一下开关啊,我们要把这个开关打开,我们把这个开关打开之后啊,我们现在呢,要把现成的这个环境呢,给它设置回去,就是这个。
88:06
Set three contest。好,这样就设置回去了啊,然后完事儿,我们这会儿呢,就要在这儿啊给它调用一下,调用一下什么呢?调用一下这个hook这个呢,我们就刚才已经通过给打了,然后现在把啊可以了啊呢,我们实际完成所有的个,那这个呢,我们就嘛呢,我就要我在我们这个位置上啊进行一个调用,但是注意1.1个问题啊,就是我们的这个程序呢,通常情况下呢,是不断有新的这个线在启动的,那么如果有新的这个建程线程这个启动的时候,那么我们要干什么呢?我们要把它也进行,那也进行怎么办呢?我们这不是有一个给线程设置这个东西吗?那么这个时候我们在这个进行线程附加的时候啊,我们就来给它调用一下,调用完了之后呢,我们干嘛呢?我们传的是get当前的。
89:07
县城。句柄啊,这个每次它附加到这个新的线程上的时候啊,就直接给它对它进行OOK啊,就这么一个作用,好那么我们设置hook这里完事了啊,那我们现在呢,就要来处理它这个OOK的一个内部了,就是我们在我们这个异常这里了,因为我们在这啊这里我们触发之后啊,我们设置断点了,如果执行到box a这里了,那实际上我们会触发一个叫零一的一个这个异常啊,也就是这个我们所谓的调试异常,然后进到我们v eh的一个调试这个,呃,调试环境里面去啊,因为我们在这加了一个矢量的这个异常处理,然后呢,它就会挂到这个回调上面,那么如果说啊,我们到这了啊,首先那么我们就要判断一下。判断一下什么东西呢?就是判断一下我们那个异常的地址,是不是我们下断点的一个地址啊,这个地址呢,是在这我们着的啊,我们首先要给它强制转换成这个T的类型啊,然后我们异常信息里啊,异常信息里有我们的异常环境啊,有异常环境。
90:08
异常环境里有异常地址啊,然后用这个地址判断一是不是我们这个啊这个啊,我们点这个位置就可以了,如果是我们断点这个,呃,不是断点这位置说明是我们要的位置,然后呢,我们现在呢,就可以要给他进行一个这个参数的了,怎么去它的参数呢。我们看这个结构啊,这个结构里头还有一个啊,这个是可以设置的啊,这你看有什么东西呢?有所有的这个各种各样相关的器,它都是有的,那么这个时候我们要注意点了,我们这里重点是我们这个EE有了E针实们呢,可以给它进行一个这个站的参数的获取,因为你下断点的位置是函数头的第一行代码,那么这个时候从外界传进来的参数实际上就在你的这个站的这个站顶顶部,那所以说呢,你就可以直接获取啊,比如说我要获取它的这个某一个这个参数的这个内,比如ma boss,我要获取我要改它的内容啊,就第二个参数,那么此时我首先我先准备一个字符串。
91:15
改完有完字完字符串之后呢,现在呢,我要来获取什么东西呢?我要来它的这个相关信息里边,我获取它的环境,获取它的ESP,然后呢,ESP我们这个32位的ESP啊,以四字节一个单元,那它第二个参数就在哪呢?就在0S8里边啊,0S8里边,那么我们现在呢,它是一个地址,我们需要给他干嘛呢?强制性的转为然后呢。然后呢,再给它取一下值啊,加上值就可以改了,那么本质上我们字符串的存储的位置也是一个32位的一个地址,也就是四字节,那我们可以直接干嘛呢?替换到的这个加八的这个位置上去啊,那所以说呢,我们现在呢,就给它进行一个替换它的名字啊就可以了,但是注意它的类型不符,因为我们现在强制转换成D了,我们需要把它也强制转换成了,这样呢,我们就把它替换进去了,替换进去之后呢,我们现在呢,要继续执行,但如果说我们啊,我们要给它这个。
92:22
我们要给他这个,那什么,我们要给他这个取消的DR0的话,那我们就没办法进行第二次了,那如果说不取消怎么办呢?啊跟刚才一样啊,我们把它前两个字节给跳过去就行了,因为前两个第一节是Di EDI啊,相信大家刚才用这个依赖的时候也还记得啊,我们就把那两个字节过去,那我们现在呢,就可以直接啊进行一个跳啊,就是我们还是啊在这个异常的环境里啊,我们直接拿到它的这个contextt,然后呢,里头有一个这个呃,EIP啊,我们直接设置它的EIP,然后呢,加等于二把它这个地方跳过去啊,然后呢,我让他回去继续执行。
93:15
好,那另外一种情况呢,就是不是我们这种的啊,不是进来是我们的这个,呃,不是我们断点的位置的啊,那我们就给它加固一下我们的这个断点啊,防防止它去失效啊。嗯,然后我们还要设置一下第二期4405也可以,455也可以啊,这个就看他的你要设置的是什么位啊。
94:18
好这样就可以了啊,那我们现在呢,就给它重新生成一下。拿出我们的这个动态连接库啊,然后放在这儿。呃,我们注入进去啊。没事,诶,你看他标题没改,内容改了,我们只改了它的第二个参数啊,所以说就是这样了。
95:03
好,那这个呢,就是咱们今天所有的这个户口类型啊,然后我们就已经全部写完了。好,然后呢,咱们。让咱们助理同学再来说一下啊,我去找他啊。我来了,好嘞,你继续,这皮皮在这儿呢,来了来了,小伙伴们不要着急,走哈,来来来,跟着我的步步骤来一下,现在先站起来,在你的座位上伸个懒腰。然后喝两口水,再然后,葛优弹回你的座位上,听我叨叨两句,再让我打个小广告好了啊。
96:08
嗯,是这样的,我们一会儿呢,呃,如果有同学对今天的课程有任何问题,可以把你的问题刷在评论区,等一会儿我们请刘莲老师来答疑,如果你有除了今天的课程之外的其他的问题,也可以发在这上面来,任何问题都非常欢迎啊,发上来之后,我们一会儿会精选一下,然后给大家进行答疑,嗯,我就抓紧你们发问题的这一小小会儿时间,然后发个小广告哈,嗯,是这样的。我们现在呢,呃,年终有一个年终活动,年终大促。是荣誉会员呃的一个活动,荣誉会员是什么意思呢?有的同学可能问,荣誉会员就是呃终身服务,终身服务就是我们现在所有的课程都是可以看到的,然后我们之后更新的课程也都是可以看到的,呃,然后我们呃准备在1月25号之后,这个终身会员就下架了,所以呢,如果有需要的同学一定要抓紧最后一波机会啊,嗯。
97:18
其实我们是以不擅长打广告和不擅长吹水出名的,嗯,所以呢,我也就不吹水,然后也不忽悠大家了,实话实说,现在就是最优惠的价格,是这一年最低价,呃。之后再也不会有这个优惠力度了,然后呃,一月20。1月25号之后,我们的这个荣誉会员就下架了,嗯,以后如果再想有就肯定没有了,错过这波就是没有了啊,然后我们呃,请助理同学把那个。
98:00
嗯,我想一下啊,把那个能发链接的就发一下,然后呢,如果想要领优惠券的同学,请你进一下群啊,我找一下刚才那个PPT。杨洋,刚才那个PPT呢。嗯,在这儿。然后这个是我们的群,当然了,如果你想领我们今天的获客专题的视频课,也可以扫码进群,然后呢,还有一些其他的,呃,今天的这个链接代码资料都可以进群,嗯,还有就是如果想要领呃优惠券的话,也可以进群找小助理,然后如果你想讨论什么问题呢,觉得QQ不方便啊,觉得微信不方便,可以加我们的QQ群。大家可以扫一下啊。我看看啊,有没有同学问问题,刚才我们有一个同学问的是能不能讲一下任意地址。
99:06
除了这个问题,还有其他同学问吗?教程多少钱?萌萌萌萌哒工程师B站的这个小伙伴,嗯,你进群问小助理吧。嗯,有问题的话,就把这个问题打在这个评论区,然后我们收集一下,然后让我们老师来给大家讲一下。我现在就看到屏幕上那一个啊,那一个问题,还有一个同学问,有没有达到真正无痕的那种顾客两个问题啊,我看还有吗?之前我同学还问。嗯,是每天直播吗?我们是每周末两天直播,目前没有没有每天。榴莲。有两个问题,一会儿你解答一下吧,好。
100:06
啊,肥大粗大肥壮,能讲一下技术站吗?三个问题了啊,然后那个资料哪里领,扫扫现在屏幕上的这个群,进群之后找小助理就可以了,我们有课程助理。三个问题啊,第一个是客任意地址这个,嗯,然后第二个问题是这个让老师讲一下技术战,嗯,第三个就是有没有真正达到无痕的那种了,你来。真正无痕护和那个咱说完了啊,我上课的时候我就说了,咱们可以,嗯可以,其实都是相对的啊,像VT他也不是绝对的,然后呢,你那个。
101:00
啥来着?呃,任意地址,其实这个东西跟我们现在讲这个就是一个东西嘛,你这个的这个只要把这个呃地址从这个API换成它的这个,你的找到的这个地址就完事了嘛,你甚至就这步的时候,这步获取这个地址的时候,你直接不获取了,你直接把这个地址这个写成一个数字,就是你找到这个地址直接填上不就户可任意地址了吗。这个跟这个API有啥区别是不是。硬件户和任意地址,那就是你说的是咱们这这个什么理论,理论上的这个无痕户是吧,那你改的D20的地址,你给他改成你要户的地址不就完了吗。这没啥区别,然后技术站这个事儿啊,技术站这个事儿,你什么意什么技术站是逆向啊还是什么东西。
102:14
逆向这个技术上其实按咱们原咱们那个原来那套就可以啊。这。这是咱们会员的这个学习路线啊,其实按这个学就行,就是首先你学这个一些基础啊,C瞎加呀,还有这个汇编,然后一些基础的逆向和算法,数据结构以及网络编程,网络编程Python无所谓啊,网络编程啊,这都是基础,然后呢,再学一些类似于界面编程啊,然后系统编程,也就是Windows核心编程那本书啊,好好看看,然后呢,还有一些就是P结构啊,软件调试原理和这个这个无所谓啊,数据库无所谓,然后呢,就是这个3CODE的壳和一些操驱动开发呀什么的啊,这些都是操作系统内核里的一些东西,一些技术,之后呢,就是你其实这个这个内核这个技术呢,你看你学习有多深入啊,不是特别深入的时候,你这个呃不需要那么深啊,你如果说你真的愿意深入研究某一个平台的时候,你就把这个东西好好学一学,内核这个东西啊,它是一个非常基础的东西,但是它决定了你能之后学习的一个高度啊,就是很多东西都是需要以它为。
103:24
理论基础的,然后之后呢,就是比如说你这第四阶段基本上就是你的分支了,你比如说你想学破解,你就去学破解学学恶意代码就学恶意代码,想学逆这个协议,逆向协议逆向漏洞挖掘,漏洞挖掘啊,游戏就游戏,还有这个秒杀就秒杀,这个就是分支啊,随便找一个分支学,基本就能就业了啊。然后你像是我们现在有一个这个新的这个图啊,这个图呢,就是。嗯。啊,这个呢,就是首先啊恶意代码的这么一个路线啊,你比如说恶意代码这个路线,你就首先你要学的就是C,然后下加汇编啊,然后学这个界面系统编程,PE网络啊,软件逆向调试原理,漏洞驱动,然后A代码一分析,呃,一编写就完事了啊。
104:43
需要到啥程度?熟练掌握。越深越好,这能到啥程度?这肯定是越深越好,如果你说到个就业水平,你能用就行,你要说你要真是搞研究,那就越深越好。
105:22
这个可以加群啊,然后想看这个回放什么的,可以加群啊,然后那个加群领取。还有资料什么的,都可以加群联系小助理领取啊。硬件中断的位置那个代码执行了吗?你你没有执行啊,你那个是回去了呀,你直接在那个位置触发异常,直接进异常了,怎么可能再执行呢?你这比如说你在五五,你是五五前面回去的,而且你实际上执不执行对你都没有影响啊,你可以操作EIP啊,你执行了,你直接把EIP倒回去,然后它就相当于没执行是不是。
106:40
然后咱们没加群的可以多加一下群啊,然后咱们之后一些活动啊,或者说是明天的直播什么的,都会在群里有通知啊。
107:02
加QQ了是吧,这是QQ。好了,通过了。可以啊,加群领取。
108:21
咱们今天是不是差不多了。
我来说两句