00:00
好,那这节课呢,我们插播一个其他的内容啊,然后下节课开始我们还是讲那个界面化和红一些东西啊,那这节课插播一个混合编程,就是如何在我们的这个西和下家的使用过程中啊,来这个使用我们的汇编代码啊,那首先呢,我们来创建一个这个测试项目。采取一个空项目即可,然后呢,我们给他添加一个新建项,比如说我这儿来一个这个呃,下加啊,然后呢,给他的随便起个啊,什么这个恩翠啊什么的。好,然后我们包含一下文件。
01:09
好,那么我们如果要在这个西河虾家里头这个写汇编的情况呢,有两种啊,一种呢是叉八六下的,一种呢是这个叉六四下的,他们有一点区别,在叉六四下呢,我们一般情况下呢,就可以直接使用这个asm关键字啊,然后直接开始写在这个括号里就可以写汇编,但是64位下我们的visual studio原生的这个编译器啊,是不支持这么做的啊,它有两种解决方式,第一种被方式呢,就是写纯汇编。然后混合编程,还有一种方式呢,就是换这个编译器,比如说我们换这个英特尔的编译器啊,这两种方式都是可以解决这件事的,那我们先来看一下我们叉八六是如何写的,比如说我现在我直接来一个这个关键字啊,Asm。
02:05
然后一个括号啊里头呢,就可以写我们的这个汇编了啊,那怎么写呢?其实就跟我们正常的汇编语言比较接近啊,其实也没什么区别,比如说我现在呢,要给一个变量赋值,那我如果说是一个C语源的变量啊,那肯定我就这样直接给它进行赋值了,那我如果要用这个汇编啊,对它进行修改,那应该怎么做呢?啊,其实呢,就跟我们呃写汇编的寄存器或者说内存的赋值很接近,我们直接用木指令把这个一个你想要的值目到我的这个里边去啊,比如说我一个100,然后呢,我现在呢,如果说啊,要在我这个汇编里调用一些库函数什么的啊,那怎么办呢?比如说我现在想调用一个F啊,把这个100打印出去,那这个时候呢,我需要有一个格式化字符串,比如说SZ这个form啊,不对,我这个是应该是差星类型,然后呢,因为我高版本的原因,我要是一个的星啊,然后我一个百分号D啊。
03:06
换行啊,这样是一个格式化字符串,接着呢,我要取,我要把它干嘛呢?给它先拿到一个我的这个呃,计音器里啊,我们这儿呢,尽量是这样使用啊,防止出错,然后push ES把它的这个地址push进去之后啊呃,不对对,应该是地址push进去之后啊,然后呢,我们接下来呢,我们呃,现在有了它有了它,但是我们这个东西呢,现在只是赋值的,还没有压入到站里边啊这个呢,我们是可以直接啊对它进行一个push的,然后呢,我们现在呢,有两个东西,它其实呢模仿呢,就是相当于C什么呢?相当于C语言的模式啊,C语言我们调用print f,我们中间不是一个百分号D,然后格式化,然后后边跟的就是一个变量名嘛,那么我们按照从右往左压占的这么一个原则,也就是一个。CDE的一个调用约定来说啊,那我们现在啊,给它铺置进去了,然后给这个字符串格式化,字符串铺置进去了,那接下来呢,我们就应该靠这个print f了啊,也就是在这个位置上,我们要对这个print f进行一个拷拷print f啊这样直接拷就行了,但是注意啊,你需要包含一下这个print f的一个头文件,也就是说我们这个STDL.h一个标准的输入输出这个头文件你要给包含上,否则呢,它会出现一个未定义啊这样的一个错误,然后呢,因为我们这个是一个CDCR的一个调用约定,所以说呢,占方向呢,你要自己评,也就是说你要在这个位置上给它ADD一个这个,那这个A少呢,你看你几个参数,如果是一个参数呢,就是字个参数八字那了数,所以说在这儿呢,Ad的ESP呢,我们要给它平八啊,这样就可以了,那么接下来呢,我们就可以给它运行了,但是这样运行呢,它会出现一个一闪而过。
04:59
的一个问题啊,就是因为我们这块没有一个停止啊啊,我看一下啊,我这里有一个运行库的一个原因啊,我这里直接把它换成那个140啊,换成140啊就都解决了啊,然后呢,在这个C加加代码商城里啊,把这个mdd改MTD啊。
05:16
呃,这是32位没错啊,应用确定。重新生成。啊,然后你运行按。这个会闪过去啊,因为在这个位置上没有一个停顿啊,你可以在这个位置上加两种东西啊,一个是要不你就该加一个get叉这种函数啊,让它在这停一下,或者说呢,你就可以传一个这个system啊,然后传一个这个SE啊,那这两种方式都可以,那比如说我在这我调用一下这个system,那我这呢就还需要定义一个字符串嘛,Cost啊差等于好,然后呢,我们现在有了这个字符串之后呢,我们就把它取到ES里。
06:09
然后呢,负11S压入站里边,然后call我们的这个system啊接着呢,它有一个参数,因为它只有一个参数,所以我们在评的时候需要给一个即然后呢,我们的这个呢,它是存在于我们的点里边的,所以呢我们就来这个呃,直接包含它就可以了啊好,然后呢,接下来呢,我们就可以直接啊对它呢进行一个使用啊,比如说我们现在呃重新生成的。然后来运行。啊,你可以看到啊,这样呢就完成了一个打印,并且停顿在这里,没有一闪而过啊,这就是一个普通的对这个C元的变量进行赋值,以及如何调用C元库函数的一种方式啊,那这个呢是调用库函数,那如果说比如说我自己写了一个函数啊,我这是有一个这个加法啊MY,然后呢,我这里边啊,比如说我传了一个A啊,然后传了一个B啊这样呢,我们就有两个数了,然后呢,我运算的结果呢,就是一个A加B,那么这个时候我如果要调用我这个自己写的函数,我应该怎么写,比如说我在这这个n number,我它的一个值呢,我不想要给它一个100了,而是我想要调用自己的函数,然后运算出一个返回值啊,那这个时候是怎么样的呢?就是首先在这个位置上,它有两个参数,那这两个参数呢,你可以传这个,像这种例句数啊,也可以传这个,呃,寄存器什么的都是可以的,比如说我现在呢,直接push一个一,然后呢再push一个五啊这样呢,它如果是加法运算完之后,应该返回一个六,那这样呢,我它两个参数。
07:45
我就push进去了,Push制完之后呢,我行一个拷,拷一下MYAD,然后呢,因为它有两个参数,我进行一个自评站EP,一个八,然后呢,我现在干嘛呢?我这种函数的一个调用约定是基于CDCL的,那么c de CL的一个return的一个返回值,它默认情况下是存在ex里的,所以说呢,我如果想要把它的这个返回值打印出去,我现在只需要在值的时候把ex的值给到n number,然后把n number啊,然后再通过这个form格式化,然后打印出的一个值就可以了,现在我运行一下。
08:24
好,你可以看到啊,现在它就显示一个六啊,所以这个呢,就完成了一个调用,那比如说我现在呢,不想除了这种东西之外,库函数之类的呢,我还想调用一些这个类似于这个呃,API什么的,那怎么调用呢?其实呢方式类似,只是说它的函数调用约定呢,稍许有点区别,比如说我现在啊,再来一个asm啊,我这调用一个这个ma box,那这个ma boxx这个东西啊,大家都是有用过的,它有四个参数,第一个数副窗口的一个句柄啊,通常情况下我们写个到就行了,因为它暂时没有的情况下,第二个呢,是它的一个内容啊,第一个内容,第三个呢是一个标题啊,是一个标题啊,第四个呢,是一个按钮的一个这个控件啊,比如说我这给他MBOK啊,有一个红啊,就是点击的意思啊,确认点击OK的意思,那我这四个参数啊,我按照从右往左的一个这个push方式,比如说我第一个首先我push置一个这个MBOK。
09:25
啊,这个呢,其实它就是一个红红,它里边呢,实际上就是一个这个传了个零的意思,所以说这个呢红呢,在真正编译的时候,你就相当于push了一个零啊,然后呢,第二个呢,我们传一个这个字符串,比如说我第二个啊,我就传这个啊嗯,标题啊标题我直接定,再定义一个得了啊二啊标题啊标题标题。等于。
10:00
啊,然后呢,我们给他木一下,然后铺进去。接下来是它的一个内容啊。然后呢,是最后一个是它的这个句柄啊,那句柄呢,我们直接push一个闹就行了,它相当于一个立级数,接下来我们就call一下我们的这个。好,那现在呢,我们就可以重新生成一下啊,看看他有没有错误。可以看到没有错误啊,然后我们运行。看到没有,它的标题就是瑞克瑞啊,然后它的这个内容就是这个成功,然后有一个m muk的一个确认按钮,然后这里呢,就是为什么这里没有一个这个平站呢?因为这个调用约定呢,就和我们刚才这两个函数的调用约定不一样了,就是我们的库函数和我们自己写函数呢,它呢,一般情况下调用约定都是CDC的一个调用约定啊,需要自己屏占,而我们在这个Windows下的一些API呢,它的这个屏站方式呢,通常情况下呢,是一个这个,呃,那个什么啊,是一个std call啊。
11:31
它的调用约定呢,是这个通过这个自屏战啊,就是它这个函数内部屏啊,不需要我们对它进行屏,所以说你直接这样写就行了啊,只要把它参数队,然后一调用就可以了啊,那这个是这个我们32位下这个通常的一个这个内联汇编的一个使用方式,那接下来呢,给大家介绍一下64位的一个使用方式,那比如说我现在直接把它切换成64位,那你再这样写它就不行了啊,为什么呢?因为它这个东西啊,是这个不支持的啊,所以它就会失败,那比如说我现在呢,把这些东西呢,我都给他这个注释掉。
12:05
啊,这些东西我全都给它注释掉啊,那接下来呢,我要去使用一个64位的这个,呃,汇编我应该怎么写呢?比如说我同样我有一个这个汇编的东西啊,我要我要用啊,那怎么用呢。啊,这个是那什么,64位的一个那个。平台问题啊,这没有设置平台啊,MTD应用确定,然后常规啊还成140。我们重新生成啊。啊,然后64位的他呢,因为不支持的直接写汇编这种形式,所以说它是要用到什么呢?用到一个叫做这个生成启动项的一个问题啊,生成依赖项啊,在这个属性上右键啊生成依赖项点击生成自定义啊,然后呢,这个生成自定义里边呢,我们在这儿呢,有几个选项啊,可以看到有这个什么image啊,什么还有这个什么RC啊,还有这个m ma SM和这个m ma SM这种东西啊,那我们现在要使用的东西呢,就是这个啊,就是这个MAS,我们把它勾选了,这个时候你需要注意点什么呢?就是不要勾到这个啊,这个呢是这个ARM啊,所以跟我们现在的这个架构是不同的啊,有以前有同学就勾到这个ARM了,导致一直编译出错,而还找不到什么原因啊,实际上就是因为它勾错项了啊,我们这儿呢,使用的是这个m ma SM啊,而不是这个I m ma SM啊,我们勾选上之后直接点确定就可以,然后呢,我们如果要写一个汇编的情况下,我们。
13:41
现在呢,要给他这个首先添加一个这个CP文件,比如说我这CP文件啊,我这是一个什么呢?啊,不是CP啊,它后门我们要手动更改一下啊,比如说我这个东西啊,我是一个这个工具啊工具asm,然后我们点击添加,添加完事之后,64位它的汇编的这个编写呢,是相对简洁的啊,这个虽然我们还没讲,就是四维汇编啊,我们这里先用一下啊,就直接什么呢?点扣的啊,点扣的,然后呢,后边什么呢?摁啊这就完事了,中间就写代码就行了啊,其其实就是声明了一个这个代码段啊,你可以看到相对于32位,咱们前面讲过32位和16位汇编,它其实更为简洁的,然后呢,我们在里边呢,给它添加一些东西啊,比如说我们现在啊,要给他这个写一个函数啊,那就跟前面是一样的,还是使用这个PC和是和这个N的P啊,来做一个这个启动和结尾,那现在呢,我又给他,比如说我还是要实现一个这个我自己的加法啊麦啊,然后呢。
14:41
啊,然后MYA啊,然后NP啊,这就是结尾啊,开始和结尾啊,然后呢,我们这这呢给它来一个什么呢,我们比如说我现在呢,要还是给他计算啊,计算计算两个数啊,我这要传两个参数进来,那么64位的它参数呢,跟我们前边的这个参,其他的参数传递呢,是有一定区别的啊,我们这儿呢,先用着,然后一会再告诉大家,比如说我现在呢,我要给他这个一个ADD啊ADD什么的,ECX,然后呢ED,然后呢,我把这个结果呢目从这个呃,ECS里啊移动到我的ex里啊,就是ECX里啊,挪到我的ex里啊,接着呢,我干嘛呢,Return啊这样就行了,然后呢,我重新生成一下啊,看有没有语法错误。
15:29
你可看到啊,应该是没有语法错误的啊,那接下来呢,我们给它添加一个头文件啊,这个头文件呢,就与我的这个工具的这个SM啊头名即可。To,呃,Tos啊点H啊,正经的纯汇编的投文键,我们一般都用INC啊,但是这是混合编程,所以我们用点H,然后呢,我这儿呢,写一个以tenin,把这个函数呢,声明成以C的名式名义进行导出,然后名字呢啊就跟这个一样就行了啊接下来呢,它的返回值呢,你需要给它自己定义一下,它的返回值是什么样呢?因为你现在是一个加法,你返回的实际上是一个ES,也就是一个32位的一个整数,当然了,你因为是64位的程序,你用64位的器也可以,但是因为我们还没讲64位器,所以说呢,我们先用32的带一下啊,我们用这个ex,那么返回的时间就是相当于一个int或者一个word啊,那这两者都可以,比如说你写一个int啊,然后呢,这个时候呢,你还要有参数啊,那这个参数呢,是通过ECXEDS传进来的,也就是两个这个32位整数啊,所以说呢,我现在呢,还要有一个什么呢?还有一个in得A,一个int b,好,那现在呢,我就把它声明出来了,那么声明出来之后呢,接下来。
16:42
那我就可以在什么呢?在我的这个,比如说我在这边,我包含我自己的一个文件啊,我这SM的一个头文件啊,包含进去,包含进去之后呢,比如说我现在啊,我在这最前面,我进行一个调用啊,我直接调用这个,然后呢,我传一个这个,然后传一个六,然后呢,我用它啊返回值接收进行打印啊验证一下。
17:16
好,暂停一下,重新中城。成功运行。看五加六的结果,11就运算出来了,那这个是因为什么呢?为什么我们没有特地指明它的参数在哪,我们直接就运算ECX和EDX就可以了呢?这就因为我们涉及到的第三种这个调用约定啊,我们刚才啊说了,我们的库函数用的是CDCL,我们的这个API用的是都是们你在这个使用这个,然后呢,这个对战进行这个平衡的方式啊,进行这个,然后呢,区别就是什么呢?区别就是CDC呢,它需要啊SD不需要二位的情况下呢,叫fast考快速调用原定啊。
18:31
这个呢,在32位的情况下呢,它的这个约定是怎么样呢?首先它的这个参数呢,不全部是使用这个对战啊,就是说他其实也使用了对战,只是没有全部使用对战,那他为什么成为快速呢,我喝口水啊。他之所以使称为快速呢,是因为它在里边啊,使用了寄存器进行传。
19:03
使用了几个呢?两个寄存器啊,两个寄存器啊,就是说啊,如果说啊,它的参数没有超过二的情况下啊,它的参数是通过寄存器传产,那寄存器肯定是比内存快的呀,对不对啊,它是在CPU里头的硬件对不对,所以说呢,它是肯定是比内存快的,所以它称之为快速调约定,但是如果说它是这个参数多了之后,后边的参数依然使用内存传参啊,使用对战传参。为什么呢?因为32位下它的通用计算器是有限的啊,你像32位它的通用计器是多少啊,E eds ecsdssp一共就八个啊,然后呢,这里头呢,还有一些东西有特殊特殊功能,你比如说EI原创目击串,ESP占顶占底啊,然后呢,11CX有时候还当一当这个计数器,那你说你还能剩下点啥的,所以说呢,它这个东西呢,用的比较少。
20:02
那么它的这两个计算器是随便挑俩计算器传嘛,也不是它是固定的两个计存器,就是ECX和EDX啊,这是32位下的约定,同样的约定呢,在64位下呢,也在使用啊,但是呢,我们64位下无论是库函数还是什么呢,还是API啊,都快都使用什么呢,都使用64位版本的发,那它这种快速调用约定呢,从两个器的啊增长到了什么呢?增长到了四个寄存器的一个传参,也就是说如果说它的参数啊,不超过四个的情况下,前边都是使用寄存器传参的啊,后边呢,才会去使用一些什么那个。呃,对对对战进行传串,那它头四个是什么呢?就是RCXRDX,然后R8和R9啊,那可能有人就说了,这R8R9是个什么东西啊,这个CX和DX看起来就是ECX和EDX64位版本,那R8R9呢啊,那它是新增的寄准器啊,我们的这个呃,通用寄存器呢,在64位的情况下呢,从这个八个啊增长到了16个,也就是说呢,除了传统的啊RTXRDX啊这个啊。
21:20
RX和这个RDX啊,以及RSIRD啊,然后呢,RT以及RBP啊,除了这个八个之外呢,还长了几个带数字的,R8 R9 R10 R11 R12 R13 R14 25啊,这几个啊,这几个这几个版本呢,也是有这个32位版本的啊,就是包括什么这个25D啊这种啊,就是32位版本的。那它前四个就使用的是这种,那我们现在呢,就可以来尝试一下,我们看一下它这个64位下的一个这个参数的一个传递啊,比如说我现在呢,我给他来写一个这个简单的一个函数,比如说我还是写一个什么MY叉叉叉啊,我这就懒得起名了,然后我这呢,就给他写了四个参数,比如说in a b c啊和in d啊,那里论那四个参数嘛,然后我们直接return啊,A加B加C啊加D。
22:21
好,那么这样的情况下呢,我们现在呢,来简单的给它进行一个调用,比如说我里头就给它一个一啊。1234啊,然后呢,我这儿呢,把这个返回值啊给他啊,然后进行打印,底下这一句我给它注释掉啊,等号没写,然后呢,我现在我在这下个断点,然后呢重新生成一下啊,我现在是64位模式下啊注意。有需要往期的软件啊工具啊,源码啊,录播啊什么的,可以加咱们的这个助理老板,然后也可以通过这个QQ群啊加入啊,哎呀我操我今天我这个忘关了啊,先先关一下吧,忘了我无所谓啊,就一期无所谓啊。
23:09
然后那个什么,那个我们继续啊,然后呢,我们给它运行起来啊。运行起来之后呢,我们可以直接啊通过这个右键啊,又在这里右键有一个叫做返回,转到返回编的一个东西啊,转到返回边之后呢,我们可以来看一下啊,它的这个情况,看到没有ecxe DX,阿8DR9D,为什么全使用的半拉寄存器呢?为什么叫半拉寄存器,在64位下使用32位寄存器就是属于半拉寄存器啊,为什么呢?因为你这个东西是int啊,Int的一个值呢,它就是32位的啊,因为我们在这声明的时候,声明的就是一个32位的一个一个这个变量类型,所以说呢,它都使用了半拉器,但是也可以看出它按照顺序的使用了ec s r8和R9啊,使用了这四个,然后呢,我们可以看再跟到它的这个函数内部去看一下啊,比如说F10F10F10F10走到这F11跟进去,然后呢,在这儿它经历了一个跳转表啊,通过跳转表随便按一下F10或者F11,它就会跳到震荡真正的函数内部。
24:16
然后你可以看到啊,它会把ecs eds r8 R9的东西放到我们的这个801820H这个位置上啊,然后呢,给放到R这个位置上,然呢再去给进行一个这个啊,看到没是这个样子的,那么我们我为什么要说一下这个东西呢?这个呢取决于它后边的一个传传参的一个问题,比如说我再有一个ABCDEF啊,然后ABCDEFF啊,那我多再多加两个啊,那我比如说我在这儿啊,再给它加一个E啊,加一个F,那我在这给他传一个四,传一个五啊,不是传一个五传一个六啊,大家看一下情况是什么样子的啊。我还是啊,重新生成一下。
25:02
运行啊,然后呢,我现在F11跟进去,跟进去之后呢,我直接哎,我我我我我跟错了,我忘记返回编了运行,然后右键啊,转到我们的这个反馈边。然后在这儿呢,我们看一下啊,我们前四个还是使用寄存器对不对,按照我们刚才的说法,我们前四个使用这个四个寄存器RCRD28R9啊,这是没问题的,但是后边可以看出它是从什么呢?R720和二八开始这个传参的对不对?那为什么是从二零开始的呢?那我们这儿呢,就来一个计算器啊,其实二零这个东西你应该挺眼熟的啊,因为我们刚才看到了啊,我们看一下这个计算器,我们这儿啊,比如说我这写了一个16进制的二零啊,然后呢,我再除以八啊,你看到没,刚好是什么四啊,那所以说这这前面这二零是给谁留的呀?是给我们的这个四个寄存器留的,我们四个调这个四个寄存器在传完参数之后,进入函数的时,进入函数的时候,它会干嘛呢?会把这个八十十八二零的位置给它重新填满,然后呢,我们才是什么呀,才是我们的这个其他的这个参数。
26:16
参数把符号名去掉之后啊,大家从这看。这就是在什么呀,在进行这个我们的一个运算啊,你可以看到啊一堆A,然后呢,前边呢,我们就有那个什么赋值嘛,然后把这个啊还原到我们的80时是吧,二零的一个位置,那这个呢,就是64位的一个传一个参数的一个传传递的一个调用约定啊好那么我们现在呢,就已经啊了解了他调用约定也知道了,他如何去传递的这个参数也知道了啊它这个东西如何在这个C源里进行混合调用啊,其实调用的方法和原来没有什么太大的一个区别,只不过呢,需要单独使用一个这个,呃,单独使用一个这个文件啊好那么我们今天讲这个混合编程的这个目的是什么呢?是因为我们要要了解它具体有一个什么使用空间啊,其实我们在自己写这个呃程序的时候呢,我们需要用到内联汇编来提升效率的情况下啊,还是相对较少的,一般情况下呢,使用内联汇编的其实都是逼不得已。
27:20
那我们现在呢,比如说我现在要干一件事,我要修改一下目标的一个函数,比如说我们如果搞游戏的人啊,你知道会调用一些目标里的一些。那我现在呢,就写这么一个啊,写这么一个程序啊。这是一个32位的程序啊,我们重新啊给它添加一个原文件。好,首先啊,包含一下这个标准输入输入头。
28:33
我们这这个函数啊,不干别的,只打印了一句话,然后呢,我在这儿啊,对它进行一个调用,调用完之后呢,我调用一个打印啊,把这个函数的地址打印出去啊,百分号X啊0XX,然后换行。直接用这个函数名啊,当做这个地址啊来进行打印,然后呢,暂停一下。
29:01
啊呃,没点关注的给主播点点关注,然后可以联系咱们的这个公屏上的小助理啊,然后这个老满进入我们的这个QQ群啊,以及获取相关资料,好然后呢,我们重新给他配置一下啊,在这个。代码生成啊,然后MTD啊,借用我们的环节应用确定,然后重新生成。有一个失败啊,反方X。嗯,我看一下啊。格式化百分S需要的参数拥有了,我先啊,那可能高版本的原因,我给他换一下这个版本啊,应该换一下版本就可以了。嗯,还是不行哦。可变参数一。
30:04
哎,这奇怪了啊,我给他强转一下。啊,我知道是因为什么了,我刚才配置的可能都是64位的版本啊,啊,所以说其实配置根本就没生效啊。那应该不用这个印,我试一下。啊,果然成功了啊,刚才就是没生效。然后来运行。可以看到我们现在呢,打印了一行,然后把它的函数一个地址也给打印出来了啊,然后我们把它拿出来。我们放到这儿。
31:05
然后运行啊,你可以看到啊,这就是他的一个这个地址啊,以及它的打印的一个call,那接下来呢,我写一个动态链接库注入进去啊,动态链接库这个东西我们在前两节课其实我们是见到过的啊,那我现在呢,就给他来写一下动态链接库啊,静态呃,动态库啊,然后点击确定。然后右键啊,我们首先给它配置一下属性啊,在我们的C加加代码生成里啊,MTD,然后禁用。应用啊,然后现在呢,我们在这儿啊,首先把这个几个给它加上。然后呢,在这个附加到进程的时候呢,我要对它的这个函数进行一个调用,那如何调用呢?首先呢,我因为这是32位的,我可以直接调用一下我的asm的一个关键字,然后呢,我正常情况下我要调用这种call呢,我应该怎么去调用呢?其实就是一个call嘛,因为它没有参数,所以说呢,我现在呢,直接call它的它这个地址就行了,但是地址这个东西不能直接call啊,你要干什么呢?你要首先啊叭如说你使用一个继音器啊,然后呢,把它这个木到寄尘器里,然后再靠尘器啊,这样就不会有问题啊,然后呢,我们这只是靠一次啊,不够显眼,我们直接啊给它来写一个这个for循环,我们给他来这个重复个50次啊,然后呢直接啊拿进来,中间呢,因为要他这个暂停一下,再继续打印啊,省得这个太快啊,然后我们给他暂停一下,呃,这样。
32:43
好,那么我们接下来呢,就可以干嘛呢,给它重新生成一下。然后我们把它取出来。
33:06
我们现在是没有办法去让它运行的了,再一摁就退出了,那么我们现在使用注入的方式啊。把我们的这个动态链接库注入进去。24。然后我们点击注入。嗯,是他崩了,还是我崩了?喂。等一下啊,他好像崩了啊,等一下我再启动一个看一看。
34:10
诶注进去了没起效啊,这是。卸载。这软件跟有bug一样啊,我们重新来一下。这软件好像死这儿了。好,我重新给它启动一下啊。九六。96167。96167没有没有没有错啊一样。
35:09
嗯。这什么毛病?他怎么没调用呢。这块没有问题。我看一下啊。50,那那50太多了。
36:02
木考。我试一下十次。
37:30
啊,可以看到啊,这次就已经开始调用了啊。可以啊,这次没有问题的,那这个呢,就是我们这种汇编它的一个意义啊,那这种其实不是唯一的形式啊,那你其实还有其他形式可以去使用它的call,比如说你可以使用函数指针啊,只是相对而言有点麻烦而已啊,那这个呢,就是我们这个使用的一个方式的一个演示啊,然后呢,我们这节课呢,就这么多内容啊,有问题呢就问啊,没问题我就开始打广告了。
我来说两句