00:00
今儿呢,咱们讲一下怎么用这个这个呃,Python啊进行一下这个第二注入啊,它主要原理呢,还是远程线程注入,咱们呢,先把这个原理简单说一下,然后呢就开始写代码,呃,用C加加或者C呢,大家想必这个对这个远程线程注入这个东西呢,也不是特别陌生啊,但是用Python来写的呢,还是比较少的啊,咱们来看一下啊,这个东西怎么弄。首先呢,我创建一个C加加的空项目啊,咱们先介绍一下它的一个原理啊。
01:10
我们这这节课的一个重点,它主要在一个东西上啊,就是一个这个现程这么一个东西啊,现程这个东西呢,是可以由你自己来进行一个开辟的,很多编程语言呢,也都为你提供了这个多线程编程的一个基础,比如说你可以用下家的这个某些库啊,也可以实现很多种的多线程啊,然后Python啊,肯定也是,呃,其实Python这个东西也不算啊,然后呢,我们这节课呢,就主要是用线程这个东西啊,是用这个Windows原生的这个手段啊来进行创建线程,如果你是在本进程内啊创建线程,你调用的API呢,就是create,那如果说你要这个,嗯,不对啊,我这个点一下,如果你要进程创建的话呢,你就要用这个。
02:01
二一。Remote啊,就用这个啊,但是它们俩呢,有一个本质是相同的,就是它们俩的参数里都有一个叫做start address的一个东西啊,我们首先直接F12过来看一下啊,来大家看一下啊,这里头呢,其实呢有这个几个参数啊,首先这个是在本地创建线程的一个东西啊,那这边呢是什么呢?这个是本地的啊,它返回的是一个线程,线程句表一个handle啊,然后这边呢,是返回一个你当前创建出来的个进线程的一个线程ID,那么其他的一些东西是什么呢?首先这个东西啊,这是一个创建时候的一个flag,这个呢是占的一个尺寸,这个呢是现成的一个属性,那么真正我们最关注的是什么呢?是这两个参数啊,你看这个参数叫什么呢?就是我刚才说的啊,LP这个address啊,然后呢,它呢是一个什么呢?一个函数指针,那这个是什么呢?一个lp word个参数啊,一个参数,这个参数呢,就是给这个数用的,它上边这呢,实际上的写的呢是一个数的地址,但是不一定非要函。
03:03
地址啊,你直接写一个代码块的一个起始位置也没有问题啊,然后呢,它这个限制这个你看啊,这个它这个呢,就是什么呢,这个名字它就说说明它是一个它的这个,呃,现成的一个这个启动时一个东西啊,我们是F12跟进来,你可以看到它上边这个就是它的一个原型啊,它用它比范啊做成了一个这个函数指N啊,然后它返回呢,是一个,然后里边呢是它的名字啊,这有一个参数,这个参数呢,实际上就是刚才的那个下一个啊correct啊,它的下一个参数啊就是这个,然后呢,我们再看啊,它这个除了这个之外没有其他东西了,那我们现在呢,就把这个函数拿出来,它这个能够启动的这个函数拿出来啊,它长这个样子,那么我们为什么要特意说一下这个问题呢?就是它这个里头还有一个函数叫load library啊load library,它这个load library呢,分A版W版啊,那无论A版和W版啊,他们的这个基本这个样式啊是一样的,那么我们来看一下啊,就是这两个东西啊,那啊它能创建这。
04:03
这个函数啊,进行一个线程啊,运行器运行一个函数,那么我们这个函数呢,要是这符合这个模板的,那么我们来观察一下啊,首先它这个函数指针它的返回值啊,我们来一一对比啊,首先一返回值,返回值这个默认的这个可瑞的一个启动地址是个什么东西啊,它很明显它是一个这个一个四字节对不对,那么我们的这个h model是个什么东西啊,它其实也就是一个什么呢?一个四字节的一个地址啊,只不过在load library里,它是什么呢?它是由这个模块返回的一个加载机制啊,所以说呢,它其实都是一个四字节数据啊,这两点他们俩的返回值是一致的,然后呢,他们俩的这个调用约定,调用约定调用约定呢,你其实可以看到啊,他们俩调用约定都是VAPI这个PI呢,实际上就是SD啊,这个标准的这个啊二的一个调用约定啊,所以调用约定是一致的,这就没有问题了,然后接着呢,你可以。
05:03
的啊,我们这边的这个这个Korea,它的一个这个调用函数,它的这参数是RP word,而我们这边呢,是什么呢?是这个lab file name的一个RPCWSTR,但是实际上而言,这两个两个参数都同属于什么呢?一块内存区域啊,一块内存区域,那么这些东西一致了,那么我们说明一个问题,我们这个名字啊,函数名其实就无所谓了,我们这两个函数完全可以混着用,也就是说我们create three完全可以调用这个load library,那么这时候啊,我们就可以知道了,调用load library,那么传入它的参数在哪传啊,它还有一个参数对不对啊,我们刚才看到的它下一个参数就是它的参数,所以说呢,只要在createad的时候,把它你要加载的这个模块的一个路径放在它第四个参数上,就可以直接加载进来了,但是呢,这个呢是本地的啊,本地的create threead啊,那这个时候我们如果在远程里边啊创建线程,那就要用这个了啊。那么这。
06:03
这个呢,它的参数呢啊,跟前边呢大致相同,大致相同啊,返回值呢,也是一个呃句柄,然后呢,它是有一个线程ID的一个返回,这是创建的一个flag啊,这个呢是线程属性,然后这是占大小,这两个就是我们最关键的start和这个参数啊,但是它多了一个东西,这个是这个handle啊,一个H个啊那么这个时候我们的这个流程就是什么样的呢?首先呢,我们肯定是要干嘛呢,第一步。第一步啊,打开。打开指定进程啊,这个叫什么?这应该叫注入流程啊,注入流程首先打开指定的进程,打开指定进程之后呢,我们需要第二步啊写入啊,这个要即将啊加载的模块路径。
07:03
目标进程内进不目标内存空间内啊,进进程内存空间内,但是这时候有一个问题,你是怎么得到的它的目标的内存空间,所以这个它肯定它不是什么呀,不是这个第一第二步,它是第三步,第二步是什么啊在。目标进程内开辟一块空间啊,并且返回啊返回地址,那么这个呢,我们就要调用一个什么呢?远程的这个创建这个近创建内存的这个函数啊,就是说visuallo ex X啊,如果是visuallo呢。如果是visuallo的,那实际上就是在这个本进程内创建啊,但是如果你是visuallo ex带ex呢,就是在目标进程内创建,我们可以F12进去,你可以看一下啊,它呢也是有多了一个什么呢,和这个相比呢,多出了一个H啊,然后呢,可以直接啊指定在目标某一个目标内,然后呢,这有一个这个地址,这尺寸啊,然后底下是这个啊内存属性和这个页保护啊好,那么这个呢,就是我们要这个用来申请内存的啊,那我们已经知道了,知道之后呢,我们啊对打开指定进程的这个按流程来,我第一个应该是调打开指定进程的,我们用这个open process就行了啊,那这个是它的三个函数啊,这个流程上用的东西啊。
08:32
调用的函数,然后呢,我们把它写入去后,我们要我们要一下我们这个个地址在载。然后呢,你就可以把它啊这个load library。获取地址,然后呢,你就可以把嘛,当我们的这个的一个数进行一个这个,然后它参数是什么呢?啊,参数就是我们刚才写过去啊,然后获取到的那个空间的地址啊好,然后调用啊,这样呢就创建起来了啊,如果成功就成功了,如果没成功呢,那就是没成功,这个呢,就是它的一个创建的一个流程,好那么我们介绍完原理和流程之后呢,我们开始来写这个代码,我们直接打开这个PRM啊呃,Python呢,它这个东西原生呢,它带了一个这个编辑器啊,但是那个编辑器呢,不是特别好用啊,所以说呢,一般情况下我使用这个VS啊v studio或者说这个p charm来进行开发啊,你随便起一个名字都行啊,然后呢,我们这儿啊,这个是这个选择一下啊,选择一下它的这个技础解示器,然后呢,我们就这儿创建不上脚本,你随便啊,如果你创建了,它会给你提供一个这个入口点啊,我们直接点击创建啊。
10:07
可以看到啊,这是他给你创建的一个模板啊,你可以直接点运行啊,然后呢,就跑起来了,它这有一个这个呃日志啊charm啊,它就这行打印的这个呢,If name啊,然后等于等于啊,这个may啊,这实际上就相当于Python啊的一中的一个入口点,跟我们这个C和加加的一个main函数呢,是一个道理上的啊,那么这个呢,就是一个这个打印的一个函数啊,这些东西其实是没什么用的啊,我们可以直接把它们全部清空,除了这个may之外啊,其实这个may你也可以清空,其实不影响什么,但是我们留着啊,我们留着接着呢,我们现在呢,要包含一些东西啊,首先是我们要包含一个这个SYS的一个模板模块啊,然后呢,我们因为要调用这个Windows的API啊,我们原生来说呢,它有些类型不支持的,所以说呢,我们要包含一下types,那么我们要所有啊I putt啊,然后星啊导入所有,导入所有之后呢,我们现在呢,就可以开始来写这个东西了啊,那我们可以给它封装成一个函。
11:08
数啊,也可以直接写在这个main函数里,诶,我看一下这怎么回事。啊,应该是啊。Types啊,刚才写反了,然后呢,我在这写一个函数啊,然后呢是一个这个inject。然后这个呢是insjt insjt呢我们现在呢,就开始写它参数,我们在输入的时候呢,一共需要两个参数,一个呢就是进程的ID啊,也就是process ID,还有一个呢,就是这个model一个模块的一个径啊好,然后我们就开始来写的一个内容,那我们都需要什么呢?刚才我们已经讲过了,首先我们要打开什么呢?打开它进程对不对?所以说呢,我们首先啊返回一个啊进程的一个句柄。
12:03
然后是这个,我们用的是这个科no啊,我这样先定义一个克NO32吧,防止我一直在用它啊克NO32。等于温DL点啊克三。好,接着呢,我就可以直接在底下啊调用这个三二,然后呢选择三二点啊这个open啊,好接着呢,我现在呢要往里头传东西了,对不对啊,那传东西我现在理论上应该传一个这个process的一个这个保权限,但是因为我们这边是不支持这么干的啊,没有这个红啊,那所以说呢,我们要自己定义啊,所以说呢,我现在呢就直接啊在这边写一个open。然后呢,我现在在里边啊,直接把这个红啊啊,这样它F12进去,你可以看到它是有两个啊,有三个东西啊,来进行这个组合起来的啊,那我现在首先把它那个名字拿过来啊,在上边啊给它声明出来,然后呢,我们往后看,首先最后一个四个F这个东西它是肯定不会变的,然后中间都是用来这个搞的啊,那我首先这个我们肯定中间是有一个的啊货货呢我们看一下啊,剩下两个值是什么啊,你可以把直接把这个值拿过去啊,不需要再把那个红也拿过去了,好,然后我再货啊还有一个。
13:38
好,这样呢,我们就拿到了它这个price all的一个这个值啊,拿到这个值之后我们直接填进去,然后第二个参数呢,是否就认证句柄,我们一个false就行了,第三个呢,是你要打开这个进程的进程ID啊,我们整择参数里的这个process ID啊,我们直接拿进来,拿进来之后呢,接下来呢,我们判断一下我们这个express是否获取成功了啊,直接一个这个if not啊判断一下,如果说啊,它没有获取到,如果没有获取到我们就直接退出啊,比如说调用一下SYS里的e sit啊,然后这样呢,它就退出了啊,比如说我直接传一个零的退出码,那如果没有退出的情况下,说明它就加载进来了呗,那这个时候呢,我们就要来申请内存了,那申请内存呢,它会返回一个这个地址,我们用一个皮address啊,然后呢,来调用我们这个CAN32里边的这个,呃,VR为VR tu al说ILO ex啊,我们调用它,然后呢,第一个。
14:39
参数是我们刚才返回的h price的一个句表,然后第二个呢,我们传一个零啊,它是那个地址啊,地址我们不指定啊,如果指定的话,你需要在这填一下指定在哪?第三个呢,是DR的一个长度,因为我们Python里边默认情况下呢,它是一个呃,Unode啊,所以说呢,你需要给它乘以二啊,就是说你的这个模块的一个长度啊,实际上是等于什么呢?等于你计算一下你这个模块路径的长度。
15:11
计算完之后,你需要乘以二啊。然后呢,你把它放过来就行了,这个得到它长度之后呢,那接下来呢,你就要来这个,呃,设置它的内存和这个页保护了,那么内存呢,我们这儿呢,就是一个虚拟内存,我们直接给它,嗯,设置一下啊设置一下。我们这应该使用一个memory那个那个东西啊,那我们直接来设置一下VR tual。这个是我们自己定义的啊,这词语原理没有啊,Memory等于它应该应该是这样的啊,我来看一下啊。那个红是memory啊,是这个这个这个和这两个啊,我们直接是一个一千一个2000啊,我们复制过来。
16:09
和一下。好,然后我们把这个属性放在这儿,接下来呢,是页保护业保护呢,我们给它写一个这个读写就行了,我们不需要它执行啊,对吧,它是作为参数存在的,所以说呢,我们需要一个read,然后这个read呢,它是四啊,那我们就直接给它放过来。好是个四啊,然后我们把这个四放进去。这样呢,我们就已经给他这个填好了啊,还呃那什么,如果说是那个需要工具源码视频课程的,可以联系咱们助理进群,也可以直接关注咱们的这个,呃,老马也可以啊,对了,还要这个注意关注一下主播啊,然后以后这个直播的时候就可以这个接到通知了啊好,然后呢,我们给他申请完内存之后,我们刚才写的下一步啊是什么呢?我们来看一下。
17:11
下一步呢,我们现在呢,就要来在这个写入啊,进行加载的模块路径到这个目标的这个里边啊,所以说呢,我现在我们要调用一个这个,呃,White price memory这个函数啊,那我们现在呢,就直接给大家进行一下调用啊,也是科三二里的,我们就直接来写一下。W。I price memory好,那么我们这个we price memory呢,它有几个参数呢?首先第一个参数啊,还是一个进程的一个句柄h prices啊,然后第二个参数呢,是你要写到哪啊,这个我们刚才通过visual ex返回了一个地址,我们这把地址写过去啊,然后呢,我们这个地址完事之后呢,就是要写什么啊,我们这写的呢,就是我们模块的一个这个一个路径。然后接下来呢,是你要写多长,多长呢,我们在这有一个model这个东西啊,我们可以直接给它放进去啊,放完之后呢,我们这个长度就有了,接下来呢,它是什么呢?它是这个,呃,在这个细细原理啊,我们来看一下它细原理啊,这个比较特殊啊,需要特殊说一下,我们直接F12进行看一下,你可以看到最后它是赛制杠D的一个指针啊,那理论上而言呢,我们其实呢,用一个底的也就行了,因为赛制杠T它是一个属于环境变化的一个这个呃类型啊,但是我们现在这个类型呢,它是这个,我们现在是32位的一个Python啊,所以说呢,我们直接指定就行了,比如说我现在啊设置一下啊。
18:37
RNGTH啊,我们直接给它用C语言的类型int啊,给它初始化一下,初化成零啊说化了成零之后呢,我们直接把它放在这还是不对的,为什么呢?因为它实际上是一个指针,那这个时候你在PYTH里没有指针怎么做啊,你就直接用这个东西啊,这个函数啊,你来取它啊取它就行了,相当于和指针是一个效果的啊好,这样呢,你就传进去了,传进去之后呢,现在呢,你就已经把这事儿做完了,做完之后呢,你可以来这个加载一下这个呃,克三二的一个这个聚柄啊H克三二,然后等于啊这个K32.get。
19:20
Model handle w handle32点点好,这样就加载进来了吗?加载进来之后已经拿到它的模块地址了,我们现在就可以直接来搞这个load library了嘛,Load的lib,呃,Lib r好等于啊CANNOT2点get PC address,这需要有一点要注意的是什么呢?就是我们如果有W的这种啊,因为它默认情况,默认的一个环境是这个UN的,所以说有W这种直接使字符串是没问题的,但是这种没有W的这种呢,它这个在处理字符串的时候的话,会强制,如果是你是unode的这个,呃,字符串呢,会给你切断哈,会给你只剩下一个字节,那么这个时候怎么办呢?这个时候呢,你就来这个。
20:16
呃,这个时候你就干嘛呢,你就要给它强制转换成差类型啊,类似于常转换啊,其实就是指明一下啊,你要加这个字符串前面加一个B啊啊,但是它的第一个参数是这个C能三二啊,所以说第一你先把C能三二放上,然后呢,加后边加一个BB,完事之后再写你干嘛,你要的这个字符串,比如说它是一个这个load的啊BRA啊,然后是一个那个啊我们用W版本的,好,那现在呢,我们就已经获取到这个library的一个地址了啊,然后接下来呢,你就可以调用远程线程啊,然后把这个东西创建起来了啊,那它呢,肯定是这个会这个返回一个现成的一个句柄的啊,但是呢,除了现成句柄之外,他还有一个什么东西,他最后会,他这最后那个参数大家不也不知道,还记不记得啊,我们刚才有这个过去简单看了一下,就这个函数啊,它最后一个参数实际上是一个指指针的lpd word啊,是一个线程ID啊,所以说呢,你需要在这边定义一个什么呢?L。
21:16
T three的ID啊,然后把它地址传进去啊,所以说呢,现在呢,你要简单的给它触始化成一个这个C元的这个U浪啊,然后给它触化成零就行了,好接着呢,我们这有一个这个h three的已经写在这了嘛,接着我就调用这个可能三二啊,然后点啊我们刚才那个有点长,我直接在这边复制啊,就是这个,嗯,复制过来啊,然后呢,我们给他填一下参数,首先第一个参数呢,肯定还是我们的这个h process啊,一个进程句柄,第二个呢,我们看一下我记得是个什么东西来着,第二个啊,这个第二个这个特性我们不用啊,那我们就直接给它写一个不用的啊NNE就代表不用,然后第三个呢是占大小,我记得是个零就行了,然后呢,我们第四个呢,就是你要启动的这个函数啊,函数的这函数地址,我们给它调用一个这个h process啊,这其实呃不不是h process啊,是h load library啊,然后呢,我们这个h load library之后呢,是它的参数啊,我们在目标里调用load library,那它参数肯定是我们那什么啊,我们这个地址对。
22:17
对不对啊,那我把地址也传进去,地址传进去之后呢,它下一个是什么呢?下一个呢,我记得是一个没啥用的东西啊这个啊对flag啊flag呢,传个零就行了啊,然后最后啊,最后是线程ID啊,线程ID呢,你也要使用同样的方式啊,给它这个转换一下。好,那这样呢,我们就创建起远程线程了,那么接下来呢,我们就可以判断一下这个远程线程到底有没有创建成功啊,你可以通过这个线程的一个句柄啊来进行判断,If not h,然后呢,如果说成功了啊,我们怎么样,如果失败了我们怎么样啊,那我这里呢,我就来这个,呃,再调用一个U32啊U32。等于啊V点点这个,嗯,U432,我们直接用U32里的这个窗,这个弹窗啊,我们来弹一下啊,点mesa boxxw啊。
23:09
然后啊,复口句no,第二个啊是它的这个成功与否,如果是not啊,If not这个h three,那肯定是失败了啊,那这呢就直接写一个失败啊就行了啊然后呢,第三个啊,第三个就是呃标题啊,标题呢,比如说我写个H啊,然后第四个呢,就是什么呢?第四个呢,就是这个嗯,按钮的按钮的按钮的那个属性啊,那按钮这个属性呢,你可以自己想加什么加什么,比如说我这就加一个m BOK就行了啊嗯,MK呢,就是这个零啊,那我直接在这儿啊,前面给它加一个红就行了。你直接把这个值写上,其实也不影响啥。啊,就这样啊,然后呢,我这呢,就写了一个啊,我叫M。这写错了啊。
24:00
他给我提示啊,我拼写错误啊哦,这写个MBK啊,这就弹出来了啊,然后呢,我这呢,还得有一个else啊,因为它如果成功了呢,成功了呢,我就用一样的东西啊,我用一样东西给他弹一下,但是呢,我这就是成功了嘛,所以说呢,我soss成功,然后呢,我在这呢给他进行一个格式化,我把它地址给弹一下啊A啊好,然后点format,接着呢,我把它的这个地址p address啊弹出去啊,这样就行了。好那样基本上就写完了,完之后呢,我们现在呢,完成给调用一下啊,我们又调用一下这个啊,然后注意一下,接着呢,我们把我们的这个create的一个目标进程出来。掏出来之后呢,我们现在呢,要把这个test这个这个这个东西啊注入进去啊,我们首先用注入器注入一下看看啊,我点错了,我点成调试器了啊。
25:03
好点一下注入器啊,注入器放哪了,我看一下啊。这儿。嗯。好,你看啊,这就是注入成功了,注入成功它会弹一个注入成功啊,然后呢,就是这样,那接下来呢,我们就把它这个关掉重启啊,因为它里边滞留的模块啊,我们需要重新启动一下,好那么首先呢,我们来获取一下它的进程ID啊,我们通过这个详情。嗯,C啊,93364啊,我们来给它填一下93364。好,第二个呢,就是它的一个这个路径啊,路径呢,我们就直接我这有点卡呢,我看一下这个性能啊。
26:00
55%的CP,我什么都没占,17个G内存。我去,居然是这俩玩意儿。啊,内存是PR这就可以,嗯,好,那我们来获取一下它的这个。路径。好,我们复制一下啊。然后直接贴过来啊,然后把这个我们的这个文件名也贴上来。贴完之后呢,要注意给它进行一个转移啊,要把这些东西单盖传给双盖啊。好,那这样呢,简单来说呢,我们就已经写完了,我们现在呢,可以运行起来尝试一下了啊,我们运行。好,你可以看到已经提示成功了,并且呢,它有一个地址了,那我们点这边来看一下,你可以看到这个东西呢,也就成功的注入进去了,说明什么呢?说明我们这个Python写的代码呢,是没有问题的啊,已经成功的运行起来了啊好,那如果有什么问题呢,你们就问一下,如果没什么问题呢,今天的这个讲解啊,就完事了。
27:10
然后没关注主播的啊,关注一下主播啊,没这个进群的进下群啊,如果想这个咨询其他课程的也可以加咱们助理了解一下。啊,没下课啊,助理马上就回来开始了啊,这个只是我就跑了。
我来说两句