00:00
然后咱们就是之前啊,之前不是写了一个那个什么远控嘛啊,我看我带大家看一下啊。咱们在这个上一集啊,就上一集咱们实现了一个用这个反弹赛的功能啊,来这个进行这个呃,执行远程这个赛,这个命令的这么一个功能,它实际上本质就是一个呃命令下发的远控的最基础的一个图形,一个图形,那么我们有了这个命令下发功能之后呢,我们就可以做一些其他的事情啊,你比如说我们现在已经有了一个反弹了,呃,那我们来看一下这个代码啊。哦,我们在客户端这边啊,我们来看一下这个客户端的那个代码。我们可以看到在这个位置上啊,它有一个这个CMB命令啊,就是服务端下发命令的一个接收,接收之后呢,到这个CMB里,然后来判断一下这个CMD是不是e sit,如果是就跳出,如果不是呢,就去执行这个C,用这个p open去执行这个命令,然后呢,把返回的结果返回到这个服务端上,那么这个呢,就是最常见的这个反弹SH药的一个这个使用,那么我们实际上而言,在这个远控上,很明显我们是可以加很多很多其他功能的啊,比如说我们今天要讲的截图功能啊,那你可能就是想窥个屏啊,想截图他的密码啊,他输入的东西啊,乱七八糟的无所谓啊,不管你能不能截到,反正如果你有这个想法,你是不是来实现一个截图的功能啊,对不对啊,那么这个时候你可以给他加一条命令,比如说他是这里啊,来这个去判是你完可以这个再这,然后呢,判断一下C是。
01:42
啊,那所以说呢,我们这节课呢,我们就不在这个基础上改了,但是呢,大家知道一下,我们是可以直接加在这上节课的这个上的啊,然后呢,你就可以通过他的这个send,然后再把你截下来的图再发回到这个服务端上啊,那现在呢,我们打开一个我们的这个P。
02:05
Python这个东西呢,它截图方式呢,也不止一种啊,应该说还是比较多方式的,但是我们这节课使用的方式呢,就是使用这个呃,Windows自己的一些API啊,来实现这么一个东西啊,那我们直接新建一个项目。啊,一个纯的Python啊,然后呢,我们选一下它的这个基础解释器啊。啊,然后呢,创建创建一个带魅欢这个魅点PY这个欢迎脚本的这个啊。好,我们创建出来了啊,然后把这个没有用的东西呢,我们删一删啊,这这种东西都没有用的啊,我们删一删,然后今天呢,我们用的这个包或者说叫库啊,有比较多啊,比如说我们可以要一个这个,我想想这个用不用得到啊,这个应该是用不到啊,用这个吧。
03:03
WIN32。API这个库啊,然后我们直接给他点击。然后安装软件包啊,它这个软件包叫做PY p32啊。然后我们等它安装啊,要这个包要安装好,然后我们才能继续啊,要不然的话我们没法用它啊,你可以看到啊,它已经安上了啊,看到没,已经成功安装这个软件包了,这个软件包呢,如果你用默认的这个呢,你可能是这个装不上的啊,为什么装不上呢?它这个具体原因我不知道,但我知道怎么解决,怎么解决这个呢?你就直接在这个位置上输入什么呢?输入CMB啊,然后用这个命令提示符右键以管理员身份打开。啊,然后呢,直接试,试完之后呢,我们刚才那个玩意儿叫什么来着,我忘了啊叫那个。呃呃,忘了啊,反正你用什么呢?用这个pip的一个包管理器啊,然后直接install啊,然后呢,是这个PPI,呃三二好像是就这么叫啊这个包,然后呢,你用这里啊,对它进行一个回车,一个安装,安装完之后你再回到你的这个PY里啊,你再去安装的时候就不会报错的啊,你如果直接去安装的话呢,它是会报错的啊啊然后呢,还有其他的几个我们需要用到的,我们一起给这个包含进去啊,他们都位于一个包里啊。
04:42
好包完之后呢,接下来呢,我们现在呢,就来这个先编写一个函数啊,这个函数是用来干嘛的,就是用来获取你当前的一个这个设备的这个屏幕的一些信息啊。
05:04
好,然后呢,我们这个东西呢,主要通过调用的是我们一个这个win API里边的一个API啊,来进行一个实现的。When api.at system啊获取它的一个维度信息啊,它这个函数呢,它只有一个参数啊,叫什么呢?叫索引啊,这个索引呢,有非常非常多的功能啊,我们可以直接啊来看一下它的这个MDN的一个定义啊。嗯,看一下他这个MS点啊在这啊,Microsoft DOS啊,然后来我们看一下啊,你看到没这些东西啊,它只有一个参数啊,大参数只有一个叫做这个index,这个index里边呢,一共有75个值啊,应该是一共有75个值,这里不知道全不全啊,反正应该是一共有75个值,那这些值里边的每一个啊,都代表着一个东西啊,都代表着它的一项啊一项,然后呢,比如说啊,你可以获设置的这些东西来获取不同的这个,呃,你想要的这个数据,比如说我们来翻译一下,看一下你看啊这有什么的,比如说啊,这个什么显示器的一个设备的数量啊,第二个什么宽度高度,然后呢,还有什么这个光标的宽度高度啊,还有一些其他的东西啊,也就是说我们通过这个就能到我们屏幕的一些信息,这样呢,可以方便的我们各去截图的时候拿到一些基本的一些数据啊,好,那知道这个之后呢,我们现在呢,就通过它来进行一个获取啊,那首先呢,我们这些常用的这个索引这类东西呢,都包括在我们的WIN32CON这个。
06:41
库里边了啊,那么现在呢,我们就可以直接啊去来获取的,我们首先来获取什么呢?获取一下我们这个屏幕的一个宽度啊一个宽度。嗯,SM啊,然后是这个CXVR啊。
07:01
就这个啊,这个呢,就是获取宽度啊,我们直接啊用一个宽度啊,来对它进行一个接返回值进行一个接收啊,然后呢,它还有一个什么呢?它还有一个是宽度是高度啊,还有是一个是高度。He I。T啊,它这个呢,就有一一点区别,你看它上面这个是什么?CX对不对,X就指的实际上是X坐标啊,然后它的对应的这个高度是什么呢?是C啊,CY代表的就是这个高度啊高度啊,所以说他们俩只差一位啊,然后呢,我们啊,这个是啊备注一下吧,备注一下啊,给他注释一下啊,这个是这个。屏幕的啊,这个宽度也就是所谓的这个X轴啊,然后呢,这底下这个呢,是屏幕的宽啊,屏幕的高度也就是Y轴,好,然后呢,还要获取什么呢?还要获取一下这个屏幕的顶的一个坐坐标啊,还有什么呢?还有一个就是我们另一个应该怎么说呢,怎么形容呢?就是嗯,就是它其实是一个高度啊,就是我们屏幕所有显示器的一个这个矩形啊,然后呢,它是这个你的顶部应该说是嗯,不能说是顶部啊,这个应该是左侧啊,反正呢是四四侧的一个坐标啊,我们来接着获取啊。
08:30
应该是左侧,应该是左侧。哎啊,我写错了啊,我应该把这个去掉啊,等于WIN32API啊,点好WIN32。SMX。嗯。没有。
09:04
啊,写成com了啊,怪不得没有。CON。好,这回就对了啊,然后我们再给他来获取一个啊,一个top。这个top呢也是啊,把它这个X啊改成Y啊就完事了。啊,然后呢,这个就是相关的一个屏幕的这个边框信息啊,我们就拿到了,拿到之后呢,我们在底下啊,就开始写它的一个这个截图用的一个函数了。然后呢,我们要给他存一个文件名啊,一个file name,默认的情况下呢,你就给他存一个这个截图啊。如果传了就按传的来,没有传的就按他这个默认信息来啊。
10:04
好,然后呢,首先呢,我们要获取一下你桌面窗口的一个这个句柄啊,也就是类似于HWND这种东西。好获啊,注释一下吧,获取桌面窗口句柄。获取完面窗口句柄之后呢,接下来呢,我们要获取一下这个屏幕的相关信息啊,其实呢,就是我们刚才啊编这个啊,我们写的这个函数啊。我们上面没有返回啊,我们要写一个返回啊。
11:16
好,用他们四个啊,来接收一下我们这个函数的一个返回值。好,现在呢,我们来这个接收完它的返回值之后呢下啊,这是获取屏幕信息啊,我这也注释一下获取屏幕信息,然后获取完屏幕信息之后呢,下一步呢,我们就要拿到什么呢?拿到的它的一个这个设备环境。Disc disc好DC啊,等于WIN32。GUI啊点get window DC啊get window DC呢,我们需要给他传一下我们的这个桌面窗口的一个这个对句柄啊,要把它给放进去,好获取到句柄之后,我们获取到了啊,获取到了我们的A。
12:16
我回车了,不小心啊,过去。窗口的设备环境。好,获取完设备环境之后呢,接下来呢,我们根据它的这个DC句柄啊,然后来创建一个我们的这个呃,DC啊,创建一个DC。DC。呃,From handle啊,从这个句柄啊,创建出一个DC啊。这个句柄呢,我们还是我们,我们拿这个啊,拿这个社会环境这个啊,从句柄创建一个BC。
13:09
好,然后接下来呢,我们要干嘛呢,要创建一个这个,呃,内存DC啊。嗯。我搜一下这个函数对不对啊,这个没有补全啊,我这个不太确定。
14:01
没点关注的点点关注啊,有需要这个进群的,获取往期视频的,可以联系咱们老板啊,这个啊没没错啊。没错,我们就给它封上。嗯,然后接下来我们创建位图。我想想应该给他叫个什么。SCRENOT。等于win32.ui,点呃ui.create bit map创建一个位图,然后创建一个位图。创建完位图之后呢,我们来继续啊。
15:11
创建兼容,兼容为图。Co麦,然后它有几个参数啊,首先是一个MGDC啊,你要传进去,第二个呢,是这个它的宽度,然后第三个呢,是它的高度啊,都传进去创建完事之后呢,接下来呢,我们把我们的这个内存设备的一个上下文啊,指向我们要补货的一个位,这个位位这个位图对象啊。LE。Object。卖啊,这个注释一下啊。
16:05
将设备上下文指向我们要捕获的位图对象。应该叫内存设备上下文。好,然后呢,接下来呢,我们就把我们这个现在这张桌面上的东西啊,主卫啊,复制到我们的这个内存上下文里边啊。一点。然后是宽高。再接下来是这个MGDC,再然后呢,是这个左和顶。
17:09
左顶,左顶后边呢,就是我们的一个标志位。SRCCR,对,S RC copy。对,是这么拼的。然后他是个N。好,然后给它拷进去之后呢,我们接下来呢,就已经拿到它的这个图了嘛,那么接下来呢,我们就要把它呢,进行一个保存,比如说我们保存到我们的这个本地啊什么的啊。然后啊,这个save。Bitmap。然后是我们的这个什么来着,内存DC,从我们的内存DC里啊,然后存到哪啊,那我们就直接存到我们的这个。
18:12
呃,格式化,点BMP位图,然后点format进行格式化,直接把这个名啊格式化进来啊好,格式化完之后就保存出去了啊,那么接下来呢,我们就可以把内存DC的这个对象啊删除掉。删除DC。删除完DC之后啊,接下来我们删除这个位图对象啊。WIN32c.delete delete object,然后是s CR bit map.get handle。
19:00
呃,应该是没有问题了啊,我们来调用一下试试啊。我们运行一下啊,看看报错不。没报错啊,没报错呢,大概率呢,这个就是成功了啊,那我们右键打开一下我们的资源管理器。你可以看到这有一个bit bit map了啊,然后我们我们打开你看这个就是我们现在桌面上这张图,那么这张图呢,现在截的呢,因为是我们现在桌面上的信息,所以说它其实是相当于按了一下我们的那个呃,桌面上的一个键啊,这个键呢,有的全键盘的是应该有,如果不是全键盘应该没有,它相当于什么呢?相当于调用的是SCL,然后这个look啊,这个这个键啊,它呢应该是在我们的home键上边啊,就是截一下我们的这个Windows的一个全屏啊,然后呢,你比如说啊,现在你截完了啊,那我们现在呢,当前呢,是把它保存到这个本地上了啊,就是直接保存到文件了,如果你是在写远控的时候,你就可以通过这个代码啊,我们看一下远控这个代码。
20:14
在这儿啊,你看到没,它这个就可以通过什么,比如说你通过send的啊,你就可以直接把这个整个文件啊转成这个流啊,给它发出去啊,然后呢,拿到这个服务端上,服务端呢就得到了它的这个二级,这个就是缓冲信息嘛,拿到缓冲信息之后,无论是服务端要保存到本地上,还是说服务端直接通过这个类似于这个展示图片啊秀这种啊,来给它显示出来都是可以的啊,那这个呢,就是在指令下发的时候去截图啊呃,如果说是需要长时间那种录制呢,我们后续呢会讲去怎么录屏啊,现在这种呢是截屏,截屏和录屏不知道不一样啊,截屏呢截的是图片,录屏呢他录的呢是视频啊,然后如果有麦克呢,你也可以把它声音录上啊,当然系统内声音也可以录上,但这个处理比较复杂,因为它的这个有内外的区别嘛,然后现在呢,我们这个东西呢,就已经实现完了啊,就是进行一个截图功能啊,可以看到啊,我们代码量呢也比较少啊,40行不到啊,就可以实现出一个最基本的一个截图的。
21:15
功能啊,然后呢,如果不出意外,明天可能会讲一下这个键盘监控之类的啊,再看啊再看啊,有可能是啊,然后这节课呢,就是这个东西啊。好,然后有什么问题你们可以现在问啊。
22:35
啊,这个没事啊,这个东西好解决啊,我们直接搜一下他这个标志到底是什么就行了啊,我是想不起来它是什么。但是我们可以直接搜。这个吗,看到吗?这个XY啊,就这两个东西,它的解释是虚拟屏幕左侧和顶部的坐标。看到了吗?看到这里了吗?
23:02
就是它这种索引啊,它在它函数的解释里是肯定有的。啊,你你可以记不住,但咱们可以搜。相对于顶部和左侧屏幕的位置。啥意思?他这个说的虚拟屏幕是所有监视器的一个边界矩形,那实际上而言就是。呃,我我腾讯课堂是不是没了。啊,无所谓啊,像这样啊,你看啊,就是这样,这个我现在这个鼠标这个位置能看见吗?你看到没?这它相当于一个矩形啊,就是一个正相当于就是一个长方形或正方形嘛,然后呢,你看它这个边界啊,这个左侧啊,这个就是这个这个位置的坐标啊,顶部呢,就是这个位置的坐标。
24:17
他一整个虚拟屏幕,它需要什么呀,它需要的就是边界的位置啊,他什么也不需要,相对于啊。他参他参考于参考于你的屏幕啊,你屏幕只有大小的呀,你你你操作系统会不知道你屏幕有多大吗?对不对,因为你是有分辨率在的呀。我知道没了,不用来提醒我。不是他我我他他要问的是总得有个参考对象吧,我告诉他了呀,参考的你操作系统会知道他有多大呀,就这个位置和这个位置吗?你给他指一下吧,我刚指完了你来的上啊行行行那行。
我来说两句