00:00
我们首先来看一下啊,我们这是上节课的代码啊,上节课呢,我们学习到这个部分啊,就是我们使用了一个这个check的呃函数啊,这个函数呢,我们上节课简单看了一下啊,但是没有太具体,我们现在呢再来看一下。啊,我们把它拿出来。首先啊,运行到自己的领空上,然后呢,搜一下它附近的字符串啊,这样比较快啊,它附近有一个debug的一个字符串,我们可以直接跳过去,跳过去之后呢,它的这个呢,在这个位置上啊,我们直接点过去,点过去之后呢,我们进来,进来之后呢,我们看一眼,嗯。我是不是进多了呀。啊,好像是进多了啊,我们往回走一下。
01:07
Box啊,上面这是push push靠。对,应该是这个扣啊,然后点进去点进去。哎,没有调用啊,我看一下我这个怎么写的。不太对劲啊,我重新给他这个。重新生成一下啊。好生成成功了,然后呢,我把他的这个数据删一下啊,我觉得可能是这部分的问题。好,然后呢,我们重新打开它的这个路径,像。11啊,路径像啊,还是这个没错,然后右键。
02:03
呃,我没有给他关联啊,没有发送,那我直接打开。打开之后呢,还是要走到我们自己的领空下,然后呢,转到我们刚才那里。这个符号不太对劲啊。他这是按t debug啊,那我们这按t debug是哪一个函数。安是另一个函数啊,那我先把这个删掉吧。啊,我是重新生成的是64位版本啊,所以一直不对啊,找不到这个函数啊,我重新生成一下,咱们现在看的是这个32位版本啊。啊,我现在把这个32个版本重新生成一下,把他这个SM删掉。然后重新生成。
03:00
好,重新生成之后呢,我们现在打开啊,打开之后呢,我们进入到这个32位这个路径下,然后呢,重新给它播放啊,刚才因为生成错了路径来,所以说一直没有调用到那个函数啊,现在呢,我们进入到自己的领空下。走啊,然后上边这个call啊,这回这个符号就对了,对完之后我们进去啊,进去之后呢,我们来看一下这个位置啊,我们调用了一个这个检查远端的一个啊,跳试标记的这一个函数啊,然后我们点进去,点进去之后呢,它是有一个跳转啊跳过去,跳过去之后呢,我们可以看到它内部呢,实际上是使用了这样的一个函数啊,而这个数呢,我们现在可以来看一下。我们直接给它复制一下这个选区啊。然后在这个位置上注释好,现在呢,我们来查询一下这个API。这个API呢也是啊,我们直接搜就行。
04:03
啊在这,那这个A呢,它属于一个未文档化的A啊,也就是说呢,你在用的时候呢,需要手动去搜索它的地址啊,如果你直接在这边使用的情况下,他会告诉你没有这个API啊,看到了吗?未定义的标识符啊,但是不代表他真的没有,它只是未未文档化啊,也就是说呢,他不希望你使用,因为什么呢?因为他这也说了啊,可能呢,在Windows未来的版本中更改或者不可用啊,所以说呢,他就没有给你这个文档化的提供出来,所以说我们现在呢,要自己来给它进行一个调用,那它大概有几个参数啊,那我们最关注的数呢,是这个我们中间这个啊,这个呢是你要获取的这个信息的一个类型,这个A主要就是一些这个进程相关的一些啊,然后呢,这里边呢,指定的是类型啊,那比如说我们刚才呢,看的这个参数呢,是在这个第二个啊,那我们来这个打开调数器,你可以看到啊,这个push置的第一个,Push置的第二个啊,这是一个七啊,那这个七呢,实际上就是我们的。
05:04
在什么呢?我们要找的这个东西啊,我们要找的这个东西啊,那这个七呢,实际上就是什么,就是price,这个price debug啊,这个什么啊,什么调试端口啊,调试端口,也就是说我们这个函数,我们这个函数实际上就是在检查它的调试端口,那按照我们上节课的理解来说啊,它既然能这么实现,那我们肯定是可以自己实现的,对不对啊,那所以说我们先把上边这部分呢,给它啊去掉啊去掉这也是上节课的代码,那么我们这节课呢,就来这个实现一下这部分的一个内容,那首先呢,是我们刚才的这个API啊,这个API呢,我们首先呢,要把它的原形拿出来啊,然后给它明成一个函数指针的形式啊,首先通过一个type啊,然后给它拿过来,注意点啊,这里有一个这个类型啊,就是F啊,这个class这个结构它是没有的,这是为什么?因为它包含在另一个文里,我们没有包含,所以呢,在这个位置上呢,我们首先呢,要给它包含一下这个我们需要的头文件啊。
06:01
包含完事之后呢,它就有了啊,然后我们点进去啊,可以看到一共这么多东西,那这里边呢,都有什么东西呢?比如说这个啊零啊就是什么,就是我们的基础信息啊,然后呢,这个呢,是这个14的一个信息啊,这是这个镜像文件啊,然后还有一些其他的一些东西啊,比如这个条端口什么的,但是呢,我们这个东西呢,只是一小部分啊,实际上它这里边呢啊提供的东西并不全,我们还能知道有一些其他的这个呃类其他的值啊,也可以查询一些,查询一些其他的一些这个东西啊呃,然后呢,我们现在呢,能用的呢,首先呢,就是这里边的一些啊常见的啊,比如说我现在呢,已经把它复制出来了啊,那么现在我要给它改成函数指针的一个形式,首先呢,把它圈起来。然后啊,Win API其实就是SD call嘛,然后win API星啊,我们直接F12进去,你可以看到其实就是SD call啊,然后我们这样之后呢,需要把它名字简单做一个修,比如个N啊之类的,然后呢,我们这些呢,因为是说明性文档里带的啊,所以说呢,我们在语法上并不支持这个东西啊,我们要把它去掉。
07:17
或者你把它改成红也行啊,但是直接是一个框,它是不支持的,现在呢,我们把它拿出来之后呢,我们现在呢要可以开始调用它了啊,那首先呢,我们要提供的第一个第一个参数啊,是一个呃,进程的一个句柄啊,那我们进程句柄的获取呢,有两种方式啊,第一种方式呢,就是你使用一个这个handle啊,一个等于什么,等于open啊,然后呢,给他提供它所需要的一个权限。然后啊,它返回的句柄是否可以继承啊,最后是他一个进程ID,就是get啊,Get cru啊,Process ID啊,这是一种啊,还有一种呢,就比较这个方便,就是获取自己的时候啊,这种呢,就是你如果是获取的别人的进程啊,那么你这个时候可以填一下别人的进程ID,这样比较方便啊,但如果是自己的话,其实你可直接调用这个。
08:10
啊get get这个啊,这个呢,就可以直接获取到当前进程的一个这个剧柄啊,然后没点关注点关注啊,有需要这个咨询或者领取课程的可以联系咱们老满也可以联系他加入咱们的QQ群什么的,然后呢,我们现在呢,已经给他获取到竞争句柄了,那么接下来呢,我们就来获取这个函数的一个地址,首先呢,我们现在呢,因为没有办法直接用它,我们要去寻找它函数的一个函数地址,那么它这个函数呢,是在NTDR里导出的,所以说呢,首先呢,我们第一步呢,是要返回一个NT点啊,返回它的一个模块基值啊H啊NTDR等于load library。No library啊,Low library或者no library a哈,我们获取一下,然后呢,首先呢,你要获取的是哪一个模块啊,这里呢,获取的是NT.drl然后呢,我们下一步get PC啊,Address啊,通过这个函数来获取它的个函数地址,那它的第一个参数呢,就是我们的模块名,第二个参数呢,是你要获取函数的一个函数名,那我们直接把这个NT后边这个部分给它取出放进去啊就可以了,接着呢,我们要给它做一个返回,它的返回呢是一个函数地址,那我们要给它强转成函数帧的类型,然后呢,在前边啊,用一个函数帧啊来进行一个接收啊,这样就可以了,接收完之之后呢,我们现在就找到了一个函数,那么现在呢,我们就可以来进行一个它的一个调用了啊,就是用这个INC啊来进行一个调用,但是这个呢,我们就在怎么样啊,我们在这个while循环里头啊进行一个判断,比如说我现在呢去调用它,调用它之后呢,我们想用什么,想用一些这个我们刚才的。
09:53
这些东西啊,那我们这里边其实可以检查是不是调试的这个内容是非常非常多的啊,比如说我现在呢,可以首先获取一下它的零这个东西啊,其实就是什么,就是获取PB啊,我们昨天使用了这个汇编的形式和这个啊函数的形式来获取了,那今天呢,我们用这个查询进信息的形式获一下这个P,那首先呢,你要获取这个东西的第个参数,你是么进的个这个第你的么?那就是。
10:22
啊,贝斯。Information啊,这是一个枚举类型里的一个值啊,其实就是零啊,我们看一下,然后呢,我们现在呢,既然有了这个值之后,我们下一个啊,就来获取它的一个结构体,它的一个结构体的一个内容呢,就叫什么price啊,Basic information这么一个结构体啊,我们把它拿过来啊,我们给它起个名叫PPI,然后呢,给它初始化成零,现在呢,我们拿到这个东西之后呢,接下来下一个啊,它这个参数啊,我们现在呢,把这个结构填进去啊,结构填进去之后,它下边还有一个参数,下一个参数呢,是它的一个尺寸啊,啊,你看看到它的尺寸,那这个尺寸呢,我们需要自己来获取一下啊DW啊,然后一个这个P的一个size等于size off啊,然后计算一下它这个price basic information里边到底有多大的一个内容空间啊,那么我们现在拿到它之后呢,我们现在把它填进去,填进之后下一个就是它返回有多长,这可以传到你也可以用一个东西啊,来给它放一下啊,然后。
11:27
DGTH啊等于零,好,那么接下来我们就可以把它的一个地址啊,进行一个传入就可以了,那我们这样查完之后,我们其实要获取什么,其实是它这个结构里的一个PB啊,我们可以看到这有一个PB address啊,那我们现在要获取的就是这个东西,它的类型呢,是一个PB的,但是这个类型呢,实际上它的这个里包含的比较少啊,啊这个不足满足我们的需求,所以说有时候我们还需要自己来写这个交,它只是给你的一些用的,而且有一些东西都没名字啊,那么用这个p.P来用这个P里这。
12:18
我看一下啊,调试标记去哪了啊,这是用这个调调试标记啊,然后我们来进行一个判断,判断是不是等于true啊,那如果等于true呢,就是什么呀,就是被调试了啊,如果说是等于false,就是没有被调试,那现在呢,我们就可以来尝试一下运行。看一下啊,有一个错误啊。啊,我们调试器开着呢啊,所以说它没有办法进行写入啊,我们把它关掉,关掉之后重新运行。也可以看到啊,显示被调了,对不对啊,然后把它关掉,关掉之后呢,我现在呢,用这个我的这个,呃,用我的这个。资源这个文件管理器啊,直接点开啊,点开之后你可以看到它就没有问题啊,那这个东西呢,用这个调试器打开也是一样的一个道理啊,我们直接把它拖过去。
13:06
拖过去之后呢,我们现在呢,运行到我们自己领下,然后我们一下。八。好在这儿啊,然后呢,我们这个在上边儿。这是check ESP啊,然后这个是Bo,然后应该是在上面。And,应该是这事。哎,这不是这个usp。啊,在这儿靠的啊,在这靠的,我们因为是用函数指针的形式啊,所以说它拷成这个造型了啊,那我们在这儿给它下个断点吧,然后我们来运行一下,运行到这儿之后呢,我们直接这个F7跟进去啊,跟进去之后呢,它在这个函数内部啊,我们可以来给他看一下。
14:05
你可以看到啊,在这啊,它这就显示出来了,这个到底是在使用什么东西,是不是使用的这个,呃,查询这个进程的一个信息一个啊,这就显示出来了啊,因为它进行了一个分析啊,我们使用函数人的形式,它也查出来了啊,但是你在上一集啊也是可以看到的。好,我们先把它关掉啊,先把它关掉,这是一种形式啊,一种形式就是我们直接使用什么使用它的调试标记来获取的,但是呢,我们的这个查询证信息,这种形式呢,其实可以有很多种方式来进行获取它的一个是否被调试的,那么我们当前这种呢,就属于是第一种啊,我们可以先把它这个注释掉啊,或者说先复制一份,然后把它注释掉。我们以一个这个标号来这个进行一个区分啊,比如说这个它是什么,这是0X啊零啊,0X0这种形式进行查询的,就是price basic information,它是0S0,那接下来呢,我们继续进行查询啊,那上面这些东西呢,就暂时用不到了啊,我们现在啊,把它第二个参数给它改一下啊,就是这次我们查询什么东西啊,我们查询0X7,那0X7是一个什么东西呢?是调试端口啊,也就是process啊debug啊这个东西啊,那这个调试端口呢,你需要用一个什么word的一个值,一个debug啊啊进行接收啊好,那现在呢,我把它地址传进去,然后它的size呢,我就直接一个off啊来进行计算就行了啊,最后一个可以不要啊,不要我们就给填个就行了。
15:36
啥玩意儿黑的?呃,没点关注的点点关注啊,然后这个每周六周日都有直播啊,有这个其他咨询领课之类的可以联系咱们老马啊好,然后呢,现在呢,我就已经把它这个调试端口填进去了,那么这个时候呢,我就可以对这个调试端口啊进行一个判断,他如果说是被调试的状态下,它的值应该是0X8个F啊,现在呢,我们直接运行。
16:06
可以看到啊,显示被调试了,那如果我们把它关掉呢,直接通过这个资源管理器里的这个啊,我们来看一下啊。可以看到啊,是不会显示的,好,那这个呢,是第二种方式,就是使用这个0X7的形式啊,那我们把它注释掉啊,我们再来下一种,我们接下来呢,还可以通过什么,通过0X1E啊,EE的形式啊,那EE的形式检查了什么东西啊,刚才检查了这个我们的这个调试端口啊,那现在呢,我们可以来这个调试来检查一下它的这个啊,Debug handle啊debug。那我来我算一下啊,0SE是多少来着。计算器。三零啊,我看一下它里边有没有三零啊,没有那我就直接给他传一个零还是三零就得了。
17:02
好,然后呢,它是一个憨啊。这种情况下,如果你的debug憨啊,不等于。不等于闹啊,那就是被调试了啊,那我们尝试一下。哎,是等于呢,还是不等于呢,我看一下。这个是不是因为它是0130,所以调试失败了,我看一下啊运行一下。啊,0S30去了啊,这肯定查不到啊,十进制是三零,它是0S1啊啊对,查错了啊查错了不好意思。
18:07
来运行。可以看到啊,是被调试了啊。写错了,刚才啊。看啊,这样就没事儿啊啊,这个也没问题啊,只是刚才我把那个16定制写错了,好,那这个东西我们现在呢,就先给他这个注释掉,注释掉之后呢,我们再给他来一个啊最后一个。啊,就是我们使用查询信息进程信息这种形式啊,还有一种方式可以使用。啊,给它解除,然后呢,这种方式呢,就是0XEF啊,0XEF呢是查查询的是什么呢?是一个布尔值。是什么是debug flag啊,就是我们刚才查过那个东西啊,但是这次呢,是使用我们这种方式来查的。
19:08
好,我们运行。嗯。啊,这是改EF啊。可以看到啊,显示被调试了。然后啊,我们出去之后啊,重新给它啊点啊你看它就没了啊,所以这是个呢,也是一种这个反调式的方式啊,那我们也就可以看出来了啊,通过我们的这个,嗯,上节课的那个函数啊,我们可以看出来啊,我们在这个内部啊,实际上是调用了我们查查询进程信息这个啊API啊,这个NT开头的API,然后呢,我们现在呢,利用这个原这个API啊,我们自己来进行调用之后,我们发现有很多种方式啊,是可以进行这个反调式查询的,比如用这个零零啊查询到PB,然后通过PB来进行查询,也可以0S7查这个debug端口啊,0SEE查这个debug handle啊,然后呢,0SEF查deb个flag啊就是这种这种方式啊123。
20:13
呃,1234啊四种方式啊,都是使用同一个函数,但是使用的呢,是不同的这个判断形式,以及获取的不同的内容啊来进行获取的,好,然后呢,我们呃,这节课呢,就先写这么多啊,然后有什么问题没有,没有问题的话呢,我们就换这个柠檬过来讲啊。没点关注,点点关注啊,然后呢,有这个需要咨询的可以联系咱们老板啊。
我来说两句