00:00
那个这节课呢,咱们讲一下啊,如何使用Python来获取一下这个系统的一个进程信息啊,通常情况下呢,我们会在这个比如说写写一些远控啊,写一些这个小工具啊之类的东西,需要便利本地进程的时候啊,都需要用到这个功能,呃,我们先来给大家演示一下如何用C来写这个东西啊,然后呢,我们再用这个Python来实现一个同样的一个功能,如果我们用来写呢,其实呢,我们可以直接使用一个这个进程快照啊,而Python呢,我们今天会将两种方式啊,首先呢,我们如果用C的话,我们要包含一个TR32的一个头文件,然后呢,我们比如说我们现在呢,来封装一下这个函数啊,这个一个word。嗯,So。啊,其实呢,非常简单啊,首先啊,我们要创建的呢,这个东西呢,憨啊,它会返回一个这个句柄啊,那它是什么东西呢?它实际上是一个进程的一个快照啊,那我们给它来。
01:08
嗯,什么来着啊,我们现在呢,就先来研究一下这个函数啊,因为之后呢,基本上都是建立于这个函数能成功执行的这个基础上的。嗯,好,那我们来看一下这个函数啊,首先你提它干啥呀,感觉我吹它吹的不够死,还想再听点八卦是吗?好,我们给大家这个翻译一下啊,就是这个函数呢,它呢,它的作用呢是拍摄一个快照,快照这东西呢,顾名思义啊,其实呢,就跟大家在这个照相馆照的那个东西呢,是一个这个道理啊,然后呢,我们现在呢,来要拍的这个快照是什么样的呢?就我们比如说我们右键看一下这个任务管理器啊,里边有一个这个详细信息啊,我们拍摄快照呢,就类似于这个东西啊,里边这个相关信息呢,有一部分我们也可以可以通过这个快照来获取到的,那么这个快照这个东西呢,它呢有几个参数呢,是我们一定要填的呢?首先呢,就是第一个参数啊,第一个参数是决定你要便利什么东西,因为这个快照呢,实际上不单单可以便利进程,它可以便利其他东西,便利什么呢?首先我们可以便利这个进程,便利线程便利这个呃模便利啊,这些东西都是可以便利的啊。那么我们这里呢,就。
02:26
不是说啊,有一个这个红啊,这个红呢,就指定你要便利的是什么,比如说这个啊,这个呢啊,这个不是啊,我看一下啊,这个是。这个啊,这个就是我们的这个进程,这个呢是模块,这个也是模块啊,然后这个呢是多啊,然后这个是线程啊,那这个呢,就是我们主要这个获取的东西啊,那我们现在现在给填上啊,首先我们第一个我们要获取的是这个程,这个程啊。然后第二个是什么东西呢?第二个呢,第二个第二个参数呢,实际上是进程ID啊,那我们这个进程ID呢,如果说你便利的是堆是线程,是模块,就需要填写,因为你要说你的堆,你的线程,你的模块是属于哪一个进程的,那如果你填的是这个,你便离的是进程,那你就不用填了,你填个零就行了,因为你这个东西呢,当前不属于其他进程啊,进程不可能属于进程,对吧?好,那么这个呢,就是它的一个参数的一个填写,那接下来你要利的时候啊,那你还要用到什么呢?用到一个结构叫做什么呢?叫做这个process啊,这个ENTRY32。
03:32
啊,这样的一个结构啊,我们可以直接F12跟进去看一下啊,这样就是它的一个结构啊,这个结构里边呢,有这么多的一个成员啊,它其中呢,比较常用的成员是什?比如这个ID个ID,这ID个这个程个进程多少个,这个呢是你这个进程的一个这个ID啊这个呢是这个呃先啊先啊这个呢是flag,这个呢是这个EE的这个路径,或者说是这个名字啊这个都是啊好,然后呢,我们这个呢,就是它的一个基本成员啊,我们现在呢,要便历的时候呢,其实呢,要获取的呢,就是这个结构啊,我们声明一个名字啊P32等于什么呢?我们首先要给它初始化一下它这个结构的一个尺寸,它的结构尺寸呢,就是这个DW size啊,我们给它直接初始化就行了啊,我们用一个size off啊,计算一下我们当前这个结构有多大。
04:35
好,这样就给它初始化了,初始化完事之后呢,我们接下来呢,就开始要变历了啊,那我们直接一个while循环啊,我们可以通,我们可以写两种啊,一种呢是什么呢?一种呢就是通过do well循环,一种是while循环,那区别呢,就用不用它这个fast,这个first便利第一个啊,我们可以直接用N遍利下一个啊,其实这个呢是两种手法,那如果你要利第一个呢,首先呢你就要这样写。
05:01
啊,32啊,然后这个first,好,那这个函数呢们在刚才这里边呢,你往下看啊,你看到没?这个函数呢,都是一一对应的啊,比如说我们这个便利进程的进程的一组函数,如果便利线程的有线程的一种函数,便利堆有堆的函数,便利模块有模块的函数啊然后呢,这里边呢,还有各样各各种各样的这个结构啊,比如说这个你看我们刚才看到的这个ENT32的一个结构啊,跟我们刚看到的就一样,底下呢也有这个啊来这个呃,讲解的,比如说这里头还有一些不用的啊,比如这个模块ID啊,还有这个默认的这个堆ID啊,这些东西已经不用了啊,直接设置成零就行了,你看这个也不用了啊好,然后呢,我们现在要用的呢,就是这个PRICE32这个啊,那我们这个东西呢,它有两个参数,第一个参数呢,它要填的呢,就是你刚才创建的快照的一个快照句柄,那现在呢,我就可以把这个句柄给它填进去啊在这啊填句柄,然后第二个参数呢,是什么呢?第二个参数就是你要这个的这个结构啊,你看没LP。
06:01
这是二啊,它这个东西呢,就是你要当前这个结构,并且你看前呢,它是一个in out并有的一个东西,所以说呢,它是同时具有这个IN2种属性的,就是说你可以把它输入,也可以把它输出啊,那当前呢,我们是要让它输出的啊,到某一个进程之后啊,我们要把它弹出。好,我们这个就是P32,然后取一下地址放进去啊,这样就可以了,那么它返回的是什么呢?它返回的呢,我们可以F12跟进去看一下,你可以看到它返回的是一个布尔值啊,那所以说呢,我们可以啊来直接遍历啊,这通过这种方式啊来遍历啊,然后判断它返回的是不是为这个处啊,那我们现在呢,我们可以直接一个这个呃判断,首先判断一下啊,判断一下if啊,它等于等于true的情况下,那么我们就开始啊进行一个这个do well循环,如果它等于处的情况下呢,我们就可以直接啊来这个让他先进来执行一次啊执行一次什么呢?打印,然后呢,如果说啊,这次打印结束之后,我们再去干嘛呢?获取它的下一个进程啊,就是PRICE32啊,然后next它的这个参数成员呢,是一样的啊,是一样的,没有什么区别,然后在这呢,我们就可以打印一些信息啊,我们可以直接啊,然后第一个啊是这个。
07:15
我们反斜杠N啊,然后括号。呃杠N,然后进程ID啊,进程ID,然后一个百分号D,然后换行,然后呢,我们输出一个这个负进程的ID啊,然后呢。再一个百分号D,然后再换行,换行完事之后呢,是进程名啊,然后呢,再给他来一个这个百分号S啊,然后再换行,然后再输出一个花,然后再换行,这是为什么这么写呢?一会儿大家就知道了啊,它其实输出了一种格式啊,我们一会儿就看到就知道了啊,首先我们三个东西,第一个是啊,这个静态ID啊,那我们就P32。
08:03
点。这个啊,点process ID啊,第二个第二个呢,就是附进程的ID,这个就是附进程的ID啊,然后再下一个呢,就是它的进程名啊,就是那个exe这个拍那个啊,看一下在哪啊。啊,这个file啊好,那么这样呢,我们就打印完了啊,然后呢,我们现在呢,在底下啊,给对它调查进行一次调用啊,我们来看一下我们重新生成。哦,成功了啊,我们运行。看到没有啊,我们输出的呢,就是这种形式啊,如果说你觉得这个形式呢,长得还不够好看的情况下呢,你可以给他在前面再加点儿东西啊。
09:01
好,我们重新生成一下。然后运行。看到了吗?它就输出了一种什么东西呢?一种类似于这个Jason的这个格式啊,你看着没,就是我们首先啊一个画框,一个画框,然后呢,键和值啊就是啊形成啊看到没啊,这种形式打出来利我们系统所有的进程啊,所有的是以这个式行打的,就是这种形式打印出来呢,以后你在这个做做这个解析的时候呢,也好写析一点,当然了,这是你需要存的情况下啊,你如果不需要存的情况下呢,你其实直接这个使用它这个结构里的信息啊,就够用了啊,那这个呢,就是我们这个C源的方式啊,那其实Python呢,它有更多的方式啊,有更多的方式啊,我们C源其实也不止这一种方式啊,但是今天就不多讲了,今天用一个进程快照就可以了,我们首先呢,创建一个Python的一个进程啊。啊,还是纯Python啊,我们还用这个三八版本啊,然后呢,这个名字就不改了啊,我们直接创建。
10:06
嗯。Python呢,首先也可以使用一种软件库的形式啊,那首先先把这些东西给它删掉啊。我们来包含一下啊,首先包含一个这个模的。QRT啊SYS这个先包上,包上完事之后呢,我们再来包MQRT,然后是这个PU啊,这个库啊,啊等会我看一下。有。T,没有吗?安装一下软件看一下。好安上了啊,安上之后呢,我们来用它一下啊,难道我创建错版本了吗?我看一下我这个技术解释器是啥东西。
11:16
嗯,算了,等会再说吧,那个我们现在呢,就来给他这个使用一下啊,写一个函数啊,然后呢,进行一个遍历啊,使用这种库的形式啊进行遍历。So,好,然后开始给他写这个它的内容啊,我看一下这什么毛病。函数名用小写,我操。啊,拼写错误就不管了,好,然后呢,我们现在呢,来给他这个实现一下啊,首先啊,我们要调用他的一个PSD的一个方法。
12:17
这个方法呢,它就调,它就返回了什么呢?返回了当前你进程的一个相关的一个这个进程信息的一个列表啊,然后通过这个类似于列表的东西啊,来给它返回啊,然后呢,我们就可以接着来调用啊,来取出它。For PID啊,In PS,然后。我想想啊。等于。等于我用我的这个软件库,然后调用一个这个process的一个方法。
13:00
诶。怎么没有呢?啊,PSD。诶,这奇怪了啊。传入一下这个PID啊,我看一下对不对啊,难道我用错版本了这个东西。好,然后呢,我是这个打印一下试一下啊。然后给它格式化一下啊,百分号S是百分号S100分号啊,然后括号第一个呢,我们要传入的是这个PID。
14:10
然后第二个要传入的呢,是它的一个名字啊,那就是INF。那。我总感觉我写的有点问题。调用一下试试啊。果然是有问题,这个模块奇奇怪怪的。我看一下啊,是不是新建的问题,这个东西。没有问题。
15:03
啊,这里TS。Pids,然后这里。SD。PID取出,然后。用它来获取它的PID,它这应该有一个叫做这个process的一个方法啊,我查一下啊。
16:27
他这肯定是有一个这个对当前进程进行封装的这么一个东西啊,他首先通过pids来进行返回啊,但是不知道为什么我这儿他也没有这个方法呢。哎,这回好像有了啊,我刚才是怎么回事。哎,可以了,我操这个名字不对啊,这个名字不对。
17:03
我看一下啊,这还是有问题啊,然后PID,然后PID。然后啊,传入一个PID。然后press in啊,这块忘写括号了,我操检查一下,马虎了啊。这回就对了啊,进程ID,然后这个进程名啊,这就正常打印了啊,这就是这个库的一个使用方法啊,正好也打开了,就给大家看一下这个库的其他使用啊,你可以看到啊,这个模块呢,其实功能性非常多的啊,也可以做一些类似于这个CP监控,内存监控,磁盘监控,网络监控和进程管理,现在咱们用的呢,就是它里边的这个进程管理的一个功能,你可以看到,首先用这个方法啊,以列表的形式返回一个当前正在进行的一个进程啊,你可以看到在这儿啊,在这儿就是返回了一个列表啊,我这儿应该把这个去掉啊好,然后呢,在底下呢,我们在这儿啊,使用这个process啊,对进程进行封装啊,然后获取一下它的一个信息啊,获取一下一些信息就完成了,那么它上面呢,还有一些他的一个其他的一个使用方式啊,比如常用的包括我们这个network的一个网络监控啊,其实呢,也都是很常用的啊,还有一些磁盘监控,那我们在Windows下呢,我们还可以干嘛呢,也不一定非要用它这种模块来这个使用啊,我们还可以使用原生的就。
18:25
跟我们昨天使用的那种一样啊,原生的那就肯定是这个,呃,在当前版本的能用啊,在linus就用不了啊,首先我们还是要用一个7TYPES啊,来调用这个我们Windows的一个这个接口,好,我们首先把它导入啊,导入之后呢,我们现在呢就来写这个函数啊,好,然后呢,这是WIN32WIN32SO。这个呢,我们使用起来呢,相对于其他的呢,要复杂一点,为什么要复杂一点呢,因为这里边呢,涉及到呢,我们要自己来完成一些结构,比如说我们现在。
19:07
下来这个获取一些函数的一个地址啊,我们先这么写啊,嗯,我们在这边啊,我们用了这个创建进程快照的,然后等于这个东西呢,它在我们的温DL点三二。可能三二。呃,里边啊,在这里边啊,我们直接来放在这儿,然后呢,还有我们刚才用的这个process,这个process first啊,开始的第一个,还有这个N,他们俩呢,也都在我们的这个可能三二里。好,然后我们嗯,还要用啥吗?还没啥了啊,有有可能你需要这个关闭一下这个快照的竞争句柄啊,但是我这就不关了啊,这就无我无所谓啊,然后呢,现在呢,我们就直接啊来用一个变量啊,一个这个快照的一个句柄啊,来接收一下啊,我们调用这个呃,创建金快照,那么它呢,还是那两个参数,但是呢,我们第二个参数可以直接写个零,但是第一个参数呢,我们在这个Python这个里边肯定肯定是没有这个红的,所以说呢,我们先要把这个红啊给它声明一下。
20:33
我们直接以一种变量的形式啊,给它定义出来,当然你这个可以写全局变量,你也可以写这个局部变量啊,直接写在你的这个函数里头也可以啊。好,那现在呢,我们这个第一个就有了啊,我们创建出来了啊,那我们现在呢,就给它放在这儿啊,这样就没有问题了,没有问题之后呢,接下来我们第二步啊,就开始便利它的第一个啊,利它的第一个,那么这个时候呢,我们要定定义一个这个结构啊,因为我们在这个呃加这边啊,我们是直接有一个叫做这个PRICE32的这个结构可以用的,但是在我们Python这边,我们是没有这个东西的啊,那怎么办呢?我们要自己来定义这个东西啊,所以说呢,它稍微麻烦一点啊,那我们首先呢,给它复制过来啊,1:1对着弄啊,我们先把它注释起来。
21:27
那么我们在这个PYTH里头如何使用这种结构呢?那就要用到我们PYTH里边的类了啊,我们直接明一个class,然后呢,这个呢,我们就给它起名这个ENT2,然后呢,给它是一个结构,它是一个结构。Str这个。然后呢,给他处理啊,它里边的一些字段。
22:09
嗯,首先呢,我们把他们一个个啊都用这个呃,C的形式啊给它表示出来,首先第一个是他名字啊,就是成员的名字就是DW,然后呢,它是C里边的,我们可以用这个int,也可以用这个U浪都是可以的啊这两个呢,它长度一样,在32位下都一样啊,我们这个沃呢,在32位下呢啊,64位下一样啊,都是这个四字节所int和右浪,你可以任任选一个啊来进行对它的一个这个使用。然后逗号啊,我们再给它来把底下这些啊依次啊都给它做了啊,这里边呢,基本上除了最后一个都可以用优浪来形容啊,这些呢,都是都可以用优浪来形容它的这个长度啊,这里头唯一唯一的一个比较差别的就是什么呢?就是最后一个它是类型啊,然后呢,这个max PA。
23:07
我算一下有几个,1234567899个啊,我们直接复制一下吧。456789。好,那上边呢,都是优浪啊,那下边这个就不一样了啊,它肯定是不一样的,因为这个东西都是一个字符串了啊,肯定是跟上边的没什么关系了,那我们直接啊,还是把它的这个名字拿出来,那么它是什么类型呢?它是一个C的下边的一个叉类型,但是它不是一个叉,它是260个叉啊,这个需要给它手动给它指定一下,好,那现在呢,我们就定好了这个结构的这么一个类啊,定好了结构这么一个类,然后呢,接下来呢,我们就可以使用了,呃,我们把它的名字啊,我们简单复制一下,然后呢,在这边啊,对它的类啊,初始化出一个这个对象吧,应该算是T32啊等于它。
24:23
然后呢,我们要现在呢,首先呢,要初始化啊,这个P32里的这个DW size这个成员。啊不对,我没加括号啊,怪不得他这个每个上面都要加个括号啊这样,哎,这样不行。啊,好像没有这个功能。
25:21
好啊,这样就没问题了啊,然后我们在这边啊,给它进行一个初始化PE32。点DW size等于。嗯,我想想等于set off。好,然后呢,对它的结构尺行初始化之后呢,接下来呢,我们就要来调用啊,调用我们的这个啊二,然后来这个获取它进程的第一个进程的进程信息,那么我们第一个参数呢,是我们返回的这个快照句表,第二个参数呢,是这个一个结构啊这个结构,那么这个结构呢,我们要取地址啊,那跟上节课一样啊,我们还是使用它来取一下地址,然后现在取完地址之后呢,判断什么呢?判断它返回的是不是false,如果是false呢,就说明获取失败了,如果没有获取失败呢,我们就直,如果获取失败了呢,我们就直接return,如果没有获取失败呢,我们就接接着往下走啊,就进入一个循环,呃,我们就这个while进行一个死循环啊,然后我们这么写,我们给大家在这儿啊,返回一个这个生成器啊,成一一个生成器啊,一个PE32。
26:48
然后接着呢,我们去遍利它的下一个啊,就是啊。还是一样的参数啊,也是穿一个结构的一个地址也是啊,如果失败了啊,就直接返回啊好就这样,然后呢,我们来调用一下试试看啊,我们在这边呢,调用的方法呢,有一定的区别,首先我们把上一个注释掉,嗯,注释掉之后呢,我看一下啊应缩进。
27:24
嗯,不知道说到哪啊,我们直接把它去掉啊在这。这个东西呢,它会返回一个类似于列表的一个东西啊,所以说呢,我们用一个这个。啊list啊,来接收他一下。接收完事之后呢,很明显我们应该用一个这个for循环啊,对它呢,进行一个捞出啊。啊,或者叫process info啊,然后in啊这个process list,然后呢,现在呢,我们对它呢,还是呢进行一个打印啊,打印方法呢,基本跟这个我们C语言的差不多啊。
28:11
杠N啊,然后应该是。不对,我前面应该先来一个这个括号,然后杠N,然后是这个name啊,然后百分号S。然后换行。然后是附进程IDID。然后行D,然后换行,然后呢是本进程ID啊,然后呢,这个。外号D啊,然后换行。然后呢,再给它封一下,然后换行换行啊,这样问题不大了,然后呢,在每一个前面呢,我们可以再来给他干一下T啊看一下T。这个T就是T吧,其实啊,然后后边呢,跟的呢,就是它格式化的东西,第一个呢,就是我们这个结构里的。
29:09
这个什么呢,这个SZ。SE。啊,我卡了吗?第二个是附进程ID啊,附进程ID。第三个啊,是这个当前进程ID。
30:11
啊,这。好啊,你可以看到我们就完成了便利啊,没有任何问题,并且输出的呢,跟我们这个C加加写的形式也一样,也是一种这个C的形式啊。啊,我这不知道为什么显示了一个网络不稳定,学生听课可能会卡顿啊,如果你们没有卡的情况下呢,你们现在可以提出一些问题啊,咱们这个呢,实际上就是用Python啊,然后复写了一遍我们这个C加加的这个呃函数啊,但是它里头有唯一的一个问题是什么呢?就是我们这个结构的问题啊,我们这边的结构呢,需要自己来明,其实呢,我们不是今天遇到会遇到这个问题啊,比如说我们后续啊,我们调用一些类似于这个,嗯。
31:08
啊,调用这种函数的时候,他遇到这个东西问题更多,为什么呢?我们直接跟进去看一下,它这里头有大量的结构,你知道吧,你比如说啊,我这些前边你说我前面都不填,但是这个啊,这个start up info和这个information这两个结构是必填的啊,那里边里边这个东西你就得自己把它一个个的全都转换成这个我们刚才那种类的形式啊,所以说就比较麻烦。呃,因为有一些场景上,你决定了你只能用Python啊,所以说呢,这个倒也是强逼,这没有办法,如果说真的是用C用pyon都行的下啊,如果需要用A建用这个啊,但是你比如说有些人他可能会用Python一些这个具啊啊,或者说用Python写一些这个类似远控类东西,那可能只有这个调用A的时候它是麻烦的,那其他可能都是Python起来比较,那这种情况下,其实你用Python是合理的。
32:08
或者说啊,你比如说这个瞎加,他如果源码这个监控,这个执行监控比较严格,杀毒不好绕啊,然后Python呢,它很容易就可以免杀,那这种情况下你只是麻烦麻烦啊,那你说你用不用Python,你肯定用对不对。但是因为啥都没有,有时候还没有提示啊,写这玩意儿确实挺恶心的。Python本身是一个很方便的语言,但是你这么搞他就不太方便了。
33:13
对,Python就是调用这个,呃,调用API的时候麻烦一下,但是如果说你用的是C的下家的话,它处理文本什么的,它会一直麻烦啊。然后呢,没有关注主播的这个点点关注啊,我感觉快到你了,那我关了我走了。
我来说两句