00:00
呃,我们昨天讲到了这些,就是Windows的一个多开方法,然后我们昨天是利用这个啊,找到了一个游戏对吧,是一个呼制体的啊,一个游戏的一个检测啊,我们通过一个阴赖hook把它的一个互斥体给它过掉了,然后我们今天再来讲一种,就是另一种啊,就比如说昨天我还出了一个叫做进程隐藏啊,也能去过掉一个游戏的一个多开啊,但是呢,这个游戏的话,我是没找没找到,没找到就是谁去用,呃,便利这个进程啊,去做这个多开点,然后我们去这节课只是模拟一下。模拟一下,然后的话,我们去模拟的话。我们首先需要什么?呃,就是我们得写一个先写一个便利进程的一个代码,对吧?那首先的话,我们得包含一下Windows的一个头文件。windows.h啊,然后出示一下啊模拟,嗯,进程便利啊。便利。呃,检测啊,多开。
01:03
然后通过这个进程便利啊,这个东西的话,嗯,Windows提供了挺多API的,但是最常用的话就是我们那个创建啊,进程快照啊,遍地所有进程。啊,便利。便利所有所有进程。然后我们要用便利进程快照的话,首先我们还得包含一下,就是呃三二这个头文件。嗯,tlhelp32.h这个头文件。然后呢,我们就可以什么,呃,创建进程快照。啊,中间这个进程外照。啊,创建进程外账。然后我们就可以一。啊,来到官方啊,去看一下这些参数都这么写。那首先的话,我们得呃拿到呃他的一个红对吧,我们现在要是枚举这个所有的一个进程啊,那我们就可以天塌对吧?啊,枚举所有进程。
02:10
啊,枚举所有进程的话,第二参数要的一个是进程的ID,那我们就不需要了,填空就可以了,然后呢,我们保存这个便利。这个进程快到了一个句柄上啊。啊创建啊进程快照。之后的话我们都可以去判断一下。来判断这个句柄等不等于空啊,等不等于无效的。嗯,等于Y6。Handle value啊,那这个纸的话其实就是一个红啊,它就是一个负一啊,负一的话就是代表这个句柄是一个无效的,嗯,然后呢,我们可以打印一下。嗯。便利。啊创建啊,进程快照啊失败。
03:02
那之后呢,我们就可以什么便利它的一个快照当中的一个所有进程,对吧,那就是用到我们那个API。呃,12或的。然后用到这个API的话,我们就可以去,嗯。嗯,填需要填充一个结构体。那这个结构体的话,就是一个进程,它就会对应着一个啊这么个的一个结构体,那这个结构体当中的话,就会有我们的一个,呃,进程的一个可执行文件的一个名字,还有一些就是它的一个进程ID啊,那我们拿到这些东西就可以了。然后呢,我们准备一下啊,P132。嗯,然后我们可以看一下Windows这种结构体的话,它的有游戏的结构体,它的为了扩展它的一个第一个成员是一个结构体的一个大小啊,所以说我们想用这种API这种结构比的时候,需要把它那个大小啊给它填充一下,那我们就set off。
04:04
呃,填充一下我们的一个结构体。之后呢,第一个参数的话,就是刚才我们要创建的一个进程的句柄啊,这个快照的一个句柄,然后之后呢,我们的一个结构体啊,就是刚才我们创建出来的一个结构体。啊,每个进程未对应会有。一个结构体。那我们现在通过这个API的话,就是获取到了第一个进程啊,获取到了啊第一个进程。之后呢,我们就可以去通过它的一个返回值啊。返回值。啊,去循环的去获取下一个啊进程,因为我们要把所有的进程给他遍历出来,那么如果这个API等于失败了,对吧,这个API的一个反馈值等于失败了,那就说明没有进程了。那之后我们下一个进程怎么去获取,然后就是通过它的第二个API啊,把这个first改成下一个next啊,就是获取下一个进程。
05:07
那之后呢,我们就可以把什么所有的这个进程给他编列出来了啊。北行。S杠二杠N,然后呢,进程的一个ID对吧,还有个进程的ID白胖D杠二杠N。然后我们把什么P132你的一个结构体。啊,名字。还有一个就是我们那个进程ID。呃,进程的ID,我们找一下进程ID,那这样的话,我们就把所有的一个进程给遍历出来了,对吧。然后我们运行一下。嗯,有点卡是吧。嗯,然后啊,然后我看一下啊,啊,那这个就是一个字符集的一个问题,对吧?啊,那字符集的话,我们现在改成什么啊,改给它改成这个。
06:04
嗯,我自己。呃,改做之节的话呢,这个位置的话,我们这个结构体就变成了。嗯,不用W版本的一个结构体的,然后我们重新填充一下,然后我们重新运行。然后你就可以看到对吧,我们那个一个所有的一个进程啊,就全部给他遍利出来了啊,便利出来之后的话。我们为了防止多开对吧,啊,一般的一个多开检测啊,防止多开我们就可以诶。我们就可以什么。如果。啊,去判断了啊,那我们这行代码就可以先给它注释掉,那如果什么,如果我们的一个进程的一个名字,对吧,我们用这个字符串比较。如果进程的名字,也就是说我现在的一个遍地出来的可执行文件的一个名字和我当前进程。当前进程那个名字,那我当前进程的名字的话,肯定就是我这个,呃,项目那个名字对吧,然后给它复制出来。
07:06
加上一个字符串啊,点一差一啊,如果它俩相等,那就说明什么。啊,找到了一个进程对吧,那之后呢,我们并且一下,并且什么当前的一个进程ID啊,我们还得去判断当前的一个进程ID。就是我们通过这个遍地进程快照的啊,出来的一个进程ID。啊,进城ID。不等于啊,当前的一个进程ID。ID。那就说明什么,我们就发现这个已经发现了两个项目了,对吧,因为什么我们找到了一个和我们同样的一个名字,但是呢,他的一个进程ID和我当前进程ID它是不一样的,那就说明什么,他已经开启了第二个工程了,对吧?那就我们就可以什么,嗯,发现啊多开,然后呢,刚才上。
08:07
啊,我们就可以退出了,对吧,然后我们重新生成一下。啊,生成完之后我们就可以什么。嗯,运行一下,那这次,诶,那我这个还得来一个这个位置对吧。来个暂停啊,开唱。然后重新生成。然后我们打过来打开。啊,这是第一个进程没有什么问题对吧,然后我们开启第二个啊,他就发现多开了对吧,然后程序就什么两个程序就退了,那这个现在的话,我们是一个模拟啊,模拟游戏通过遍地进程的时候啊,他这个遍地堕胎,那我们就得想办法去给他什么啊把它这个过掉对吧。
09:05
啊,如何把这个遍地进程那个位置给他过掉。嗯,过掉。那过料的话,它这个思路也比较简单对吧,它无非就是说通过什么,通过我们这个创建进程快照这么个PI,为什么说是创建进程快照这个API,因为什么在我们在获取第一个进程的时候,也就是说在这个位置啊,也就是说我28行代码的位置的时候,我们的一个什么进程清单,它已经有了,那进程的,嗯,所有进程的。啊,氢弹文件你可以理解为它已经有了。然后呢,这个API的话,他也是在便利这个进进进程清单那个文件啊,也就是说这个API。啊,他是。已经开始啊,遍地进程的清单文件了。啊,这个循环呢,和这个API它的它俩是配合,通过这个清单文件啊,一个进程一个进程这么拿出来这个信息,那我们就可以什么去伪造这个进程清单的一个文件,对吧,我们就可以什么在这个位置进行一个伪造。
10:15
那怎么伪造我们是不是就把他这个已经生成好的这个清单文件啊,已经生成好的一个清单文件,把我们的进程啊拿出去。啊,把我们那个进程给他拿出去,是不是就就可以了。之后的话,我们就可以什么啊,通过这个什么,呃,遍地进程快照这个API,那我们就应该知道了,对吧,他伪造出来清单文件,这个API无非就是什么,其实就是这个API啊造成的,也就是说这个它的一个结果。它的一个结果啊,就会呃。生成啊清单文件,那我们昨天学了这个户对吧,那我们现在是不是就可以去hook这个API啊。
11:05
然后那我们像我们昨天去创建互制体这个API啊,我们就知道他去他获客的点是什么,我们无非把他的一个第三个参数啊,也就是说这个名字给他改掉。名字改掉,但是这个API您可以看一下,我们就算给他户克了啊,给他户客了,但是我们现在不知道去改什么参数对吗?所以说我们得去什么找到找到。找到他的啊底层函数。啊,找到它的一个底层函数。那怎么找到它的底层函数的话,你可以用这个IDA或者是什么OD对吧,然后我看看这个YS里能不能跟踪出来啊。然后我们转到这个返回边啊,然后呢,我们。嗯,我们看一下啊。嗯,F4F4F11进来啊,F11进来。
12:01
啊进来,嗯,然后我看到了他这个没有符号文件是吧,像这些的话,它没有符号文件,所以说的话,我们还得通过这个IDA啊进行一个分析。然后我现在,呃,我看看我这个操作系统上有没有这个带文件啊。我找一下啊,我先找一下这个这里也可以啊,那我们就不通过这个IDA了,因为我这个还没有下载这个符号,然后你就可以看到啊,这个字体,这个字体,嗯,你可以看到啊,啊创建进程快照这个API,然后你就可以看到它的一个底层调用,其实调用了什么。我们现在是什么啊,要去遍利所有进程的嘛,那你看看这几个哪个项是便利所有进程的个API,是不是只有这个项啊,所以说我们再点进来,点进来之后的话,你就可以看到什么,嗯,我们往下找。往下找。啊,创建进程。嗯,然后你就可以看到啊,我们找一下。在什么位置,在这个位置。
13:01
啊,你可以看到在这个位置,它用到了一个呃函数。啊,在这个位置,它用到了一个函数,那这个函数,这个函数我们可以拿过来看一下。这个函数。我给他出治疗。那这个函数的话,您可以看到对吧,有个叫NT查询系统进程信息的一个API。然后呢,我们都可以看一下这个API。啊,我去这个一看一下这个微软官方。你就可以看到微软官方的话,它这个API怎么说明的,呃,然后我们看一下它的第一个参数传递的是什么,是一个红的嘛。然后你就可以看到它返回这么个进程信息的一个数组啊,每个结构对应的系统中运行的一个进程,也就是说它这个遍地进程快照的一个API,它是怎么把这个所有系统的一个所有进程遍历出来的,它其实就是通过这个API。我们就找到了,对吧,通过这个API。
14:05
啊,便利出来啊,所有啊进程。然后呢,每个进程它都会对应着这么个结构体啊。每个进程啊,对应着啊结构体。那我们就可以什么,先去用一下这个API,如果我们这个API会用了之后,我们再去呼和他,对吧?啊,我们去呼和他。啊,呼克他,呼克他之后。啊,改变刚才我们说的一个什么啊,它的一个清单文件对吧,改变他的一个清单文件就能达到我们的一个进程隐藏的一个目的。那之后的话。我们就得需要去,呃,用一下他这个API的对吧,然后呢,我们点一下它。然后。口味出来。因为他是一个什么,嗯。
15:02
NT系列里的我们还得什么?嗯,手动的给它加载上来,所以说我就得需要去type范一下。啊,然后这是一个返回值啊,这个是调用约定的吧,Std号,然后我给他改成问API啊,它也是std号。呃,之后。我打上一个括号。页面是函数之阵类型阿达括号。啊,加上一个星啊,再加上一个什么麦。啊,函数之阵就出来了,函数之阵出来之后的话,然后它就有一个什么info class这个枚举类型,但这个枚举类型的话,我们也可以什么啊点一下。啊,你可以看到他能查询好多信息是吧。诶,我怎么卡卡了卡了呢,然后复制一下。
16:05
啊,复制一下。然后呢,我们那个枚举类型就有了,对吧,然后这个API很强大啊,啊像这些啊,比如说我现在举例的啊这个位置。还有一些,嗯,看看找一找,还有一些调试端口之类的,全在这个API啊,都是通过它啊能找到的,我们找一下。诶,我看一下啊,我是不是复制错了啊,没复制错,我看一下啊,它的一些调试端口之类的啊,全通过这个里面啊能去啊发现那这个就和粉条是有一定关系的,然后我们先找一下,那这个序号为五的话就是什么,呃,便利。啊,进程的啊信息。然后我们有了这个之后,有了这个之后。
17:02
我们就尝试着用一下这个API,然后呢,我首先去干嘛定一个函数资产卖嗯,PC。然后我肯定是什么,通过这个手动的加载library对吧。啊,去获取这个NTL。点赞呀。然后呢,再通过什么艾特P7转。啊,去获取我们的一个函数的名字。啊,获取这个函数的这个名字啊之后呢,进行一个强转。有了函数名字的话,我们就可以先去用一下了,对吧,然后我们把这个下头这个加上一个get差,嗯,让它先别变利。
18:05
然后架一下,架一下。之后我就可以什么啊,传递传递我那个刚才写的这个参数了,对吧。啊,传递我们刚才写的这个参数。这个这个格式好乱呐,我把那个格式整一下。嗯,然后好。啊,然后的话就是第一个参数的话,我们刚才知道了对吧,看到它那个源码力也是天地的什么啊,叫查询所有的一个进程之后的话就是一个,嗯。它的一个缓冲区对吧,也就是说你这个要给地给他一个缓冲区的一个大小。
19:00
因为他要存储着我这个缓冲区要存储的一个当前的一个所有进程。要存储的我当前的一个所有进程,那这样的话我就可以什么啊,去准备一下一个缓冲区的一个大小。比如说我这个大小准备一个零叉啊,四个F这么大啊,你也别足够了,对吧?嗯,之后呢,我再准备什么,嗯,它的一个缓冲卷。啊,我这个缓冲区是通过这个扭出来的,动态去申请一下。Buff。等于什么啊,这个呃,New。差,然后这个大小呢,我就拗一个DW赛的。那我就可以把这个缓冲器传递给他。之后的话就是你这个缓冲区的一个大小,那这个大小的话就传递什么DW就可以了。啊,最后呢啊,它的一个实际你需要的一个缓冲区的一个长度啊,就是说它查询出来之后啊,它的一个实际大小是多少,那我们就可以什么DW对吧?啊正常的话是先去调用一下,先去调用一下它啊这两个参数它正常是先不填的啊传一个类型就可以了,正常是怎么回事,是我先去运行一下之后。
20:21
啊,这个正常是怎么用呢?它是先去调用一下啊,获取一下它这个实际大小,你可以看到实际大小,获取到了之后,我再什么啊,通过它的一个返回值再去动态申请,但是我们没有必要因为什么我们给他一个足够大的一个缓冲区啊,能存下它这个啊所有的一个进程信息就可以了,所以说我就只调用一回啊,那正常使用的话,就是你想正常使用的话是先什么啊,先去通过它,然后呢,这个位置我们呃准备一个啊迪沃啊DW啊赛的。Size的这么大小啊,我把这个啊传递给他。然后呢,这个位置写一个四字节就可以了,然后呢,呃,通过它的一个实际大小。
21:06
之后那这个缓冲区是怎么办啊,这个缓冲区的话,正常是通过它的一个实际啊缓冲区啊返回啊,正常是这么写,但是没有必要。因为我们刚才说了对吧,你调用一回,准备一个非常大的一个环境区就足够了。啊。那有了这个缓冲局之后,我们就得准备什么准是不是就准备这个结构体了呀?因为什么现在我们去申请了一大一个很大的一个缓冲区,它把我们的一个进程信息啊,全部存到了这个缓冲区里,那这个缓冲区呢,是一个宿主类型,对吧?它你可以看到是一个结构结构的宿主,它是一个结构体宿主,也就是说现在的一个。一个情况是这么个情况。嗯,我现在是准备了啊,这么大的一个缓冲区啊,这个是一个结构体数组啊,每个结构体我去换一下。
22:02
啊,这是一个结构体对吧,然后这是第二个结构体,第三个啊,以此类推。它是这么存放下来的啊,这段缓冲区,那我现在它这个每个结构体类型是什么类型,它是这么个类型啊,每个结构体它是个这么个类型。那我是不是就得需要把我这段缓冲区强转成啊这个指针类型啊,方便我们去便利啊。之后的话我就得,嗯,找一下这个结构体,那这个结构体的话,在这个微软官方它就有啊,我们拿拿过来。那查一下它这个结构体类型。啊,然后呢,我们就可可以给他拷贝出来。嗯,然后还缺一个UNO的实俊是吧,那我这个项目的话,还得给他改回什么,嗯,改回这个UNO的类型。
23:00
因为他用到了幽灵后勒士郡,所以说我这个项目的话,这些位置的话都得给他改一下,那这个。我就得给它改成什么,嗯,用宽字节的一个比较啊,那就是啊W。呃,用这个CSIP。啊,那这个位置我就加上一个L就可以了。呃,然后这有一个什么优先级,优先级的话我们改成迪沃就可以了,然后还缺一个UN的实训是吧?啊UN的实俊的话,我就可以去到这个。啊,源码里啊,给它拷贝出来,或者你有这个驱动啊,你装装过这个wik啊,你去wik里啊也可以找到。啊,然后拿拿过来。有了这些结构,有了这些结构的话,我们现在就是说一下最主要的一个成员,最主要的一个成员的话,就是它的这个成员,这个成员的话,他就是一个偏移量。
24:02
啊,你可以理解为是下一个结构体的啊偏移量。那么当最后便利到最后了啊,就是啊没有下一个结构体,那这个成员的话,它就是等于零啊最后一个结成成员等于零,也就是我们的一个循环结束的一个条件,那之后的话,那这个就是我们的一个啊名字对吧?啊进程名。啊,什么,这是什么啊。PID对吧,就是我们任务管理器看到的一些PID,那像这些的话,就是我们现在用不到,但其实也是有用的,就比如说啊句柄的一个数量。啊,还有一些什么绘画ID啊,就是。比较常用的。会换ID,那还有一些什么基础优先级,还有一些什么啊,现成的一些数量,那这我们都用不上啊,我能用上的的话,现在就是这三个啊,进程名字,还有PID,还有这个下一个结构体的一个偏移量,那有了它之后。
25:02
有了它之后,我现在去定义出来一个指针类型啊星,然后呢,加上一个。P代表的指针类型,然后我们把它看成什么?拿过来,拿过来之后的话,我就可以是吧,准备一个p info的一个类型,方便我们去便利,那等于什么,等于我这个缓冲区对吧,然后呢,可以再强转过来。啊,强转过来,强转过来之后的话,我就可以什么循环的去变裂它了。它遍地的一个条件啊,那肯定是刚才说的是吧,只要你这个拼音否啊,这个位置这个偏移量不等于零,你就说明有下一个结构体,那我就可以用什么拼音否的。Next这个n off啊这个循环条件,那也就是说它不等于零。代表还有啊下一个进程。
26:02
那之后呢,我们就可以利用这个拼音啊,它进行一个找到它的一个下一个结构体,那最后的话肯定是什么啊,得需要去强转成它的一个。强转成他的一个诶。指针类型啊,因为我们要去方便去运算啊,那就是拼音。加上拼音否的什么下一个偏移量。嗯,然后的话肯定是需要这个强转的,对吧,这个拼音让它变成一个。PU类型。然后进行一个括号。诶。啊,让他去先去运算。那最后呢,嗯。再打一层括号吧,让他先去进行个强转啊,保险一些。啊,找到下一个进程。
27:03
然后我就可以什么打印出来了呗,啊,我们看一下那如如果啊,不等于这个任务管理器进程啊,我们把这个任务管理器进程给它剔除掉pful的,嗯。PID。啊,不等于零啊。然后我们给他打印出来,打印什么,还是打印我们刚才这些东西呗。来打印这些东西改一下啊,那这个就是拼音。对。魅距内,然后呢,PF的金城PID。嗯,那这个就不能用S了,因为这是一个用力扣的实训类型,我们得用一下。W。W-WG啊。我看看哪出问题了。然后们进行下。
28:02
啊,拼音否啊不等于零,然后看一下啊。百分号WG啊,然后呢,我们这个是用还得取个地址啊。取个地址。啊,百分号D,然后我们运行一下,看现在还有问题吗。那还是有问题是吧,我们看一下哪出问题了,嗯,P info,呃的image name。然后呃,百分号WG没有什么问题啊。WZ。然后呢,PID啊等于百分号D,然后呢,嗯的。嗯,PID。我看看啊,这是出什么问题了,百分号WG,然后P的image name。
29:00
看一下啊,烟眉剧内幕。呃,取地址页面去内,然后逗号。嗯。诶,这什么问题,我看啊。我看看有没有名字。嗯,然后皮筋风,我找个家。然后页面剧内,然后。看一下啊。Buff字符串读取错误。啊,洗地洗地洗地。我看一下啊,嗯,是不是刚才这个位置写错了PB,然后DW size0FF啊然后。然后。找到下一个进程啊,这没啥问题,然后调用的时候。Buff。你看一下啊,嗯,拼音,然后。PF等于PB。
30:03
然后进程PID,如果不等于零,嗯,然后进程名。百分号WZ。然后呢,PID。哎,我这个页面区内怎么出问题了呢?看一下啊,那就这么写一下啊,我换个写法那就是。页面去内蒙,然后。的buff。我看一下啊,现在有有有没有问题。还是有问题是吧,7005。然后他说。访问内存冲突。在这个。访问内存冲突,我看一下为什么。DW上一轮,然后DW上一轮。然后p buff。
31:00
啊,P音风,然后转到P音风,这也没没什么问题,然后。函数,看看函数调用成功没有。看看这个函数调用成功没?按状态,然后。判断一下这个返回值。Nit。Nit,然后嗯,有了nit之后。嗯。如果。Nt Su,哎,没有是吧,然后还得来到这个源码当中。拿过来。看一下还有没有别的。啊,把它拿过来。
32:05
啊,去判断一下。呃,Ret,啊,进行个祛斑操作,呃,喷F。嗯,打印一下啊,失败是吧。看一下啊,哪出问题了。没失败,没失败的话,看看它这个缓冲区里面都有什么东西啊,然后我们来到。嗯,调试,然后窗口内存。啊,确实便利出来了是吧,然后呢是F10走一下。PID。不等于零,然后我们找找。也没去内蒙。诶,然后出来了是吧。然后那我们就那这个W。
33:03
看看啊,然后取地址。加上一个。然后再来看一下啊,哪出问题了。然后艾斯。百分号W-Z。然后白嫖地没了是吧?WWZ,我看看啊,应该好像没啥问题了,刚才都遍列出来了。诶,然后现在就出来了是吧。然后现在就出来了。应该是刚才我这个P发哪哪哪写出写问写出问题了啊,或者是这个PID这个位置写出问题了,然后我再把这个白发地下了。然后再把它拿过来。
34:00
然后重新来。诶,然后就正常用这个API也能把这个进程遍历出来,对吧?啊,这个所有进程全给它遍历出来了,那遍利出来之后的话,我们就知道了它这个东西怎么用了,那怎么用之后的话,我们就可以去啊去改他这个清单文件了,对吧?那我现在的话就是需要去写这个户客代码了。那这个户代码的话,呃,我们昨天学了一个叫inline hook的啊,然后的话就是可以去看一下昨天回放。然后现在的话,我就不直接去写这个库克了啊,因为什么微软的话,他给我们写了一个开源库啊,微软帮我们去写了一个开源库,这个开源库的话就是专门去做户客用的,然后我们就可以给他复制出来啊,这个库的话你就可以在嗯嗯GI上去下载。嗯。那之后的话,我们就可以把啊这个库啊给它连接进来。啊,把先把这几个头文件给他加进来啊,先有性。
35:03
啊,这个先有相给它降进来,然后呢,把这个库。给他点点进来。先生下头文件,然后再是连接器啊。嗯,那酷叫酷叫嗯。看看对不对啊。应该是对的啊,给力吧,给它连接上来。连接上来之后的话,我们就可以什么嗯,专门去写一个互克函数。啊,专门写个互函数。嗯,那我就可以写个UID啊。啊,开始互换。然后呃,我们看一下函数都需要什么,肯定是昨我们昨天写的对吧,你函数一进去,你就需要给他恢复一下状态,防止它重复对吧,所以说我们首先需要去给他恢复一下。
36:14
啊,恢复一下,嗯,恢复因为。恢复,把他状态给他先恢复一下。呃,最后的话就是你这个状态恢复完了啊,函数也呼好了,那最后它像数据库一样,你需要把这个呃事物给他提交一下啊。15给他提交一下。啊,提交你就可以认为啊提交啊是我。它中间的话就是需要什么,嗯,开始对吧,你既然有事物提交,你就得有这个事物的一个开始啊。事物的一个开始。啊,事物的一个开始,那开始之后的话,就是说你得什么更新一下你这个现成的一个状态。
37:05
Date空新一下你这个现场状态get。啊,最后呢,就是啊需要去什么附加他你就可以理解为就是我们昨天写的一个户口。啊,这个位置就是护。啊,看看他需要的两个参数啊。啊,一个是啊,指针的一个指针类型,然后呢。指针类型。VID啊新类型,然后呢老的API。然后呢,还有一个新的API。看一下是不是。啊,没错啊,然后给他填填进来。那肯定了。然后就是我们得需要一个新的一个函数对吧,那这个新的函数我们得写一下,那这个位置叫menu啊NT。
38:05
把这个括号给它去掉。啊星去掉啊,括号去掉,然后呢泰地啊去掉。那我们那个顾客的一个位置就有了,对吧,这个就是我们那个顾客的。是妹子。那有新位置的话。我们先让他去执行一下它的一个老函数,对吧,先让他去执行一下它的老函数。啊,老函数让他先执行一下,我们先去获取一下他的一个清单,对吧,先去获取它一下它的一个清单。嗯,然后接受一下那个返回值。啊接受先让他啊先往先执行。老函数啊,获取啊,清单啊,进程清单。
39:08
之后呢,我们就可以什么它的一个缓冲区的一个位置,对吧,这个也就是我们要的一个什么清单的缓冲区。清单的缓冲区,我们是不是就可以去修改这段缓冲区了呀,那我们得去判断一下啊。如果什么如果他的第一个没曲类型等于我们要的啊,便利进程。并且。并且。并且你这个缓冲区得有值对吧,你这个缓冲区得有值。啊,并且你的一个返回是一个成功的一个状态,对吧。诶。那这个也没有是吧,这个也没有,这个没有的话我们也来一下。
40:13
啊,就有了啊,等于成功状态。那我们就可以什么啊,我们的一个思路就是什么啊,那这个兄弟姐妹先给他关了。我们的一个思路啊,现在就是我们有了这个清单文件,那我们就可以什么便利这个清单文件啊,找到和我进城一样的名字,或者说你的目的名字,你找到这个名字之后的话,我是不是就可以找到这个进程的前一个进程啊,我找到他的前一个进程。找到他的前一个进程,找到它前一个进程之后,修改它的第一个成员,第一个成员是什么?是不是我们刚才找到的。嗯。
41:01
也就是他,诶我的第一个成员,就刚才我们说的这个偏移量对吧,找到这个成员。他本来本来这个偏移量,他比如说他只将的是80对吧,80的话是他下个进程,我们找到他前一个进程之后,我们是不是就可以改到改改掉给他改成一百六啊对吧,就加上啊,用这个80加上我当前进程的当前的这个什么偏移量也就这个位置。加上它的一个偏移量。啊,加上它的一个偏移量,那加上它偏移量的话,是不是就就指向了下一个进程,那我们这个进程是不是就在这个清单里就消失了呀,就相当于一个锻炼啊,链表的一个锻炼隐藏。那我的话就可以去写这个代码了啊把这个。啊,代码拿嗯,拿过来,那抽线的话,我得需要他的前置针和后置针对吧,前置针和后置针我先准备两个指针。
42:04
一个是当前指针啊P。希望安全点。还有就是后下一个是阵对吧,P的。那想让我在下一个进程等于什么啊,等于这个缓冲局。强转一手。之后呢,就是我写个循环对吧,那个刚才我们写的是well循环,现在我写个do well,那其实都一样的,嗯,循环条件呢,都是对吧,P它的下一个。啊,不等于零,那这个拼音的话应该变成什么呢。拼音否是不是应该变成我当前呢?当前的一个指针。那我现在当前之阵没有被赋值对吧?那所以说最开始当前之阵应该等于什么,下一个之阵,那下一个之阵呢。
43:04
那其实就把我们刚才这段代码给他拿过来,对吧。那下一个指针对吧,PX的。PN应该等于什么?嗯,当前指针啊,这个位置P否全变成什么当前指针。之后的话就可以什么去做判断的,如果说。啊,同样的吧,这个字符串比较啊,给他拿过来。啊拿过来,如果那现在这个P132没有了,对吧,P32应该是什么,是不是应该是我的下一个对吧。如果说我下一个的image name的B。等于它。那我就可以什么给他断掉了。如果。Else。
44:00
啊,那这个位置给它改为等于零。之后呢?那这个味道L应该是什么?开始隐藏进场了,对F。啊,进程隐藏,哪怕只有一个,我现在我给它隐藏掉是吧,那这个p next应该等于什么p next.next的下一个的一个偏移量。加等于。甲等于它对吧。最后呢,在else结束之后啊,那就是我的p next。等于我当前之称。这种好的对吧。那在这个里面,我应该如果是什么,如果的话就是还是对吧,那就是说你这个偏移量。嗯,等于零了,那我取个反对吧,取个反之后,那你这个当前这个位置应该也等于零了,对吧,你没有下一个了,对吧,没有下一个我就给改为零,然后退出这个循环,那我们这个代码就结束了。
45:09
然后我现在就在我去调用什么遍地进程快到的一个之前,我先去做一个户啊。做一个。做一个户。然后。老的API和新的API对吧,新的API的话是我们的刚才写的拿过来。嗯,老的API的话是我们获取的买PI对吧,拿过来。嗯,啊,那我也取个地址对吧。他是直等的,直等没有的。心里想。
46:00
披着星。啊,好了。然后我们现在。啊,去生成这个代码。然后什么。啊,最后。它的返回值。哎,我操。啊,然后我们重新上传。啊,之后的话就是正常的话啊,你现在开启一个进程给它隐藏起来了吗?对吧,开启第二个隐藏起来了,那这个假如我是游戏的话,那你这个多开检测,这不就给过掉了,对吧,你现在就能开启三个进程了。那你现在假如你不去做这个护OOK的话,你不去做它,那你这个游戏假设我现在是模拟这个游戏的一个检测点啊,你假设你不去做这个户OOK,那你开启一个,开启第二个游戏的时候,他就发现多块了,对吧,那这个游戏就退了啊,这个也跟着退了,对吧,那这个就是一个户。
47:11
然后我们再看一下啊,现在去做复合的话啊,直接一个进程开始隐藏对吧?啊开始隐藏,开始隐藏,那这个就是我们达到的一个效果。
我来说两句