00:01
喂喂啊好,然后今天来讲的这个技术呢,叫做这个地狱之门啊,它是一种免杀技术,嗯,这个技术呢,怎么说呢,其实是基于我们之前一节课讲过的那个东西了。我们之前一节课提过的那个动态去除导入表的那个东西,其实稍微改一改啊,就可以改成我们的这个地狱之门。嗯嗯,应该是这么写啊,我们来搜一下。啊,地狱之门啊,就这么一个东西啊,地狱之门这个东西呢,它呢,这种免杀技巧呢,是基于什么的呢?它实际上是基于我们的系统用的。系系统调用,那我们的系统调用这个东西是什么意思呢?就是说我们在调用这个系统API的时候啊,它有一些API实际上是需要进入到内核中的啊,那么这个时候呢,你就需要干嘛呢?通过一个中转,然后进入到内核,这个中转呢,实际上呢,就是什么呢?就是SSDT表,或者说呢,是这个SST表。
01:23
啊,那我们在三环的这个API调用呢,实际上呢,最终呢,会走到什么呢?走到NTDLDL啊,然后NTDLDL呢,带着什么呢?带着这个SSDT的这个服务号,或者说叫系统索引号啊,然后下去,也就是这个index,然后下去去找这个SSDT,由NTDRDR进行中转到SSDT,然后SSDT去找内核函数啊是这么样的一个过程,那么在不同的时期和操作系统呢,它是有不同的这个系统调用方式的啊,你像是比较早期呢,它是通通过这个中断啊中断来进行这个系统调用的,一般情况下呢,通过这个in特2E啊进入内核啊,它是通过中断的方式,那么在后来呢,这个英英特尔的C呢,就这个率先呢提出了用这个指令的方式来进入啊,那么他呢,区分为两个时代啊,也其实呢,就是了32位和64位。
02:23
如果说是这个32位的情况下呢,也就是叉六的这个情况下呢,它会使用一个叫做这个。啊,这个指令啊,来进入内核,而我们X64的情况下呢,它会使用一个叫做CS的这个指令来进入内核啊,它但是呢,他们的这个操作呢,是比较接近的啊,这个呢,我们可以来编写代码来简单看一下。我们首先呢,新建一个项目啊,一个空项目就可以了啊,然后我们调用API来做一下简单实验。好,然后我们添加一个新的这个main函数啊,不是没函数这个啊,没文件啊主文件,然后右键属性啊,给它设置一下它的这个代码生成。
03:11
嗯,直接就第八个,然后所有平台好了,然后因为我们32位64位都要试一下啊,MTMTD啊,然后禁用掉这个缓存。Windows h,好,然后may。对,太里,比如说我们创建一个线程create three这个函数,那他前两个函,呃,前两个参数都是闹,第三个参数呢,就是我们的这个起始地址,我们直接跟进去。还是针复制出来,然后呢,给它稍微改一下,改成这个call back,我们在里头呢,也不干别的啊,就直接给他弹个窗。
04:27
好,然后把它地址放过来啊,然后类型进行强转。好,然后我们现在呢,就可以来给他重新生成了,现在呢,是X6的这个debug啊,我们充值成功啊,然后我们打开所在的文件夹,打开它的这个debug目录,然后在这个debug目录下啊,我们来给它拖进我们的调试器里边。
05:15
好在这个NTDRLDR啊,然后现在呢,我们按这个F9运行到我们自己的领空啊,然后呢,我们直接跟到主函数去,你可以一步一步跟啊,也可以直接跳过去啊啊,如果你一步一步跟呢,现在呢,就从这个may啊c t start up开始跟啊,直接进去啊,然后进进第二个,选完第二个进这个我看一下啊。诶。呃,应该是这个,应该是这个老九进去啊,对没错,好再进。
06:03
然后就到没函数了啊,然后你如果直接找的情况下,就右键搜索当前模块啊,跨模块引用这个,呃,不是这个这个create read啊进去啊就找到了,找到之后呢,在这个位置上我们可以看到啊,它是直接调用了这个create three的这个函数没有问题,因为我们现在是没有删除符号,所以我们可以看见这个名字,我们现在在这下一个F2实际F9走到这儿,走到这儿之后呢,我们F7啊,我们跟进去,跟进去之后呢,你会看见它在这里边,实际上会调用一个就是创建远程线程ex这么一个函数啊,我们直接F2在这上面下断点F9啊,此时我们的函数是位于KS里的,那么我们继续跟啊,然后F7 F7跟入之后,现在呢进入到这边了,现在呢,在k base.di点里啊,然后我们找啊在附近。可以看到这个位置上啊,有一个zw create three的ex啊,那这个这种ZW或者NT的函数呢,一般情况下就会调用到NT点点类去了啊,我们在这啊下一个断点F2,然后呢,F7跟进,哎,不对,我是F7跟进去啊,我这F9啊直行到这儿啊,然后呢,F7跟进去。
07:20
此时此刻啊,我们来看一下啊,这个状态,这就是什么,这就是系统调用之前啊,就是什么意思呢?就是我在这个位置上,我要干嘛呢?我要调用一个,因为我现在呢,是一个这个64位系统上的这个32位这个程序啊,所以说呢,他要呢,走一遍兼容过程啊,他没有直接去走这个C,但是他之后也会去走,那么我们现在呢,这个位置上啊,放的是什么呢?是一个这个C啊,C放到ex里啊。呢个C啊C好,然后呢,这个直接啊,然后走啊,那么我们此时此刻,我们现在呢,就知道了,我们这呢,有一个C的符号啊,那在什么位置呢?在它的这个CEX1的地方啊,就是这个,这个是第一个字节,是第二字节,所以它加一的分上这是32。
08:29
那我们来看一下64位的一个情况。我们把它直接调成60X64啊X64,然后重新生成。分收了之后啊,我们嗯给它右键打开,打开之后我们再上一级,然后是呃叉六四叉64D bug啊,然后把它拖进我们的这个,呃叉哎呦,我去卡住了叉64D bug里边啊。
09:00
好,然后现在呢,我们直接啊还是F9运用到自己的领空,然后呢,我们现在呢,就不不一步一步跟了啊,我们直接跟到这个。com模块调用上啊,找到我们的create threead啊,在这个位置下个断点,然后走过来,找过来之后呢,我们F7啊进入,首先我们现在在自己的模块里调用的create threead进入啊,首先我们进入了这个C32的模块啊,这个是这个create three的一个函数,一个实现啊,那这呢是什么?这个是调用create啊,远程线程啊ES啊,我们再走到这个位置上。然后啊,跟进去,跟进去之后啊,这是什么?这是创建远程线程ex的一个内部实现,也就是在科里边啊,你看啊,科特里边啊,那我们继续往下走,在这儿啊,调用了zw create three ex啊F9到这步为止啊,跟32位置没有任何区别的啊,我们直接再跟进去,跟进去之后你可以看到区别来了啊,那这是什么啊,这是64位版本了,那么这个时候SCO呢,就很明显的放在这里了。
10:01
它的一个过程是什么呢?首先呢,是一个这个RCX放到这个R10里边啊,然后呢,把这个C1的一个调用号,你可以看到啊,这个函数啊,无论是32位和64位,它调用号是一样的啊,然后把这个11呢放到EXAX里头啊,然后呢,再去和把一和这个7f fe,零三啊和零这个008啊进行一个对比,然后呢决定要不要跳转,如果跳转呢,就跳到这儿啊,如果不跳转呢,就直接执行它什么意思呢?但是这是一个兼容性操作啊,什么就是什么呢?就是我们如果说啊,在这个位置上,前两个没什么好说的,这个其实是在导参数,这个呢是这个传符号这一项才是这个重点啊,这一项的重点是什么呢?它是在对比它支不支持用C,如果支持用呢,它就直接在这个位置调用C进内核,如果不支持呢,在这块跳转跳转到这儿用INTEL2E进内核啊。但是我们在写的时候不用,不需要去这样搞,因为什么呢?因为我们如果自己写的情况下,我们清晰的知道不用他可不可以用这个,如果不能用的话,我们也不会去用它,对吧,所以说呢,我们直接就是干嘛呢,就直接跳过这两个对比啊,直接调用CS就可以了啊。
11:14
好,那我们这个东西我们已经知道之后呢,那么现在呢,我们再了解一下什么呢?了解一下啊,了解什么是系统调用了,那我们接下来继续知道这个这个呃,地狱门是怎么去免杀的,地狱门的免杀呢,实际上而言就是什么呢?就是不走啊,不走NTDDL,而是什么呢?字写啊。自写CS调用。直接啊,直接进内核啊,是这个原理啊,然后通过这个过程呢,他就不走这边了嘛,那么一些挂钩啊什么的乱七八糟的东西,其实对他就这个没有检测作用了嘛,然后呢,就能达到一定程度的这些免杀。
12:00
那么要实现这一点呢,它其实呢,也很简单啊,首先呢,我们第一点是不通过啊,不通过任何方式啊,不通过这个任何这个API的方式啊,来这个获取到这个呃,N t dil dl地址,而是什么?而是首先我们用一个这个呃API来获取一个结构啊叫做NTC retb这个这个API,我们把TB这个结构啊给它获取出来,获取完结构之后呢,根据这个结构一路顺藤摸,摸到什么呢?摸到我们NT第模块的啊base啊这是第一步啊,然后呢,第二步是什么呢?第二步啊是自己啊写函数啊分析啊,NTDLDL的导呃导出表。对比啊对比哈西。对比哈希或者什么函数名,但是建议对比哈希函数名太明显了啊,它会生成字符串,那对比哈希对比哈希啊,找到啊想要的函数的啊这个呃,地址啊,那找到函数地址之后呢,第三步是什么呢?第三步是通过这个0X加加0X啊,就是函数地址加0X4的地方,实际上嗯,我这这两个是一步啊,找到函数地址,函数地址加0X4地方。
13:26
就是啊,这个函数的啊,索引号为什么加0X4呢?我们回来观察一下,你看这个位置开始它是索引号在这个C1这儿是吧,那我们首先呢C,你看这硬编码里边啊,它是什么情况啊,我们直接把这个硬编码给它复制一下。那二进制我直接给他这个,我直接复制一下小区吧。啊,放到这儿你可以看到啊,这4B这不是这个它前面的部分吗?对不对。
14:02
那C前面实际上就是四个字嘛,那我们拿到这个地址之后,那这个地址,然后呢,再再加上四个字节,实际上实际上就是是不是就指向了我们C1呀,就。又能把我们C给这个出来了,对不对啊,那所以说呢,这个时候拿到它的这个号。索引号符号,拿到这个索引号符号之后呢,那么接下来呢,我们就可以干嘛呢?直接啊,直接自己啊模仿NTDRLDR中啊这个符号的一个调用C操的调用方式,嗯,进行调用啊,但是呢,我们因为会调用很多函数,所以说呢,我们会使用一个什么方式呢?会把这个我们调用的时候啊,会做一些简单的特殊处理啊,而且呢,我们在64位下,它是不支持内联汇编的,我们要给它增加这个汇编的支持,然后通过这个外置汇编的方成外置纯汇编的方式啊,来进行大家进行一个调用,并且呢,我们因为参数不定啊,我们还需要一个不定参数的一个声明。
15:12
啊,然后呢,以这种方式啊,来完成它这个一个调用,那简单的这个原理我们理解了之后呢,我们现在呢,就来开始写它的一个代码啊,那这个呢,我们就不动它了,我们作为参考,我们再给它创建一个。K。确定。然后啊,我们给它添加一个,呃,不需要头文件啊,添加一个原文件好了。entry.cp。
16:00
好,我们包含一下必要的头文件啊,首先呢,我们因为有一些文件有一些这个类型的问题啊,我们肯定还是要包含一下Windows h的。啊,然后因为是64位啊,我们采取优浪浪来作为这个返回的一个类型啊,因为它的长度是64位的一个,呃,那个返回地址嘛,然后我们获取啊。嗯,Nt DR address。给它改成64位啊,然后右键属性。嗯,代码生成啊,改成MTD。然后这个环节给它关掉啊,确定啊确定,然后呢,这边呢,什么也不需要啊,直接这个流程呢,其实呢,跟昨天我们直接呃上节课直接写的那个32位的,其实没什么太大的区别,但是32位我们是用汇编写的,64位呢,我们就不能用汇编啊,也能用汇编,但是呢,你要用纯汇编比较麻烦啊,我们就直接用指针来实现啊,U nt DR等于零啊,然后呢,首先呢,我们要获取一个这个PTBPTB啊这个呢,其实我们可以通过FS来进行获取,但是那个需要汇编嘛,我们就直接调用一个系统的一个API ret TD啊,我们直接TB啊,我们直接来这个获取一下,获取完事之后呢,我们现在啊来找它这个是TB现成这个环境块啊,那我们现在要找这个B啊。
17:45
PU浪浪啊,这个PPB等于。这个PTB啊,然后呢,这个加上0S60这个位置呢,如何去分析,可以去看咱们的上一节课啊,如果是这个没有上一节课的,可以找咱们老满进行领取啊,咱们上一节课有分析过啊,如何去获取它的偏移,好然后呢,我们现在呢来给它括起来啊,然后这个东西因为不支持这么加啊,我们来给它类型强转换一下,转换成U浪浪,呃,然后呢,要给他进行这个强制转换。
18:31
转换成这个PU浪,嗯,然后PU浪呢,上边呢,因为这个地现在是个地址,我们要把值取出来啊,要节引用,节引用完事之后它又不符合这个类型了啊,那就需要再给它这个强制转换一成啊好,那就这样了,这样完事之后呢,我们下一层啊,我们要找到其中那个LDR的那个那个结构啊,那个结构PDR啊,等于还是这么一套啊,我们直接复制就行了啊,没有什么区别啊,那这回它的这个结构里边,它的这个偏移呢,是由这个PB进行加的,加的这个偏移呢,是在PB0S18的一个位置上,然后呢,这个LLDRR里边呢,我们会找到它的这个初始化加载模块链链表的这个链表啊,那这个链表呢,在LDRR这个结构的这个0S10的一个位置上,那么我们继续往下找。
19:32
P音load。Or Mo list等于。嗯,这个呢,跟前两个不太一样了啊,那这个东西呢,我们首先呢,要在RDR加0X10的地方上获取。然后这个呢,也需要给它进行一下类型的一个强制转换啊,转换成U浪浪,然后呢,前面呢,给它强制转换成这个PU了。
20:09
啊,这就行了啊,这不用借着用啊。好,这样呢,我们就获取到了,获取到之后呢,我们现在呢,来找啊,那么我们这个初始化模块列表里边,它的这个第一项啊,我们要找一个它的一个链表头,然后呢,从这个链表头上取出来的这个第二项啊,实际上就是我们的这个模块的一个NTDRDR的一个地址了。NTDR等于。
21:08
因为它这个是一个en结构,实际上这种取值就是在取它的。好,然后呢,把我们的这个值啊给它取出去。这种方式其实就是类似于指针取值啊,然后呢,我们拿到之后直接把它掉。这样呢,我们就获取了这个NTDRLDR的一个这个呃,模块的一个机制啊,获取完NTDRLDR模式机制之后呢,那第二步呢,就开始我们的一个获取啊,它索引的这么一个过程了。Get nt啊,PLC index,那这个呢,我们就要来传入一个这个哈西了,好,那这个哈希打哪来呢?这个哈希呢,你随便在网上找一个哈希计算函数就可以了,但是呢,我这呢也给你提供一个啊。
22:17
就是这个哈西。那我们现在呢,来这个给它创建一个函数啊,创建一个新的啊。新的。Name。确定。然后右键属性啊,给它设置一下。啊,没有没有创建文件啊。
23:08
啊,这就是一个get哈希啊,非常简单的这么一个小函数啊,然后呢,调用的时候你就直接传入你想要获取的函数名就行了,那比如说我现在呢,要想获取什么函数,我这一点啊,然后比如说我NT,呃,ES我就一运行。你看他哈希就出来了,然后我们一传就行了啊,但是现在用不到啊,先给它放在这儿啊,我们先回来。回来之后呢,我们现在呢,首先呢,还是要来解析它的这个导导出表嘛,所以说我们先要获取到它的这个地址啊,那我们用一个ULL啊,这个base来等于什么呢?等于我们的这个get nt dl dl address,好,那这时候呢,它就指向这个模块的一个手提纸啊,那我们现在呢,可以来,呃,算了,先不运行了,先这么地吧,然后底下我们给他写一个。
24:07
那接下来呢,我们就来开始解析啊解析那首先p image。到头P到等于。U,然后呢,是p image nt p nt等于。豹子头。指向EF啊W加上啊ul得到NT头,拿到NT头之后呢。嗯,不对,我们现在是64位啊,我们要拿NT64头。啊,那这样64。
25:03
好,结构稍有不同啊,所以说呢,这个还是需要注意一下啊,要不然我一会儿又来查本天那接下来呢,我们就要拿到它的这个导出表啊,导出表我想想啊导出表。嗯。首先呢,我们要在它的扩展投中拿到它的这个数据目录表,它的一个这个结构。PNT。扩展头,扩展头,然后呢,在里边有一个这个数据目录表,好,然后我们直接用这个数组的方式吧。
26:12
然后来找一下啊iy n。找出。嗯,不存在,从。哦,对啊,是这样的,那我这样写吧。这样写还有点小问题哈。嗯,这样写就行了啊,这样写完事儿之后呢,呃,对没点关注的点点关注啊,我们每周六周日都有直播,那么接下来连续十天都会有直播啊嗯,那我们现在呢,给他来这个设置完了,设置完之后呢,我们接下来要获取他的这个呃,虚拟地址了啊,那我们用一个word DW。
27:30
Address啊,虚拟地址啊,获取完之后呢,那么接下来我们找到它实际的结构啊。Image。ESPORTDIR。等于。
28:04
Ul base加上O找到它文件中的位置,找到文件中的位置之后呢,现在我们找到导出表了,那接下来我们现在要这个获取几样东西啊,首先我们要获取它的这个,呃,函数总数,函数名称总数啊,然后呢,这个。啊,还有什么,还有这个导,呃,应该还会获取一个名字,然后呢,再有三个表啊,就是我们的这个函数地址表,函数名称地址表和函数这个,呃,名称序号表啊,这个的地址。嗯,首先我们获取一下函数,呃,函数总数啊。啊,Content等于啊,这个在导出表里,导出表的这个number of方S啊,这这个啊,然后下一个啊,找到名称的总数DW fe name content等于。
29:15
There number of。Names,好,这两个就找到了,找到之后呢,那接下来三个表,首先这是这个函导出函数的这个地址表,那么这个呢是p pet等于。其实这就是E就是导出啊,然后A就是这个地址,T是T标啊,然后呢,我们来给它强制转换一下。由我们的贝斯加上啊导出诶写错了啊导出表。导出表里边有个成员叫做a DR of啊,Function,好,这个是什么?这个就是我们的一个函数地址表,然后继续word pen,这是名称表啊,N是name。
30:20
用base啊,加上 heex.a of names好,然后之后是一个序号表,序号表需要注意是p word,不是pd word啊。加上P。好OK啊,这三个表就有了,接下来呢,我们循环遍历,循环变历,根据我们的这个函数容数啊,进行一个这个遍历。
31:09
好,首先呢,我们判断一下。地址表的I不存在直接退出。然后呢,我们,呃,获取一下这个。嗯,获取一下我们的这个函数的一个地址的一个off啊,这个我得用一下U浪浪吧,应该。等于呃,这个函数地址表的第个好,这个实际上每一个拿到他的这个地址的一个偏移,它其实就是在这个相对偏移啊,就是我们之前整批的时候讲的那个概念啊,它要加上我们的这个,加上我们的这个什么呀,加上我们那个base啊,然后它还实际上它的这个里边的地址,好,然后呢,我们现在呢,来继续循环,循环这个带名字的这个函数啊。
32:35
Index啊,然后呢,名称的总数翻过来,翻过来之后呢,现在呢,我们有了这个,有了这个之后呢,我们就继续啊进行一个判断,判断我们的序号表。序号表的第I个,或者说叫d index的和我们的I是不是相同啊,是不是从头开始啊,然后呢,我们继续啊,来获取一下名称的这个偏移啊,然后呢,用这个偏移去找它的文件地址。
33:09
You,愣愣ul of。等于pet。不是那个pen。Inex,好,继续啊获取啊p fun name等于二星强软,然后ul加上ul name,呃,不对,F。啊,写成A了啊,这是内部。然后呢,这个呢,给它括起来。
34:05
应该是不用强转了,应该好,然后下一步啊,然后呢,我们就开始来计算当前函数的哈希。计算哈希呢,我们就直接采取刚才我们拿出来这个函数里的哈希函数就行了啊,比如这一部分,我们直接把它拿出来。拿出来之后我们进行替换啊,把它函数名的部分都进行替换,替换这三个地方就行了,然后呢,它计算出来哈希存在这里边,计算完哈希之后呢,我们就开始进行一个哈希的一个这个对比啊,就对比它这个哈希,我们参数这个哈希。如果说参数的哈希和目标的哈希一致,那就说明我找到目标函数的一个地址了,那么这个时候我要return,但是我直接return其实是不对的啊,我应该干嘛?我应该return的是什么东西呢?首先我现在呢,有一个这个ull base,那这个base加上什么ul base啊,加上ul函数的一个地址的偏移,这样呢,找到它这个函数真实的位置在哪,然后找到真实位置相对模块里,它这个位置在哪?之后呢,我们要给它干嘛呢?我要给它加上啊0X4,嗯,然后呢,因为这个,呃,这个要给它圈起来啊,要圈起来,圈起来之后呢,这个是地址加0S,也就是说移动后四字节,然后呢,要给它上面取出来什么样的一个值呢?取出来一个差这么大小的一个值啊,因为我们的索引号就是一个C嘛,其实就一个字形嘛。
35:43
然后给它取出啊,取出之后引用啊,然后进行返回啊,好这样就返回了啊。返回我们获取到了索引号,获取完索引号之后呢,实际上而言呢,我们这个东西呢,就也就差不多了不吧,那么我们在这儿还有什么东西呢?就做一个实简单的一个这个小实验啊小实验,那么比如说我现在呢,要给他来这个。
36:06
嗯,我我我现在呢,要调用它其实还没完事啊,我这不是还有流程的嘛,我这还要给他自己写这个call,所以说呢,我要在上边啊,给它生成依赖项啊,然后生成自定义,把这个m s masm勾上,点击确定,确定之后呢,我们现在呢,要给他来给它添加一个原文件,点击新建项,那么这个时候我要添加的呢,就是什么?就是这个C。嗯,我不写谁考了,我写这个吧,还还要靠啊点asm点击添加,添加之后呢,我们首先一个点code的啊,然后一个end啊,先给它圈起来一个代码段,然后呢,我们这儿呢,实际上还需要一个这个数据段的一个点点data。我去拿杯水啊。
37:24
呃,点data,然后呢,这里边呢,首先呢,因为我们如果说直接C的话,那你要声明好多好多函数对不对,那我在这呢,我其实用想用一个函数解决,比如说我现在我如果一有一个这个还要call这么一个东西。PC。好,然后呢,如果说比如说我就想现在是调用什么,调用我这create这个create ES,那不是这个three,那么这时候我其实就是什么,就是move,首先木R10,然后给他一个R7X啊,然后呢再给他,然后呢是这个ex里边我给他一个这个C就OK了,对不对,然后呢,我调用这个S。
38:13
调用完C操之后呢,1RETURN走你完事,但是这样的话,我每一个函数我都需要写一个这样的函数给它声明出来啊,就很麻烦,那我想写一个通用的东西怎么办呢?那我就这样啊,我在这里边呢,我给它来一个这个调用号一个存储啊调用号一个存储,呃,比如说啊,我在这儿啊,我给他我这个给他往后偏一级吧。这样写啊,看着好看一点啊,我这比如说我这有一个这个调用号call are death。然后一个迪。那这样是不是就可以了,但是我直接每次进来的时候呢,我这个东西去哪初始化是个问题啊,因为什么呢?因为你这个东西实际上在调用的时候是当做当前的函数去调用的,你没有地方给它放这个索引号,那所以说你应该怎么办啊,你应该提前把它的这个东西给它初始化出来啊,那你这样呢,就需要一个什么呢?就需要一个东西啊给它进行初始化。
39:19
C。好,然后呢,首先呢,给它进行一下初始化,防止它有之前的一个值啊。然后再把这个所引号给放进去啊,我们这个呢,肯定是在这个RCX里啊,所以说呢,我们直接给他就行了,但是因为它是一个点啊,我们直接用EX就行了。
40:00
32位的啊,然后呢,我们这啊给它传完之后直接R回去就行了啊,那这样呢,我们每次在调用函数之前呢,先调用这个函数,把它这个索引号传进来,然后进行设置,然后呢,之后呢,再通过它进行函数调用啊呃,我们没点关注的点点关注啊,我们这个每周六周日都有直播啊,这是接下来十天都有连续的一个直播啊,然后呢,我们这个东西啊,我们就已经OK了,OK之后回来,回来之后呢,比如说我现在呢,想调用一个函数啊,那现在呢,我就可以来这个简单的来做一个小测试了啊,那比如说我在里边我想调用一个创建线程的。呃,我现在呢,先给他来写一个暂停啊谢,那首先呢,我要创建现我要创建线场,我肯定使用的是什么create这类的啊,那create three底层是什么,我们刚也看见了啊,那就是这个nt create three的啊ex,那这个时候呢,我就干嘛呢,我就首先给它计算出一个哈一。
41:10
在这对吧,那我现在呢,给他计算哈希。好,复制下来。这是它的哈希值,那我们现在呢,就可以来给他这个传哈希了嘛,就是首先呢,我们通过这个哈希去换获取他的这个索引号嘛,那我们要设置啊。要设置调用这个对吧?啊,但是我们没有声明啊,我们要在最顶上给他做一个声明。啊,有头文件的就给声明的头文件里,没头文件就直接在声明的就得了啊ten啊ten c,然后word没有返回值啊,How that。我直接给它复制出来吧啊,防止我写错名啊。
42:02
好,然后它有一个参数啊,一个word。一个word的这个index。好,然后呢,再来一个啊STEM。C。好,还是这个word返回啊,这回呢,我们用这个,但这个东西呢,你就不能写什么固定的参数,因为它每次当做的函数都不一样啊,那所以说呢,我们就干嘛呢,我们就直接给他三个点啊可变参好,那这样就OK了,OK之后呢,我们现在呢,首先来调用第一个函数啊,然后呢,我们现在给它在里边调用什么呀,调用这个啊,调用这个获取这个索引的这么一个函数啊,直接在里边进行调用。索引值啊,往里一传好,那接下来呢,我们就可以干嘛呢?我们传完之后啊,这获取用它获取完索引值之后直接传给它了啊,那里边就设置好了,设置好之后呢,我们在里边呢,就可以直接啊对它呢进行一个调用了啊就是这个呃,Call,那这个call呢,此时此刻就相当于什么呢?相当于这个函数啊,因为它里边设置的是什么呢?设置的所引号是它的,所以说现在就相当于这个函数了啊,那我们在里边呢,就调用这个就行了啊,那么我们就按照它的参数来传啊,如果你不知道它参数有什么啊,那你这时候呢,你可以来参考什么像什么MSDN啊什么的啊。
43:31
啊,你就可以来找啊,它的参数是什么好,那现在呢,我知道他参数是什么呢,我就直接给他传了啊这个这个你就不用指望它有这个提醒了,为什么呢?因为我们这个东西呢,就没调用人原函数,它就不可能有提醒啊呃,首先呢,我们需要两个参数啊,就是在上边啊,我们需要两个参数。一个handle h three,还有一个handle it price price,这个呢要获取一下当前的一个句柄get CT,然后是这个price。
44:11
地址。呃,然后权限啊啊。No变成句柄。嗯,然后回调函数啊,回调函数我们一会儿再写啊,然后零。应该是五个。然后我们去那边调一个这个,刚才不是写了这个吗?然后我们直接拿一个过来啊,这个回调函数过来。
45:02
好,我们运行一下试一下啊。可以看到啊,它正常弹出了啊,说明我们这么写是完全没有问题的,但是呢,我们地域门这个东西呢,我们肯定也不是就是为了这个就调用一个普通的线程回调对不对,我们肯定是想这个用这个扣的,对吧?嗯,那我们现在呢,就来给它生成一个S扣的啊,然后来实际上来看看应该怎么调用啊,我们用这个直接msm,呃,不是这个MSF啊,来给生成一个啊。哎。
46:26
生成一个弹计算器的。就这玩意儿啊,我们给它拿出来。复制。放到这儿啊,我给他简单改一下啊,这个是有。CODE272个等于。
47:07
好,然后把这些东西去掉好这三后的就OK了,那你直接就用这玩意儿肯定是不行的啊,因为我们这里边儿其实是有一定的这个保护在的,你如果想要直接创建线程来执行它的话,会出现问题。嗯,说的对啊,确实中过招了啊,那个然后呢,我们这个要给他来首先做两个处理,就是首先要申请一下内存啊,然后呢,再给他做这个写内存操作,然后再给他执行啊,那我们这儿呢,用两个函数。一个函数呢,是NT。IO。AC。A。Memory一个是这个,然后写内存用这个NT外。
48:09
Virtual memory。啊,为了防止我记错,我直接给他百度一下。哦,没错。啊也没错,好,然后呢,就计算他们俩的一个哈希啊,我们直接把这边哈希这个复制三份出来啊。好,直接运行。
49:06
然后把它复制下来。嗯,这个七九这个是。Years harder。哎,少复制点。哦,这个是。他的好这样就行了,然后呢,这样调用其实就很简单了啊,我们申请的时候,这个调用就很简单了啊,还是一个套路啊,首先呢,我们要给它把这个哈希传进去进行设置。好设置完之后,设置什么函数,它就是什么函数啊,然后呢,用它进行调用,那我们这个呢,就开始申请内存了吧,那首先呢是这个进程句柄,然后呢是这个我们这个东西申请你要有个地址嘛,然后把它之后指针放在哪啊,那所以说呢,我们这要有给他一个这个指针啊,那我们用一个这个lp word的一个就行了。
50:12
PP address等于no,好,然后呢,我们把它传进去。好,这是地址,然后再后一个呢,就是。呃,不对,我这个地址,我得给他传个地址。说的好像有点要啊,然后还有就是我们的这个size啊,你要搞多大一个。查个地址,然后属性啊,接着是页属性。E可读可写可执行零零好这就申请完了,申请完之后啊,写还是一个套路啊,先给它设置啊,设置成什么函数。
51:18
然后调用调用起啊,那首先呢,我们第一个还是进程句柄。第二个呢,我们的这个地址lp address。第三个呢,就是我们的这个。Off。零好,这样应该就OK了,OK之后呢,把这个call back啊,进行一个这个替替换啊,直接替换成我们的lp address啊,然后这个前面这个就不需要了啊,OK,然后呢,我们直接运行。
52:08
啊,无法启用的程序。啊,被杀了这个无所谓啊,这个是这个被杀了,我们直接把他这个玩意儿关了算了。因为我们的这个code没有做那个处理啊,所以特征太明显了。我们把这个东西给它关掉。哎,好像好像没已经关了吧,是不是。啊,算了,我直接去另一台电脑上跑一下吧。懒得设置了。没生成出来都我去重新生成。啊,不对,是被杀了,我操他这么快吗?
53:14
就过分了。我操。嗯呃,对他那个你了,谁问谁是老板呢,老板你自己发一下联系方式。好运行。看着没,计算器弹出来了。嗯,但是呢,这种呢,因为是已经比较早的一种免杀方式了,所以说单纯使用它一种免杀方式呢,效果肯定是不理想的,那么你还要配合什么呢?配合着对cell code的处理啊,然后还有一些其他的手段啊,那之后呢,咱们课程中呢,也会讲到这些东西啊啊有想要学习的可以点一下关注,然后呢,有需要往期课程的可以联系咱们老满啊进行一下这个领取啊,那这节课这个呢,我们可以看到啊,也就已经OK了啊,这个地域门的一个调用呢,咱们就已经写好了啊,可以正常的去调用一个code了。
54:22
好啊,有什么问题没有啊,如果没有问题呢,咱们这个技术部分啊,马上就完事了啊。
55:33
啊,我没结束啊。
我来说两句