00:00
好,那么我们今天呢,还是继续讲这个反调式专题啊,那今天呢,我们依然要两讲这个反调式啊,然后今天有两种反调式啊,然后加上我们之前啊,已经有十几种了啊,然后我们继续。啊,这个名字就不改了,就随便吧,点确定啊空项。好,然后呢,我们创建一个新的项啊,然后添加文件啊,名字随意啊。啊,然后呢,右键啊属性啊,给它设置一下它必要的一些属性啊,比如说代码生成里头啊,把mdd改MTD啊,然后这个环节它已经关了,就不管了啊,点击应用点击确定啊就可以了,接下来呢,我们包含一些常用的一些投文键啊,比如说这个I stream啊,这个输入输出流啊,还有这个呃字符串。啊,我们啊,Windows下的反调式呢,一般情况下呢,我们要包含一个windows.h方便我们调用一些API,那像是我们今天这些东西呢,有一些呢,可能是需要这个去调用一些未导出的函数,以及这个进程便利相关的函数,所以说呢,我们要给它放一个这个tr have32以及一个结构体相关的头文件。
01:21
好,这些有了之后呢,我们首先呢,创建一个魅函数啊,有了面函数之后呢,我们现在呢,就可以来开始写我们今天的反调式了啊,那反调式呢,今天呢,我们一共实现两种,第一种呢,是这个基于基于什么呢?基于这个附进程啊进程的啊,我们正常情况下呢,我们来看一下啊,我们右键啊任务管理器啊,正常情况下这些进程如果说是正常创建的,它应该是谁来创建呢?应该是这个进程来创建的啊,所以说呢,它附进程呢,应该都是它,那如果说附进程不是它的情况下呢,那么就有一定可能性是这个调试器,因为比如说你如果是在studio里啊创建啊,那么它的附进程就是studio啊,它会有一个studio的进程,那如果说你是在调试器里进行这个创建的一个进程,那么这个时候它的进程就是一个调试器,所以说呢,我们可以基于调试器啊判断,如果它的进程。
02:22
是这个啊,那么就有可能是在这个呃,被调试的状态下,当然了这个呢,不是特别的准啊,所以说呢啊,要自己选择性的使用它啊,那么第二种呢,就是什么?第二种呢,就是我们啊这个基于基于设置啊线程啊信息的啊设置线程信息啊,然后干嘛呢?啊就是可以说是两种状态啊,也可以说一种状态就是剥离,剥离调试啊线程也可以说是什么呢?也可以说是啊啊限制。创建啊,调试这个线程啊,他们俩实际上干的一件事啊,就是要调试进程起不来啊,但是呢,说法有点区别啊,我们今天主要来实现这么两种。
03:12
首先呢,我们给它来一个这个结束前暂停啊,防止防止它一下就没了,那么我们首先呢,来实现第一种啊,基于附近城的这一种啊,基于这种呢,我们逻辑已经知道了,就是来找到我们自己的一个对不对啊,然后呢,我们通过这个的一个对比就可以了啊,那么现在我们啊来实现这个checkbug。好,那在这个里边呢,我们直接啊获取一下这个进程的ID和进程ID就可以了,但是因为因为代码量比较大啊,所以说呢,我们给它封装一下啊。首先呢,我们给装一个当前进程啊,这个或者说指定程进程的这么一个啊,回一个啊,因为你回的这个进程ID,所以说放一个,然后get get进程。
04:10
你想要获取哪一个进程的父亲的ID啊,作为参数传进去。首先呢,我们要创建一个这个便利进程相关的一个这个快照啊。我们这个参数呢,第一个参数呢,就是我们要指定要便利什么啊,因为它可以便利这个进程,便利线程利呢程,然后呢,第二个呢,是一个进程ID啊,我们直接啊给选上啊,选上零啊,因为我们现在呢,便利是进程,如果你便利的是程或者其他东西呢,你这呢,就需要给它提供一个真实的这个呃进程ID,那现在呢,我们不需要的情况下呢,我们继续往下走,我们继续判断一下啊,我们有没有获取成功,它这个东西如果说它等于in vali handle,嗯,哎呀。
05:20
没选上啊。啊,如果等于这个就说明失败了啊,那么这种情况下,你直接返回一个这个负一就可以了。好,如果说没有失败呢,就继续往下走,那么这个时候我们要开始便利进程了,那我们需要一个便利进程相关的一个结构体啊,也就是entry entry32啊,我们写一个变量名啊,直接给他一个T32就可以了啊,我们在使用之前呢,需要对它的DW size啊进行一下这个设置啊,就直接获取一下它的这个结构有多大啊,给它算进去就行了。好,然后呢,我们现在呢,给他这个设置好之后呢,我们接下来呢,就要开始便历了,首先呢,我们这个快照呢,就跟这个便利列表一样,从第一个开始。
06:12
等于啊PRICE32FIRST啊,先找到第一个啊,找到第一个之后呢,我们第一个传入的是我们的这个进程,进程快照这个句柄啊,然后第二个呢,就是你要纯的这个结构放在那儿啊,这把这个地址传进去啊,其实呢,你在这儿直接用nest其实也是可以的啊,这个呢,只是为了更加可读啊,不是说一定要用这个first啊,因为你一会儿在便利的时候还是要要用N的啊,我们写一个这个while循环啊,然后呢,如果它有效啊,那么就进入循环内部,刚才我们也说了,我们如果要找下一个,我们需要用这个next啊,然后呢,我们现在呢就来找一下啊,没点关注的点点关注啊,有需要这个领取课程的可以联系咱们评论区的老板来进行获取啊好,然后呢,我们现在呢,用这个PRICE32NEXT啊来进行获取下一个进程的一个操作。
07:02
好,它俩的参数呢,是一样的啊,第一个呢,也是一个进程相关的一个快照啊,第二个呢,是这个我们进程的一个结构,那我们现在呢,要获取的是指定进程它的副进程的ID,所以说呢,现在呢,我们首先判断判断我们当前便利到的这个进程啊,它的进程ID啊,在这个位置进程ID没选中啊,进程ID选中了是不是等于我们传入的这个参数啊,如果等于这个参数的情况下呢,就说明我们选的没有问题啊,如果不是呢,就说明它不是我们要找的这个啊,那如果它是一样的情况下呢,这个时候呢,我们就可以直接return return什么PE32里边直接就有一个附进程的一个啊一个字段啊,我们把这个字段返回啊,那么这个情况下呢,我们就成功的返回了什么它的进程ID啊,所以说呢,这个是什么,这个函数的功能就是获取指定进程的负进程ID啊,然后呢。
08:05
它的这个参数啊,它的这个参数就是你要获取的,要获取附进程ID的进程的ID啊,就是这个东西,然后里边进行一个获取它的返回值。进程ID好,然后呢,我们接下来呢,接下来要获取的就是什么呀,获取的就是我们的这个资源管理器啊,它的这个进程的ID是什么,因为你要获取到它的进程ID是什么,才能和我们刚才获取到的这个ID啊进行一个对比,那么现在呢,我们就直接来进行获取,但是如果我们只获取这一个进程的这个函数没什么意义,我们为了代码复用啊,我们可以获取一个通用的这么一个东西啊。啊,那这个功能呢,基本就是获取。
09:03
获取进程ID。进程名啊,使用名字去搜索ID啊,然后呢,它的参数很明显就是一个cost char星SZ啊,Process name啊获取的就是一个进程名,那现在呢,我们传入啊,传入之后呢,前面这些操作其实跟刚才没有区别,所以说呢,我们可以直接把这个复制一份啊拿过来,但是呢,在对比的时候啊,我们对比的东西就不一样了,在这个if里边,我们要对比的东西是存在差异的啊,我们STRCMP啊进行一个对比,对比之后呢,对比的呢就是我们的sc process name以及呢PE32里边有一个这个Z,嗯,PE32店啊,然后里边有一个SZ啊,E SE file啊这个东西它们俩都是文件名啊,如果相等的情况下,就是我们要找的东西,那么这个时候我们不要返回它的附进程ID,而是返回它的当前的一个进程ID,这呢返回的就是什么?就是资源管理器的一个进程ID,然后呢,我们现在呢,就实现了这两个功能啊,这个就是什么获取。
10:11
获取通过进程名啊,获取指定进程的ID啊,它的参数啊。这个呢,就是进程名后边这个返回值呢,就是什么?就是我们的这个进程ID,好,那现在呢,我们拿到他们俩之后呢,我们现在呢,就可以在这啊来对它进行一个获取了,对不对啊,那这个获取的时候呢,首先呢,我们要获取什么?获取我们的这个呃,获取一个进程ID来传入这才能获取到的进程ID,对吧?那我们现在呢,要来获取我们当前进程的一个进程ID啊,我们可以直接啊来这样来获取啊,就是get啊,Process啊,然后呢,ID,它这个参数呢,它这个函数呢里边呢,只有一个参数,就是一个进程句柄,那你就可以填一个自己的一个这个尾句柄进去就行了啊,然后就是get crut啊,Process啊,这个不要用那个ID的啊,那个那个用一个ID来获取的精争ID,它不是真的ID啊好,然后呢,我们现在呢,获取到之后啊,我们来直接啊给它干嘛的,用一个dord啊DW啊process。
11:27
SID。等于啊,这个好获取完事之后呢,我们把它这个ID进去,那么这个时候呢,我们就可以拿到什么,拿到它的这个父进程ID。对吧,拿到它ID之后呢,那接下来呢,我现在就可以干什么了,来进行一个对比啊啊不对啊,我还要拿一个什么,拿一个资源管理器的ID,对吧。
12:06
点EE啊,这个传入,嗯。我是不是写错了?啊,等一下啊,不是这个啊,然后呢,我这返回返回DW。ID啊,等于它好现在就获取到了啊,获取到之后呢,我们现在呢,进行一个对比啊,如果说啊这两个ID相等,那说明什么?就是它是由资源管理器创建的,那么这个时候呢,我们就可以啊给他一个这个false,那否则呢,明显就不是资源管理器创建,有可能就是调试器了,对不对啊,所以说呢,我return一个true啊,那么这个呢,就是我们的实现的一个过程啊,那么接下来我们可以啊使用一个线程啊,来给它调试一下啊,来使用一下,当然在这个使用线程调试之前呢,我们也可以在本地调试一下,测试一下它的一个功能性啊,首先呢,我们在这儿呢,下一个断点啊,下一个断点我们运行一下。
13:19
运行一下之后呢,我们可以F11跟进去啊,根据之后,首先我们获取一下我们当前进程ID是19520啊,现在呢,我们可以点开之后,我们找一下这个19520,可以给它进行一下排序啊,排序之后啊,现在呢就更好来找他了,现在我们找一下一九。19520,你可以看到就是我们这个project啊,然后15的点exe这个找的自己的进程ID是没有问题的,那么接下来呢,我们找的啊是自己的附进程ID是3280啊,那我现在呢,来找一下3280。3280是这里,你可以看到这是什么d vev啊,但是它这个这个东西你可能不认识,但是它前面这个图标你应该是认识的,很明显它是一个啊VI studio的一个这个进程啊,所以说呢,现在呢,找到它附近城属于VI studio,那么接下来呢,我们往下再来一步啊,再来一步,我们走一步啊,走一步之后呢,你可以看到这是2888啊,然后呢,我们来找一下2888啊,你可以看到就是资源管理器对吧?啊,现在呢,我们这三个东西啊,找到的东都是一样的啊,都是这个没有问题的,那我们走,走完之后,你可以看到一个这个数是说明什么,因为这个东西是这个studio来创建的,而不是什么,而不是我们的这个啊资源管理器来创建的,所以它会出现一个这个报报这个调试的这个现象啊,那么接下来我们就可以干嘛呢?我们可以来创建一个线程啊,使用线程来进行一个便利啊,还是啊create前两个用到啊,然后第三个呢,是它的一个这个回调函数啊,我们直接F12跟进去,然后把它的回调函数拿出来,拿出来之。
14:50
后放在上边啊,给它来实现一下啊,我们这边直接给它加一个函数体code,然后呢,这里呢,给它把这个名字改一下啊,把这个名字加用一个空格替掉,然后呢,它是一个three的call back,当然你可以写其他名字,比如说antib call back之类的啊,然后都可以,现在呢,我们把这个东西啊放在我们的第三个参数上,然后呢,我们来12啊,找到它的这个原型啊,然后呢,直接对其进行强转换,强转换之后呢,下一个参数呢,就是一个now啊,然后再下一个参数呢,还是一个now,再下一个参数呢,还是一个now就可以了啊,然后现在呢,我们需要啊,给它返回什么,返回一个线程句柄啊,然后three等于啊three啊接下来我们下步呢,就是调用一个等待啊,然后来等待它啊,用一个这个。
15:41
For single object来对它进行等待啊,然后等待呢,就是我们的下一步呢,就是使用一个负一啊,表示永久等待啊,第二个参数是它的一个时间啊,它是一个时间啊,那么我们现在呢,使用负一就是永久等待啊好,现在呢,我们有了这些东西之后呢,我们在这里边呢,给他写一个死循环啊,这个线程呢,我们就让他一直去检测我们有没有被调试啊,我们在这儿啊,If if什么啊,If,我这个check bug啊传进去啊,是不是返回一个处,如果是返回一个处的情况下啊,我们就直接。
16:17
我们给他std啊,西奥。输出一个这个被bug啊,Bug啊写反了这个。然后呢,为了我们的这个不占用太大啊,我们给他停一下啊,停个1000毫秒啊,然后呢,如果是一个else的一个状态,说明什么,说明是正常的运行啊,那我们就给它输出一个啊,这样是没有问题的哈,好,那我们输出了这个debug和这个这个run之后呢,我们现在呢啊,这个run的时候呢,我们也给它停一下啊好,那现在呢,我们就可以直接干嘛来运行了啊,重新生成。
17:01
我们啊,使用这个右键打开这个资源管理器啊,然后选到这个F15里边啊debug这不是有一个EXSE嘛,现在呢,我们使用我们的这个叉32DEBUG啊来启动它打开啊打开之后我们这13啊,那我们这边是15,所以说呢,我们要把它这个路径换一下,然后打开,打开之后呢,我们现在啊直接啊给它放开,放开之后暂停了啊放开放开之后你可以看到啊,它就是一个debug debug的一个状态,说明它判断了什么呀,它判断了启动之后啊,它的这个进程和我他和这个资源管理器不是同一个啊,所以说造成了这种现象,然后没点关注,点点关注啊,然后咨询课程,可以加入QQ群啊,也可以直接联系咱们评论区的老满啊,然后呢,有领取往期课程的也可以联系咱们老满啊呃,没点关注的点关注啊,周六周日都有直播啊,明天也有好,那么现在呢,我们看到这个之后呢,我们给它这个关掉啊,关掉之后呢,我们直接啊用这个我们的这个资源管理器启动啊,你这时候你可以看到它打的就什么就是乱了,而不是debug对不对啊,所以说呢,这个就。
18:01
没有问题啊,可以能察觉到一定的调试啊,好把它关掉啊,关掉之后呢,我们这个呢,就是我们今天啊第一种的反调试方式啊,就是基于啊检查它这个附进程的这种方式,然后呢,我们现在呢来查找它的第二种方式,就是基于设置线程信息,然后剥离调试进程限制创建调试线程这件事儿啊啊这个东西呢,我们现在呢要来写一下它啊,它这个东西呢是基于线程的,所以说呢,我们也需要给它进行一定的这个操作啊,首先呢它呢是基于一个未导出的一个函数的啊,我们首先呢需要在MSDN啊查一下它原型,这个函数呢叫ZW啊,Set啊,这个information啊,然后thad,我们直接啊回车,回车之后呢,我们来找一下它这MSDN啊。嗯,这呢啊,MSDN。啊,这个函数我们直接给它复制下来,复制下来之后呢,我们放在这儿,把它函数原型啊丢在这里,丢在这里之后呢,这些印之类的东西你要删掉啊,因为这些东西是不属于到函数原型的,一会儿会报错啊说要删掉,好现在呢,我们啊来给它干嘛?来给它改成我们的这个函数指针啊,前面这个东西就不要了啊,这个东西不要了,然后呢,我们type DeFine一下,Type DeFine啊然后呢,我们把它名字啊给它圈上。
19:18
好,FN前面加一个星啊,如果为了保险一点,你可以加一个这个API,实际上就是这个加了一个std call的一个声明给首先我们这个不直接写成ug,因为我获我们需调可以可以,但是我们这个东它是上一的一个功能啊,我们现在呢,就首先啊是给set in我们设置信。啊,这个我怕它有冲突啊,我给他加点东西啊,我好,然后呢,我现在呢,就来干什么呢,我要通过一个啊handle s three啊来进行设置,好现在呢,我要给它设置了啊,首先呢,我们要获取这个函数的一个模块名啊,它是它是在这个NTDR的DR里进行导出的啊。
20:21
呃,附加情况怎么去检测,前四集讲了啊,前边还有好几集呢啊,咱们这不是第一集啊。看到了吗?前面还有四级啊,前面还有四级啊。这四集里头讲的都是这个基于附加情况的啊。好,然后呢,咱们来继续啊,然后继续我们现在呢就来啊,现在呢,不是要设置它的线程啊,我们要干嘛呢?首先要获取这个函数在哪对不对啊,那我们现在呢,先来给它加载啊,使用这个load library,或者说使用这个get model handle都可以,但是就看你这个原来有没有这个东西了啊,我们现在呢就可以来干嘛呢?H mon等于啊load library啊load library我们用一个load library a吧啊然后呢,我们直接加载NTDL.dl啊,这样我们就获取到了吧,获取到它的这个呃,动态链接库了啊然后呢,我们现在呢,要给它加载进来啊,当然了,你在加载之前,你可以判断一下它为不为空啊,那我在这儿呢,我就不判断了啊,我直接就下一步啊,因为我正常觉得他一般情况下是不会攻的啊,那我们现在呢,就来这个获取一下啊。
21:38
首先啊,首首先使用这个函数指针啊,给它声明一个这个函数的一个这个名字啊对象,然后等于括号啊,然后给它强转,因为我们返回的这个get头PL address啊返回的是它不能兼容的,所以说呢,我们用这个强转给它转换,首先它第一个参数呢,就是我们加载这个模块的一个模块名啊放在这,第二个是什么呢?第二个呢,就是我们的一个获取的模,呃,获取的函数的一个函数名称啊,我们直接给它放在这儿,好,那现在呢,我们就可以获取啊,获取完事之后进行返回,返回之后呢,我们要现在呢去进行一个调用,我们直接调用啊,它一共有三个参数啊。
22:15
呃,四个参数啊,我们要填的是两个,首先呢它呢是set,很明显设置线程,所以说你要设哪一个线程,你需要提供给。我喝口水啊,然后没点关注点关注啊。好,那么这个第一个函数之后呢,我们现在呢,第一个参数之后呢,我们填它第二个参数,第二个参数呢,就是你要填啊,它具体是一个什么样的功能的一个东西,这个东西呢,就很明显啊,和我们之前那个查询什么呀,查询进程信息那个非常像,对不对啊,所以说它也是有一定东西的啊,但我们看一下它的原型啊,它的原里第二个呢,是有一个啊,然后in class啊,你直接跟进之后,你会发现它上面只有一个啊,有只有一个什只有一个16啊说明什么,说明这里边它其实不是所有的字段都开放给你的啊,但是呢,我们也,我们根据前人的经验啊,我们知道这里头应该有什么0S11这个东西,这个东西就是设设置什么呀,设置这个线程不能干嘛呢?不能被调试啊,不能创建新的调试进程之类之类的东西啊,那我们现在呢,就干嘛呢,我们现在给他入啊,我们要给它进行类型的一个转啊。
23:33
好,现在呢,下边两个呢,我们就可以直接啊传两个零过来啊,这样就行了,那么接下来我们这个函数完事之后呢,我们要了解一点,因为它是操作的是线程啊,它操作的线程,所以说如果你只是在当前线程设置的话,它其他线程还是有可能会失效的啊,所以说呢,现在呢,我们啊给他这个要干嘛呢,我们要给他便利一下,便利一下。怎么去便利它呢?就比如说我现在是一个word的啊,一个check啊,我这要返回一个数啊数。
24:07
好,然后呢,这边呢,我就来给他这个bug啊。我刚才是这个礼拜了,这个七礼拜一啊,然后呢,我在这边我什么也不用给他传入啊,我直接就给他来这边进行一个现成便利就行了啊,那我们在这边呢,就来直接啊,一个这个handle啊,一个handle。H three的SNP等于threeql type32啊,那我们现在呢,要便利的是现成的对吧?那所以说呢,我们现在是THTH32CS啊,然后three s snap three的,然后第二个呢,你就要放入一个这个进程ID了啊,我们现在呢,就可直接获取一下自身的一个进程ID啊get啊啊。
25:03
不对,Cru。ID好,那我们获取完之后呢,现在呢,我们就可以来下一步啊,比如说我们现在可以给他直接一下这个线程,那我现在呢,有一个这个线程相关的一个结构啊,那我可以直接用一个three的ENTRY32啊TH32来进行遍历啊,它呢也需要给你设置一下什么,设置一下它里边的这个size。等于set off啊,然后啊,Three的ENTRY32啊,传输之后呢,我们现在呢,来这个给它进行一个这个遍利啊,那首先呢,我们可以像刚才一样使用这个first来开始遍历,也可以干嘛,也可以直接well well,什么well这个嗯,Three的32N啊,也就是说我们不走第一个,我们直接从下一个开始啊,然后来找啊,这种情况下呢,我们就可以直接把它的现成I这个现成的这个便利便利句柄啊给它放进来,然后呢,第二个呢,把它的这个啊信息啊给它取地址放进来啊,然后呢,我们如果为真的情况下,就会进入循环内部啊,那接下来呢,我们进行一个对比啊。
26:17
我们可以直接用这个东西啊。啊,我们这个程程是属于我们ID是属于我们的啊,那么这种情况下,我们就把它的这个线程打开啊,用一个这个我这上面给他写一个threead。Handle it red。好用它啊,直接等于open threead好没点关注点点关注啊,每周六周日都有直播啊,然后呢,有需要领取课程的联系咱们老板啊好,现在呢,我们啊已经有了这个打开线程了啊,那我们首先要传给他的呢,是他的一个权限啊,就是的as啊所有权限,然后返回的句柄不继承。
27:20
第三个啊,第三个呢,就是我们这个呃,线程ID。现成ID呢,我们直接在这个TH3TH32里边获取啊,在这边有一个这个TH32THREE的ID,好,我们拿到它之后呢,我们就给它这个,把这个放到这个set three的info里边啊,然后直接传入。传输完事之后呢,在里边呢,我们就设置了状态,然后最后呢,我们直接啊给它进行一个这个close。把这个线程关掉,这就可以了啊,最后一个。
28:06
一个啥呢啊,随便什么return一个false吧,因为如果说这个东西成功了的话,调试器直接就没了,那我现在呢,因为我这个是设置一次啊,你防止不了它实时会有新的这个线程啊,给这个搞起来。写什么线程注入啊,这不是线程注入啊,这个是那个反调式啊啊然后呢,我们现在呢,给它放在这儿啊,让他这个每一秒钟啊检测一下有没有新进程起来,如果有新进程起来呢,就给它设置一下好,那么现在呢,我们给它重新生成一下。好,生成完事啊,生成结完事之后呢,我们现在直接使用VS的调试器啊,给它运行一下啊。喂。好像有点问题啊。呃,关一下。
29:06
哎,卡住了,关不掉了,稍等啊。啊,这事啊,立即停止调试啊。稍等啊,我这个屏幕太卡了。诶,好像好了啊,我不用这个VS来调试的了啊,容易卡死啊,我直接用调试器来调试的啊。好,现在呢,我就直接啊打开我的这个332D bug,然后呢,用打开的形式啊,对它进行一个打开。然后给它放起来啊。诶,他怎么正常跑了呢,等一下啊,这可能是我写错了在哪。
30:01
啊,应该是我写的有问题啊,我来看一下。创建线程句柄,然后线程信息啊w size设置啊宏。好,然后获取啊啊进程ID啊,进程ID,获取进程ID,进程ID之后打开啊,我这下段讲我来研究一下,看看哪写错了啊。运行。走走走,我直接这事下一个吧,看看他能不能进来啊,继续。虽然虽了。进去。然后下一个EHR的一个这个判断啊,看看他哪失败了没有。走获取获取。
31:05
嗯,应该是获取到了啊,然后走。判断这返回成功了呀,然后走你走你。诶,这已经剥离了呀,我你看啊,我这个虽然说它这个调试还在进行,但是我那个窗口已经没了啊。所以说呢,这个东西应该是没有写错啊,但是我们调试器为什么会出问题啊,我看一下。重新生成一下试试啊。走走。哎。
32:01
这不应该啊,这应该会死啊。它是应该有新线程没有设置上,我来研究一下,我看看什么情况。他应该是如果单步的情况下,他应该是会这个挂掉的啊,我们来试一下。我直接把它呢,在这个我们的这个现成之前啊,来进行一个调用。把这两个注释掉。好,现在呢,我们重新生成。双击上成之后呢,我现在呢,还是用它啊来对它呢进行一个加载。等一下啊,是不是同一个文件。啊,是。打开打开之后呢,我现在打开它。最大化这个有点小,我看看怎么给它设置大一点啊,这样就大了。
33:00
啊,这功能不错啊,这边弄不大,这个可能得设置个别的能给它弄大点啊,这好像是字体吧。啊,不是。这是别的东西啊,然后呢,我们来看一下啊,我们首先呢,给它运行到我们的主主函数上,不是那个主模块上啊,到主模块之后呢,我们找一下它的这个main函数啊,呃,我们可以直接根据咱们之前讲过的这没函数查找方式,一步一步跳进去啊,也可以直接在这搜索一下我这个呃模块里它有的这个字符串。啊,我这个里呢,肯定有一个暂停的字符串,就是PUSE啊,所以说我们直接通过这个PUSE我跟进去,跟进之后呢,它上边呢,这有两个call啊,那上这个call应该是系统的,你看啊,它是系统的啊,就是这个check for debug啊这个啊,那我们是第二个call啊,那我现在呢,在这下个断点,然后呢,我直接运行过来,运行过来之后呢,我把这个断点取消,取消之后F11跟进去啊,跟进去之后往下走,首先我们获取了一下当前进程的一个进程ID啊,然后呢,走走走走。
34:06
走走走。跳跳跳跳跳,设置设置。哦,不对,我这好像弄错了啊,我跳回去一下。继续。没了。
35:04
根本原理是改three结构体的debug属性标志啊,并不是啊。好,然后呢,我们呃,因为一直return false啊不是啊,它这个如果是false的情况下呢,在这个位置上,它会直接的这个往往这走嘛,他就直接打印一个run了,但是我们这边。呃,如果说它是触发成功的情况下,会跟现在咱们实验一样,你可以看到它直接调试器没了啊,调试器里边的这个程序没了啊,因为什么,因为它创建不起来啊,对不对啊,所以说呢,这个是问题啊,我们呃,我们这个东西代码肯定是可以的啊,因为我们现在呢,它已经起来了,但是呢,因为我这里呢,可能是写的有别的问题啊,就是它刷新的不够快,可能我看一下啊,还是说我没覆盖上所有的这个线程啊。它根本的这个问题就是你要把它所有的线程以及启动的线程都给它重新设置一遍啊,因为你如果不设置的话,它还是有机会来的。
36:07
但是我们这东西已经成功了,因为我们刚才可以看到它直接就剥离出去了,所以说呢,我们现在呢,就检查一下这部分啊。嗯,看起来没什么问题。
37:11
这节课讲的反调试啊,然后在讲它怎么剥离这个调试线程,或者说限制调试线程这个启动啊,这个东西已经成功了,但是不知道为什么没有应用到所有的线程上啊,所以说我检查一下他是不是哪儿写的有问题。微风雪。可以很秀。看起来没什么问题。
38:18
我再试一下。这东西我也想单步,但是他单步的时候就会触发你这个东西,它单步一定会触发的,因为你单步就是在他那个设置那个线程跑了一遍嘛,那那个线程它肯定可以剥离的,对吧。啊,它这是一直在这个run,然后如果说我们直接附加上去,或者附加去了那个打开啊,我把这个附加关掉啊。
39:03
然后我们直接打开。打开之后我们跑到主模块。主模块之后,我们如果说是在他的这个调试那里啊,就是我们直接找一下。找一下他的这个debug。好这个debug,然后debug run,那这个函数应该在这。啊,对,这个函数,这个函数进去,进去之后呢,我们上边。在这获取啊,它应该有一个进去的open three open three的返回,返回到EAX0传入。它应该是open的。然后在这。啊对,是这个跟到这个函数里,然后呢,它在这个部分啊get。传入,传入之后在这儿调用。这是check ESP。
40:05
啊,应该是这个。他为啥会有一个先有一个check ESP,然后再把这个E放回来的。啊,这还有一个check ESP啊,那这是两个,然后中间夹的这个是我们自己的函数,那现在呢,我们直接给它运行啊,它肯定会断在这断在这之后执行啊F8走。看没了。对不对。所以我说他单步他肯定会成功的,因为你单步你肯定会执行到那个位置上,他现在的没有执行所有线程成功是我的意思,他他之所以没有那个我想要的那种一附加就直接没的那种效果,是因为它没有附加到所有的线程上,它是某些线程附加成功了,但是你只要走到那些某下某些进程,它是肯定会剥离成功的。
41:13
这个才是我现在比较纠结的原因啊。他不是因为他没有成功,他是成功了,但并没有完全成功。啊,没点关注点点关注啊,咱们每周六周日啊都有这个直播啊,明天也有啊,今天也是,然后呢,这个不定时的还会在周中有直播啊,可能会讲一些这个呃,某些专业的知识啊,那个都有可能啊,比如说咱们之前开过下家什么数据结构之类的这个直播啊。哎,这个真有点想不通啊,这个应该是因为咱们现在你看啊,他写的时候,他应该是便利了所有的这个属于自己的县城,然后都给它挂上去一遍啊,这个没没太没太想清楚啊,这个东西因为什么。
42:12
但是他确实成功了,这就很奇怪对不对?又要憨豆。然后。那总不能因为这个吧,我靠,那我来试一下这么写。
43:05
你可以看到它这个东西啊,一调试就这样,它肯定是可以剥离成的。但是因为什么他这个没有所有进程都成,这是个问题。立即停止。
44:01
好,再尝试一下啊,给它放过来。好,可以了。成功了。看到了吗?全都跑,跑没了。啊,就是我直接附加上,就不是打开就可以直接给他跑没啊这回就是所有线程都附加上了,那我大概知道是因为什么了啊,咱们刚才就改了一句代码就改了一下这儿就是刚才呢,咱们用的是get。Get a price啊,不是cru price ID啊,这个东西它获取的进程进程ID似乎这个有点问题啊,然后呢,我们就直接用自己写的函数获取,哦,不是这个啊,是这个啊。诶。啊,不是啊,是用这个进程句柄,然后再用这个API获取了一下啊,重新获取了一遍,获取的是真实的这个进程ID,然后呢,用这个真实的进程ID呢,再次给它进行遍历的时候啊,就便利出来这个正常的这个效果,然后咱们附加之后直接就消失了啊,我们可以来重新搞一遍啊,然后再走。
45:19
你看走完之后,它还是没了,还是没了啊,所以说呢,这个效果呢,才是我想要想要的啊,就一下就全都消失了这种效果啊好,那今天呢,这个东西呢,就OK了啊就讲完了。然后呢,明天呢,咱们还是想要反调试啊,然后没点关注的可以点点关注啊,然后明天同一时间八点呢,还是来继续讲。嗯,对,这个东西实际上获取的它不是真实的这个ID啊,但是我以前用也没什么太大问题,我就直接用了。
我来说两句