嘿,大家好,今天咱们来聊一个让很多人都头疼的话题, vmprotect, 也就是大家常说的 vmp。 是 不是一看到这个壳就感觉,哎,这可怎么搞? 别急,今天啊,咱们换个玩法,用一个全新的思路来对付它。看到这个问题,如果你心里咯噔一下,觉得没错,就是我,那真的太正常了。 vmp 在 圈内可是公认的终极挑战之一,你想想看,要跟他硬碰硬啊,那简直就是,嗯,基本上是不可能完成的任务。所以关键来了, 你看,这个引数就点出了我们这次的核心思想,换个赛道,我们不跟他打阵地战,不非得把那层厚厚的壳给脱掉。 咱们要做的是智取,是绕过它,目标变了,不再是追求完美的脱壳,而是让程序能听我们的话,乖乖地跑起来,让我们能分析就行。 好,这就是咱们今天的行动计划。首先咱们得搞清楚 v p m p 到底难在哪儿,然后聊聊这个绕过的新思路,接着记出我们的神兵利器 h, 看看怎么配置它。之后就是重头戏,上手实战。 最后咱们总结一下,再看看接下来还能做些什么。那么第一步,俗话说得好,知己知彼百战不殆。咱们就得先弄明白啊,这个 vmp 它到底凭什么这么难缠,对吧? vmp 的 核心目标说白了就一个,不让你分析它是怎么做到的呢?你看它用了好几招儿,最狠的一招儿就是代码儿虚拟化, 他能把本来挺简单的代码给你变成一套他自己才能看懂的天书,也就是伪代码。同时他还像个特别警觉的保安,一直在那盯着,一旦发现你开了调试器,想偷看一下,他立马就让程序罢工 好了。既然正面硬刚行不通,那咱们就得换个脑筋了,这就是咱们的第二部分,转变思路,别再死磕那个几乎不可能完成的脱壳任务了,咱们的目标要变得更聪明更实际,那就是绕过它。 这就有点像兵法里的瞒天过海,对吧?玩的就是个巧劲。你看这张图一下就清楚了, vmp 的 目标是死活不让你分析。 而我们的目标呢,其实很简单,只要这个程序能在我们的调试器里好好的运行,别忐忑,别退出,那就行了。 我们不需要把它恢复成完美无瑕的原样,只要它能跑,我们就能分析它的逻辑,这就够了,这就是一个够用就行的哲学。 那么问题来了,怎么才能实现瞒天过海呢?这就需要一键撑手的兵器了。来,接下来要介绍的就是我们这次的秘密武器 hyperhide, 你 可以把它想象成对抗 v n p 反调式的核武器,非常关键, 在我们拿出这间核武器之前,得先搭好一个无尘室。 vmp 对 环境可是挑剔得很,所以第一步你必须得有个 vm 威尔虚拟机,里面装个 windows 十 x 六十四就行。 但这里有个关键中的关键,听好了,一定要在虚拟机设置里把 cpu 虚拟化,也就是那个 intel vtx 或者 amdb 给打开,这一步要是亡了,后面全都白搭。 所以为什么说 hyperhide 是 核武器级别的呢?因为它玩的是降维打击,你看普通的程序和操作系统内核啊,都运行在 win 三或者 win 零, 而 hyperhide 呢?它利用 cpu 的 虚拟化技术,直接跑在了更底层的 ring 剪一。这是什么概念?这就好比它穿上了一件隐身衣, vmp 作为一个在 ring 三运行的程序,根本就看不见它。 好了,理论讲完了,咱们来动手安装。整个过程其实就四步,很简单,开测试模式,放驱动,装插件儿。启动服务。听着挺多,但别担心,跟着我,一步一步来,保证没问题。 第一步,开启测试模式。为什么要这么做呢?因为 hyperhide 的 驱动文件,它没有微软的官方签名, 所以我们得告诉 windows。 嘿,放轻松点,让我加载一个没签名的驱动。怎么做呢?用管理员权限打开命令行,输入 b c d edit set test signing on, 回车。 最重要的一步,说完命令,记得一定要重启,维尼需你好。重启之后,第二步就非常简单了, 找到你下载的 hyperhide 文件,里面有两个关键的驱动文件, hyperhide drive 点 c s 和 arv 点 c s, 把这两个宝贝直接复制到 c 斜盖 windows 斜盖 system 三十二斜盖 drivers 这个目录里。对,就这么简单。驱动放好了,接下来轮到插件了, 这里你要注意一下,看你要调试的程序是三十二位的还是六十四位的。如果是三十二位的,你就把 hyperhide 点英尼和 hyperhide 点 dp 三十二这两个文件复制到 x 六四 dpg 的 三十二位插件目录里。 那如果是六十四位的程序,自然就是用点儿 d p 六四那个文件放到六十四位的差价目录。这个可千万别搞错了。 ok, 万事俱备,只欠东风。最后一步,启动它!在 hyper height 的 文件夹里找到 script 目录。进去之后还是用管理员权限先运行 create bt, 这是安装服务,然后再运行 on bt, 这是启动服务。 当你看到命令行里跳出来一行字写着 status for running, 那 就说明,恭喜你,我们的核武器已经激活,随时待命了。 好了,准备工作全部完成,现在咱们进入最激动人心的部分实战演练,看看怎么在 x 六四 d b g 里真正用上 high hide。 打开你的 x 六四 dbg, 首先在顶部的插件的菜单里找到并点击 hyperhide 弹出的窗口里。第一件事,我强烈建议你勾选上 hypervisor not visible 这个选项,让我们的伪装更彻底。 然后点下 options 按钮。这里面你可以偷个懒,直接在 d bugger profile 里选一个预设好的 vmp 方案。当然,如果你想火力全开,也可以手动把下面所有的函数都勾上,达到最强的防御效果。 搞定,现在一切都准备好了,你可以像平时调试任何一个普通程序那样,直接把那个加了 vmp 壳的目标程序拖进 x 六四 dbg, 你 会惊喜地发现,嘿,它不捆到了,也不退出了。 hypert 已经在幕后悄悄地帮你把所有的反调式陷阱都给绕过去了。现在,你终于可以自由的 f 七 f 八下断点,专心去分析它真正的逻辑,而不用再跟那个烦人的壳斗智斗勇了。 好了,我们来快速总结一下今天的内容,然后聊聊学完这个,你接下来可以往哪个方向走。 你看这张表,它把两种对付 vmp 的 路子做了个对比,左边是我们今天讲的绕过调试法,用的是 hyperheat, 右边是传统的那种硬核脱壳而法去找 oep。 你 看咱们这个方法,难度只有两颗星,但成功率是满的。而传统方法呢,难度高,成功率反而低。 所以对于咱们大多数人来说,特别是刚入门的朋友,或者你的目标只是分析逻辑,找关键数据,那绕过这条路绝对是又快又稳的选择。 最后给刚上路的朋友们几句心里话,一开始别总想着啃 emp 这种硬骨头,可以先从 usp x 这种简单的壳练练手,然后一定要习惯去用 hypersafe 这种强大的工具,它能帮你省下大把时间。 有空呢,也去了解一下那些反调式函数到底是什么原理,这样你就知道你绕过的是什么了。 最重要的一点,保持耐心,真的搞逆向,特别是对付 v m p, 失败是家常便饭,但你要记住,每一次失败都是你离成功更近了一步。所以今天我们学会的不只是一项技术,更是一种智取的思路。 面对看似无法解决的难题时,不妨换个角度,那么现在你已经掌握了这门绕过的艺术,准备好去迎接你的下一个不可能的挑战了吗?
粉丝1.3万获赞4.8万

哈喽,大家好,我们今天继续来学习 vmp 啊逆向进阶篇,那么这个 vmp 三点五幺啊,它这个版本呢,就对于我们去分析它的更高版本,它的作用啊,其实 相当于什么呢?相当于这个高楼大厦的这个地基啊, 那么大家肯定会问啊,啊,难道我之前学习的这个啊, vmp 二点叉之前的这个版本,难道就不是地基吗? 啊,当然啊,这个知识它都是一步一步来的,那么我这里说的这个地基啊, 那么跟我们说的这个地基啊,它它其实是啊 在这个 vmp 的 这个啊,比如说我们说的这个三点八点一它这个版本,它这个在它的这个编程这个 生成的这个流水线,那么这个三点五一的这个就是它的这个虚拟机形态啊,其实 在这个三点八点一的这个最初阶段,他是能找得到的啊, 那么这里,哎呀大家肯定听的会觉得有点抽象啊,那么这边我给大家做一个比较呃,通俗易懂的这个比喻嘛, 那么首先我们讲啊,我们首先我们就是那么虚拟机这个编程器啊,它最开始啊生成的这个 虚拟机指令啊,啊,虚拟机什么啊?代码块啊,我们这样子称它为这个 a, 对 吧? 那么这个 a 它其实是最简单的,那么这个 a 的 这个虚拟机这个代码我们之前见过啊,那么这个 a 是 什么样的呢啊?其实就是我们 之前见过的这个啊,比如说这个 v o p 一 点六四啊,那个是因为它是因为是未注册啊,那个版本它生成的这个 v o p 的 这个程序啊, 它是没有那些混淆的,或者是我们啊分析的这个一点二幺啊这个版本, 那么它看起来就非常清爽啊,比如说它这个 v o h, 它刚开始啊,什么铺型呢?一大堆的这个寄存器啊,非常简洁明了,我们一眼就能看出啊,不带任何怎么垃圾指令,那么它是 a, 那 么经过经过什么了,加这个垃圾指令之后呢,它就变成了 b, 那 么这个 b 它就相当于这个啊 vmp 三点五点一,它生成了这个啊,它虚拟化出来的这个代码啊,然后生成的这个程序, 那么这个三点五一,它生成的这个 vmp 呢,它就是会加了很多的这些垃圾指令, 那么三点五点一到这个三点八之前啊,它们都是属于这个 b 阶段,那么 那么还有一个是 c 阶段,那么这个 c 阶段呢?它其实是什么呢?它就是三点八之后的这个版本了, 那么这个 c, 大家如果有兴趣的话,就可以看我之前写的啊,我发的那个什么三点八,它这个虚拟机的这个混淆揭秘啊,那么它里它这边就讲了很多,比如说这个什么 and 的 这个融合,包括什么一级融合和二级融合,那么还有这什么寄存器的这个互相什么互相传递啊什么的,那么这些我就啊不细讲了, 那么我们说的这个啊 vmp 它是三点五点一,它作为这个什么 d 基,那么它就属于这个什么 b 层级 b 乘积啊,那么这个 b 乘积呢?那么我们啊可以这样子做一个比喻啊,就是 v 用 p 三点八之后呢,它包括这三个, 三个它的流水线啊,它包括这三个步骤,从 a 到 b 到 c 啊,那么三点五点一呢?它从这个 a 到 b, 那么我们最初的什么三 v o p 一 点二一,或者是我们前面说的这个 v o p 一 点六四那个未注册版本,那么它它只有这个 a, 所以说 vmp 三点五点一,它作为这个学习去去分析三点八之后的这个版本啊,它就起到一个什么 d g 的 作用,那么我只要把这个 b 给掌握了,那么我们就有这个啊,准备去有这个实力可以去分析这个三点八之后的版本了,所以说这个三点五点一还是非常重要的, 嗯,那么我们今天就是呃去修改它这这个源码,因为我们这个 v o p 啊,给这个指令进行虚拟化生成的这个啊 文件啊,可执行文件,它是它是百分之啊,它是一定会带一些垃圾指令的,那么我们去分析它的这个什么 v o h 啊,或者是这个 h 的 的话啊,其实看起来啊 比较不方便,那么我们哎,因为有源码,那么我们就知道啊,怎么去修改啊?让他生成的就是这个 bmp, 他 不会去带一些垃圾指令,那么我们今天就直接开干啊,然后我们大家找到这个源码之后呢啊, 然后我这边直接打开这个,然后大家就点双击这个什么 bmprotect, 点这个 s l n, 那 么这个工程项目啊,然后我这里给它放这这个快捷方式,那么大家也可以啊啊,就把这个快捷方式 那个提取出来,大家放到一个经常使用的这个地方,比较比较方便,那么那么这个 vivo protect 就 就是对应这边,那么我这里就先双击打开它的这个原码, 打开这个源码之后呢,我们是呃去去搜一个这个字母就行了啊,不用去找这个对应的这什么源文件啊,那么我们 ctrl 加 f 啊, 然后输入这个 m u 啊,大写的 m, 然后加上小写的 u t a t e 啊,那么这个单词就是什么?就是变异的意思,那么我们可以解释为这个什么混淆就行了啊,那么这边查找, 然后这边我们可以看到啊,那么这个函数它其实啊它有很多个类,它都包含这个函数,那么这个类哈,那么它这个 它这个类,它其实是多平台的啊,那么在这个 windows 不 在这个叉八六啊这个平台下,那么它是什么呢? inter, 那么 enter, 那 么它其实是个处理器,那么它是针对于叉八六的,那么这个虚拟机它这个命名就非常有意思啊,用这个 enter 指代这个什么叉八六,那么我们就要找到这个 enter, 那 么就点击查找下一个 接着走,那么就是这个啊,那么它的这个它的类名叫什么? enter function, 那 么就是什么 x 八六的这个函数,那么这个函数就针对啊 windows 的 啊,然后那么这个函数它前面说了,它是一个这个混淆函数,那么我们让它不混淆,很简单,直接加一行代码 return, 就是这么简单,那么我们啊,先别这个什么,先别点击编辑,我们先让这个之前编辑的这个啊 v o p 来去 啊,加密我们的这个程序了啊,给它拖过去啊,这个 test 给他拖过去,然后我们这个选项这边后面的话,我们先这样子啊,先都给点他点否啊,这边必须要点否,否则的话 如果这边只要有一个是四啊,那么他就会给他加一个壳,那么这个入口点就变成他的壳了,而不是我们要加密的这个要虚拟化的那条指令的。这个 比如说我们在入口点,所以说这边我们直接点否啊,点四的话它就会多加一个壳,那么这样子就不不方便我们去分析的啊。呃,移出调试信息,那么就点否, ok, 那 么这边我们先点击这个保存一下, 然后啊点击保存之后,它会生成这个什么这个点 v o p 点这个后缀的这个文件,那么这个文件就是记录我们这个 程序的,比如说这个 test 的 它它的一些参数啊,那么下次打开的话,它就会读取这个配置文件啊,然后我们找到第一个添加这个进程,那么这边点击这个什么 第四条指令,点击这个进程结尾啊,然后我们再点击这个保存啊,方便下次这个翻译啊,那么这边我们看到啊,翻译类型是这个虚拟啊, 然后锁定序号,这边啊默认是否啊,不要点四,那么这边点击这个翻译啊,点击忽略, ok, 那 么这边点击编辑完成之后呢,我们先看一下它这个它这个程序啊,然后这里我们打开叉三二的 bug, 先看一下它生成的这个程序,那么这边我们看一下它这个入口点,那么我们其实就是 在这个路口点指定这个会编指定让他去这个虚拟化,那么这边直接 jump, 然后跳到 push call, 那 么这个 push, 那 么 他这个是什么伪代码,那么这边同样是被加密了,那么我们直接单步走啊,到这边我们发现了他这边又加了很多的这个垃圾指令,干扰我们去分期, 那么到这边我们发现了,这样子我们分析起来啊,是不是觉得啊比较不舒服,那么我有一种方法让他去混淆,那么这样子我们分析起来是不是很舒服?比如说我们要去 啊边写识别这个 han 的 这个算法,那么我们肯定要看到这个 han 的 它很干净,是吧?那么垃圾代码对于我们写这个算法的话,识别算法的话没有用,所以说我们 回到这个原代码,那么这里面我们给刚刚生成的这个 程序,我们添加一个什么后缀啊?添加一个这个后缀,下次我们 可以去跟这个我们现在去混,然后生成的这个程序进行比较啊,因为我们这边如果没有去给它改名字的话,等一下我们生成的新的这个程序,它会被覆盖掉啊, 那么这边就写什么未去混淆吧,那么这里面我们点击这个翻译啊,点击生成解决方案, ok, 那 么我们这边发现啊,他这边成功三个,失败三个,那么这里面失败三个肯定是有一个文件没有生成了,那么这边大家就要去找原因了 啊,那么发现我们这个还打开,那么肯定他会报错啊,因为他这个文件被占用了啊,我们把这个关闭, 那么点击这个生成, ok, 那 么这边生成之后啊,他失败两个才是正常的哈, 那么我们再走到这个快捷方式给它打开,然后我们将这个拖到里面,然后点击这个点一 生成,完成之后呢,我们再给它拖到这个叉三二 d bug, 我 们看一下,那么这边啊,刚开始啊,它是 jump, 那 么到这边这边的话它都没有进行混胶,所以跟前面的一样啊, 其实我们那么这里啊,你们发现没有,他这边好像还是有混淆,那么我们看一下是不是这个程序有什么问题呢?那么我们找到他的这个 他的这个路径,那么找到他的这个目录,我们看一下这个程序,他这个好像不是我们刚刚生成,那我们这里把他给删掉,点击这个编辑再生成这个解决方案, 那么再我们再回到这个目录看一下啊,那么这边提示什么?他这边是没有生成啊?然后我们看一下这里的这个提示啊, 系统找不到指定这个路径,这个啊,那么怎么办呢?他这个路径是什么路径呢? 它这边前面上一句是什么 is 点 bet, 什么生成 java 汀 q t 的 设置, 然后它底下是什么系统找不到指定的路径,那么这个可能就是说什么文件缺失吧,我们,那么这个我们怎么解决呢? 那么我们找到这个 vimeprotect 的 这个目录,然后往下找, 然后这边我们可以看到啊 resource 点 c c, 那 么下面还有一个压缩包,那么这个同样是将这个 resource 点 c c 给他打包的,那么我们直接这个点击这个解压到当前文件夹,让他这个压缩包的替换掉。这个原来的我们试一下啊,点击生成剪切方案, 然后我们再回到这个它的这个工程目录啊,它这个生成的这个 debug 这个目录,那么它提示还是啊这边还是找不到这个 vn protect 点这个 e x e, 那 么我们这边怎么办呢? 好像所有的方法都用过了,那么这里我们再点击这个什么清理解决方案,先点击这个清理, 然后点击这个重新生成解决方案,那么现在啊已经翻译出来,翻译结束了,然后我们可以看到它这个 vmp 点这个可执行文件,它还没生成成功, 那么我们现在怎么办呢?好像所有方法都用掉了,那么我这边啊再教大家一个终极方法,把这个给删掉啊,你设置点 cc 给删掉,点击生成, ok 啊,生成结束,那么这边提示失败两个,那么说明还是没有生成成功,我们看一下它的这个原因啊, 他这边是提示什么呢?我们看一下这个错误提示,他这边是提示什么 c 幺零八三无法打开原文件,什么滤索斯点 c c, 那 么因为肯定是我们刚刚将这个滤索斯点 c c 给删掉的这个缘故吧,那么这次的错误就是 那么肯定啊,那么为什么要删掉了,那删掉又会导致这边提示没有,没有这个文件,那么其实删掉目的就是让它刷新一下啊,就让它刷新一下, 那么这边我们再进行这个解压到当前文件夹,然后这边我们再点击这个生成解决方案, 那么到这边呢就成功了啊,我们可以看到成功一个,失败一个,那么失败只能是一个啊,然后跳过三个,那么是吧。 vivo protect 点 e s e, 然后我们回到我们这个, 打开这个什么用 protect 编辑器,接着我们把这个 test 的 给它拖过去啊,然后就直接点击这个翻译就行了, 那么这边点击啊,提示什么无卡,然后我们把这个叉三二的 bug 给它关掉啊,那个那个文件关掉,那么再点击这个 变异,那么这次生成的这个速度是不是发现没有?是不是比刚刚更快? 那么就是因为我们把这个什么,因为这个函数跟那个混淆函数,那么那个混淆函数我们读作这什么 mutate, 我 们就读它啊,就叫它 mutate, 那不知道我这个发音准不准啊,那么后面我就叫它 mutate 函数啊,那么这里面我们接着将这个什么 test 点 bmp, 就 刚刚生成的这个程序给它拖到叉三二第八个,那么刚开始还是一个 jump, 然后库取这个括,那么这边都是一样的,都不会变啊,接着我们再走,发现了没有,屌不屌?哼, 到这边就非常的这个清晰明了啊,一点混淆都没有,那么这里就非常适合我们去分析它的这个 n 曲啊, and 也好啊,咱们不走啊, 然后到这边这个就是跳转到这个 honda 去执行了,然后我们接着走, ok 啊,大家发现没有啊,这个这里面每一个参数,它的这个节位都是降排 edi 啊,而且它们的这个长度好像都是一样啊,这个指令数量好像都一样啊,那么这些参数啊,其实就是叫什么 pop v r 三二,将这个虚拟账的这个值给它写到这个虚拟计算器啊,那么这边我们就啊这节课我们就结束了,那么这个分析我们留到下一节来。

ok, 哎, ok, 那 么这个是我们这个呃, vmp 啊,逆向这个 vip 啊,是学习群, ok, 我 们开始讲这个课啊, 那么我们今天讲是这个 vmp 一 点八这个 iet 啊,信息脚本获取的这个啊脚本分析,我们打开这个课时时啊,课间我们分析的话就是用这个啊, no, pad 加加来啊, 给它拖到这个 ipad 加加就行了啊,那么这个脚本的分析啊,其实咱们这个一点六的时候啊,就分析脚本已经啊,基本上跟这个差不多啊,那么今天我们就啊稍微快一点啊, 啊,首先这前面这些啊,就是这个变量,那么这个没什么可以讲的,我们来讲这个啊,首先这个第一条,这个脚本指令啊,啊,它是这个什么 m 五 s file 啊,逗号什么这个制服创, 那么这个字幕创,就是说我们要创建啊,生成的这个文件名啊,包括这个文件名和这个文件类型,就是它是生成一个这个 a a t pad, 点这个 t s t 这个 啊,这个文件啊,这个记事本文件,那么这个文件呢?做什么用呢?啊?我们啊接着打开一个键啊, 啊,找到这个啊, no 啊, no 啊,点第二了,那么这个第二了,它就是就是会在这个目录下寻找这个文件,那么这个文件它就是存放这些啊, it 的 这个信息啊, 那么这个 it 信息就是我们用这个脚本来这个记录的啊,那么我们看第二个啊,初次化标记这个为第一次记录,那么这个是干嘛用的啊?那么这个就是,呃 呃,我们把这个呃这个什么 it patch, 那 么这个我们也是打开看一下, 那么这个就是,呃用于后面啊,这些就是说判断它如果说这个第一次运行,那么这个我们等一下再讲啊,我们讲第这个第三个啊,默五,这个 magic 逗号,什么这个零零四 d 六幺 c d, 那 么这个地方我们上节课讲过了,就是我们第一个要寻找的这个 啊,这个地址啊,那么这个地址是干什么的啊?那么这个地址啊,我们在这个地址下这个硬件断点的话,可以获取这个啊,获取这个两个数数据啊,一个数据就是我们这个 ap 函数的这个地址啊 啊,第二个数据就是这个 a p i 函数的这个啊,它的这个文本之创,包括这个动态链接库的名称和这个 a p i 函数的名称, 然后啊这个我们再往下看啊木,这个 face 逗号,什么零零四 c a 九八,那么这个是干嘛的?这个是这个路口点啊,那么这个就是说让这个脚本执行完之后呢,在这个路口点进行断下啊, 然后这个下面一个啊木,这个 right, 什么逗号?这个这个啊五四 b 七 e 七,那么这个地址就是我们昨天这个上一节课啊,上一节课讲的这个第二个我们要找的这个地址啊,那么这个地址就是往这个我们这个 啊那个地方写录这个数据的,那么大家可以去啊,昨天去看,如果说没有印象的话啊,去看一下昨天的这个视频啊,上一节课的视频, 那么下面的 b c 啊,清除所有的这个 f 二断点,那么 b p h w c, 那 么就是清除所有的这个硬件断点啊, 然后我们看一下这个啊, gpa 啊,然后这个,呃,这个双引号啊,这个,那么这个是干嘛的?那么这个就是获取 这个这个函数啊,这个 jw set information thread, 然后它这边有两个参数,一个参数是什么? 一个是参数,它是获取它的这个啊,一个参数它是这个 api 函数的名称,那么第二个参数就是它的这个所在的这个动态链接库,那么它整这个整体啊,它就是获取这个函数,它的这个 啊,这个函数的地址啊,我们知道它某些函数的话,它它在这个,它必须要指定它的这个动态链接库名称啊,因为某些函数它可能 啊,比如说这个 kernel 三二点丢了,它也有这个函数,那么 kernel base 它也有这个函数,所以说它这个要指定啊, 指定要动态链接公名称啊,那么下面一个 b p 什么啊? result, 然后这个美元符号开头的,那么这个就是跟前面这个 啊,这个脚本指定有关系,它或许的这个函数地址它就自动存放到这个啊,美元符号 r u r u result, 那 么它就对相当于对这个 data set information spread 进行这个时分点了, 然后 es two, 那 么就相当于这个啊,执行这个 go 运行啊,然后它这个执行完之后它会断下啊, 那么断下之后呢?他又接着下了一下了一个硬断啊,硬中断点,那么是对谁下硬中断点呢啊?对这个 first, 那 么这个 first 我 们前面讲的就是这个 o e p 啊, 然后他又对这个什么 magic, 那 个 magic 就是 我们刚刚讲的这个啊,是第一六幺十点,那么这个我们第上一节课第一次找的这个地址下个硬件断点了, 那么为什么啊?要对这个,他这边是先对这个啊,先在这个地方啊,这个函数这边下硬件断点,然后啊啊这边先对这个函数进行下这个普通断点,然后 运行,然后在他那边断下才对。嗯,这两个地方下这个硬件断点呢? 那么这个是啊有必要的啊,因为啊,他如果说他就是我们将这个程序啊拖到这个 o d, 那 么他断下之后,他在这个 t l s 这边断下,那么这个 t l s 这边 断下之后,我们设置硬件断点,他会失效啊,所以说他就是找到了一个这个函数,他刚好在这个函数这边啊,断下之后,然后再下这个硬件断点,他就不会失效啊,他是这个原因啊, 那所以说他并不固定啊,非要自己这个函数,那么选择其他函数他也可以啊,那只不过这个函数他他也能够用,所以说他就用这个函数啊, 然后我们再走啊,他下了这个硬件断点之后呢啊,他就会到这边啊 loop, 那 么这个是个主循环了。然后他这边啊,首先呢第一句啊 b c, 他 就像这个刚刚的设置这个普通断点啊,这个 b p d 照的,那么这个断点给他啊,清除 啊,就是清除所有普通断点,然后让它运行,那么运行之后它会在哪里断下呢啊?运行了之后它就会在这个 magic 这个地方断下啊? 我们可以看到啊,我我们这边看一下它这边,首先它对它有下两个断点,一个是这个 o e p, 那 么一个是 magic, 那 么肯定首先它会在这个 magic 这边断下啊,然后它这边进行这个判断啊, 那么先判断这个是不是这个 e r p, 是 不是这个 o e p, 对 吧?那么已经到路口点了,那就说明啊,我们就不需要在这个执行脚本了,它就会执行这个 j e 啊 and, 就是啊这个啊清除所有断点,然后这个脚本返回,那么然后呢会进行这个又是一个这个 c m p 啊,判断这个啊,是不是等于这个触发地址啊?就是判断是不是这个 magic, 然后接着如果说是这个呃这个 magic, 这个这个地方断线,那么就是会跳到这个 set bp 啊,那么跳到这边去执行,那么我们看下这个 set bp, 它是呃做了什么事情呢? 那么它是呃在这个哪里呢?在这个地方啊,这个 light 这个地址,那么这个就是我们第二上节课这个第二个找的这个地址,那么这边下个硬件段点, 然后他这边啊有个判断啊 is first, 就 说如果说第一次执行到这边,他就是会啊,就会执行到这边啊,那么如果不是第一次执行的话, 我们可以看到他这边有一个这个,比如说他现在是第一次执行到这边啊,那么他这边就不跳啊, 它就会在这边执行到这个 i n c is first, 那 么这边加 e, 然后会这个 w r t, 那 么这个 w r t 它是啊覆盖所有的这个写路, 他比如说他这个啊 it 啊,这个帕奇的 tst, 他 现在有这个啊,有一些内容啊啊,比如说有这些内容,那么这个脚本第一次执行到这边之后呢啊,他就会把这首先把这个内容清空,然后把这个写上去啊, 它是覆盖型写入啊 w r t 啊,然后啊,它这边执行完之后呢,它又啊,它就会走到这个啊, low g g r, 所以 说它这一段, 这一段只有在这个 esp 为这个零的时候啊,就是说啊,第一次执行到这个 set bp 时候才会啊,执行到啊,那么它就啊,然后我们看这个啊, 首先它第一句是这个木啊 tmp 逗号 e s 缓存 e s 键去关键数据,那么这个 e s 是 什么呢?这个 e s 这个 e s 啊,它就是这个 ap 函数的这个地址啊, api 函数的地址, 那么这边我们先先讲一下这个脚本啊,我们等一下再用这个调试器去啊,调试器啊,去去这个裱部执行脚本一下,那么这个 e s 它是这个 a p 函数的这个地址啊,给这个 t m p 啊,给这个变量, 然后它有个这个 l e n e s i 啊,那么就是获取这个 e s i 指向的这个字母创的这个长度啊, 那么然后就是绿的什么 e s i, 然后中化什么 result, 读取这个啊, 指向的这个字母串,那么就是读取这个啊,逗儿啊,动态链接库的这个名称,然后把这个结果啊,又给它放到这个啊,动态链接库逗儿内啊,然后又读取这个什么 api 函数的这个制符串啊,它的名 api 函数的这个名称的这个制符串啊,然后给它放到这个什么方格选内啊,然后接着啊,点击,接着就继续这个运行啊, 然后到这边啊,到这边是 s u b 啊,什么 t m p 逗号 e d s, 那 么这个 t m p 是 刚刚我们这个存放的这个 a p 函数的这个地址啊,那么 e d s 是 什么呢? e d s, 它就是 这边我们再加一个数啊, e d s 啊,就是啊,就是被啊加密的 api 函数啊地址, 那么这边我们看下这个公式啊,它这边是怎么 key 啊?就等于这个啊,缓存的这个 e s 减去这个什么 e d s, 那 么这边是我们,那么这边啊,我们给它改一下子,就是它就是 ap 函数列的 a p 函数地址啊,那么我们把这个移过去啊,那么 a p 函数地址它等于什么?等于 key 加上 e d s, 那 么这个 那么这个算求解过程,就是在我们前面分析过了啊,我们前面分析过这个求解过程了, 它就是这个 key 加上这个被加密的这个 api 函数地址,先加,然后啊求出这个 api 函数地址啊,那么它计算后的这个值存放到这个 t m p 啊, 那么下面啊,它这个是 w r t a, 那 么这个就是不覆盖写录,它就在原本原来的这个啊,这个写录的这个内容后面啊,再加上 我们知道他这个啊,这个执行到这个哪里啊?执行到这边的时候啊,这边的时候他只有这个,他就只有这一句啊,那么后面的就是在这一句的这个基础上再加上去的啊, 那么这些啊,就是啊,这个就是这些东西啊,全部给他写上去啊, 就这些全部写上去了,然后这个那么写写完之后呢啊,他就是接着下这个硬件段点 w i t, 然后这个啊,再回到这个循环, ok, 那 么这个脚本呢 啊,分析起来的话啊,并不难,那么我们再啊回到这个,打开这个调试器啊,打开这个 o d, 用 o d, 我 们再给大家过一遍这个其实并不难啊,这个脚本,这个脚本的话跟我们这个汇编语言非常像, 而且这个 o d 啊,对这个脚本的话啊,知识比较好,可以看很多这个信息,非常方便。然后我们现在把这个 d m p 给它拖过去, 拖过去之后呢,我们给它最大化啊,不用最大化,然后选择插件,然后选择这个 o d 啊, o d b g 啊, script 脚本啊,运行窗口,然后再点击这个 载入脚本,打开课时十,那么这边我们 啊就刻字式点进去啊,然后这边选择 o 啊,我们这边是因为是没有将这个脚本啊,给它设置成对应的这个格式,什么 ollie scrip, 那 么我们选择 o 也行啊,不然的话他这边显示不出来,然后我们点击双击一下,他这边就 到这个脚本运行窗口了啊,然后我们呃可以进行这个脚本的进行裱布,那么怎么裱布的?我们按这个 tab 键呢啊,就可以裱布。那么呃,首先这些都是这个变点的声明啊, 我们这边直接单步走,直接单步啊, b c 啊, b c, 清除所有这个普通断点, b c h w c 啊,清除所有硬件断点,然后 g p a 啊 z w c 的 云文件 select, 然后这个它就我们看一下它这个执行结果,我们啊再按下 tab 单步走, ok, 那 么有个返回值啊, 七七六八三零八零,那么这个地址就是这个 zw 下面有没有选 select 的 这个 a 盘函数的地址了,接着他执行这个 bp 啊,那么就对这个地址啊下端点, 然后这个 e s t o 单步走了, ok, 那 么它这边就是啊,会断在哪里呢?我们按一下这个 c, 然后看一下它这边啊,就断在了刚刚我们这个 z w z w 啊,教程啊教程窗口,然后它这边就开始下这个啊, o e p 断点, o e p 硬件断点啊, o e p 啊,不是还有这个什么这个 api 函数这个地址获取的这个我们上节课啊,第一次找的这个地址, 然后把这个刚刚的这个普通断点给它清除,然后在这个啊运行,那么在哪里断下呢?我们点一下 c, 那 么在这个四 d 六二 c d 这个断下,断下之后呢?我们看这个计算器啊, 首先 es, 就是 这个啊, a 片函数的地址,那么 esi 它是指向一个字母串啊, 指向这个啊, ctrl 三二点这个 d r, 这是自创,那么 edi 是 指向这个啊, get 向量的 local, 那 么指向这个 a p 函数的这个啊文本, 然后我们再回到这个啊插件窗口吧啊这个脚本窗口,然后接着他就是这个判断这个 eip 是 不是这个到了这个 oep 啊,没有, 没有则不跳啊,然后就判断这个 eip 啊,啊,那么这边是相等,所以说跳到这个 set b p 啊,那么 set b p 它这边就是,呃,对这个 这个 write, 那 么这个就是我们上一节课第二个这个寻找的这个地址啊,下个硬件执行端点, 然后判断是不是第一次这个走到这边,那么现在是四,所以说它不跳,然后这个 is first 的 它加一啊,对吧?然后这个 w r t, 然后这个是覆盖写录,这个啊,这个是一个说明,说明, 说明我们要存放的这个信息,它有这个三个元素,一个是这个啊,这个地址写录的地址,第二个是这个 key 啊, 第三个就是这个啊, ap 函数的名称和这个所在的这个动态链接库了,然后我们再单步走吧,接着是默五,这个 t m p 到 e s e s 到 t m p, 那么这个 es 是 多少呢?我们先当步走看一下,走到这边之后呢,我们可以看到这个返回值,那么其实这个返回值就是这个 t m p 啊,那么这个变量就存放啊,这个 ap 函数的这个地址了,那么下面就是啊, l e n 和 esi, 那 么这个就去这个啊,计算这个啊, esi 指向的这个制复创的这个长度啊,然后下面就是读取啊, 读取它的这个制复创啊,到这个什么啊,阿伊律兆,美颜号,阿伊律兆,然后又是啊读取存放, 那么接着啊,这些前面这些事情做完之后呢,它又执行这个啊, es two 啊,那么又运行了运行,那么相对于哪一个这个断点呢?就相对于这个啊,这个 right, 那 么这个地方 right, 这个地址啊,刚刚我们下的这个断点啊,那么我们单步走啊, ok, 那 么我们看一下这个 cpu 代码窗口,那么它就到这个啊,五四 b 七 e 七啊,到这边了啊,那么这边的话,它就可以获取哪个值呢?首先第一个 e a s, 那么第二个啊,是这个 e d s, 那 么这两个 e s 就是 这个写录的这个地址啊,那么 e d s 就是 这个啊,被这个加密的这个 ap 函数地址,我们再回到这个脚本窗口, 那么啊,他这边断下之后呢,他就来到了这个啊, s u b t m p 逗号 e d s, 那 么这个 t m p 就是 a p 函数的地址,减去这个啊, 被加密的这个 a p 函数地址,然后就能够得到这个 key, 那 么 key 啊,当步走啊,走到这边之后呢?这,然后这时候这个 t m p 就 存放了这个 key 啊, 然后我们再单步走啊, ok, 那 么它就它这个 w r t a s file, 逗号, e s, 那 么这个就是将这个 e s 的 这个值 啊,就是我们这个,它要这个写录的这个地址给它写到这个我们的这个啊,输出的这个 i a t 帕取点 t s t, 那 么这边就不是覆盖写录啊,它是在这个它的尾巴后面再加就是写录啊, ok, 那 么这些都是对这个啊,输出文件进行这个写录啊, 那么写完之后呢,他接着右是对这个 light, 那 么这个地址啊,进行这个断点清除,那么这个地址啊,他会啊,他不只单单是写入, 就是我们这个 api 函数,这个解密的这个啊,这个地啊,这个数据啊,它还会写入别的,所以说它这边要进行一个删除啊,防止其他的这个地方干扰啊。然后接着啊,它又进行这个循环了, 那么这个就是啊,用这个 o d 这个脚本,我们跟踪的这个分析结果啊。

哈喽,大家好,我是阿强,今天咱们来学习啊, d m p 三点五亿的这个可代码去混淆,去虚拟化, 那么什么是可代码的去混淆和去虚拟化呢?那么这边我们找到这个看雪啊之前大神发的这个帖子,我们来看一下什么是这个可去混淆和去虚拟化, 大家可以去呃,去翻开这个帖子去看一下,那么大家这里我给大家呃,大家解释一下啊,那么就是啊,这个啊, nova 大 神啊, 他有这个呃非常天才的这个想法,他通过这个修改这个虚拟机啊,这个是什么 the media 啊,这个引擎 啊,使其强制输出,没有混淆和加密的,这个程序啊,很轻松就分析完了这个外壳逻辑和这个啊利用逻辑,那么这边啊,我们这个虚拟机啊,我们 去修改他的这个编辑引擎,那么我们就主要是针对他的这个壳,因为他的这个壳是经过这个虚拟化和混淆,那么这个壳有什么东西呢啊?壳有很多功能,比如说反调式,哎,还有这个什么检测虚拟区等等。那这里面我们修改他的这个引擎啊, 使其强,使其强制输出,没有混淆和利用,那么就是虚拟后的这个带网,便于分析这个外壳和这个焊的逻辑。今天我们来看一下瓷砖 vmp 的 这个反调试原理啊, 他这边有先将这个 v 用配置啊,我们避免其干扰,那么这里他就是对这个什么调制器进行这个指定,其他的话并没有啊,指定他去检测, 那么他然后得到了一个非常干净的程序,那么这个程序他没有虚拟化,而且没有混淆,那么其实就是一个正常的这个会变代码了,那么我们可以拖到这个 ida 进行非常轻易的去分析,那么这个代码就是包含这个检测这个 调试器的啊,那么这边后面都是讲这个调试器的这些检测的这个手段啊, 但是呢啊,他并没有公开这个如何修改这个 vmp 的 这个三点五,三点五点 e 的 这个源码,他没有公开怎么去修改,那么今天我们这门课程啊,就教大家怎么去修改这个源码, 那么大家的需要课间的话可以联系我啊,在群里啊,那么今天我们看一下那么这个,那么这个 vmp 这个代码就被被我这个修改过了, 修改过之后我们点击这个生成啊, ok, 生成完之后呢,我们用它来去给这个程序进行加可,那么这个是快捷方式,我直接打开了, 然后找到我们这个今天的这个课间课时十一啊,然后我们给这个, 我们今天是课时课时十二,那么这边给它标题改一下啊,文件名改一下,然后我们将这个课时十二的这个课间给它拖到这个 vmp 刚刚我们编辑生成的, 那么这里面啊,我们不要添加保护的这个代码啊,然后我们直接选项啊,就留一个什么调试器检测就行了, 移出调试器以后, ok, 那 么就留一个这个调试器的检测,那么我们点击这个生产啊, ok 啊,编印完成了,那么我们先把它拖到我们的这个什么叉三二 d 八格看一下, ok, 我 们拖过去,我们发现啊,他现在他生成了这个新的程序,他这边是一个正常的指令啊,没有经过这个任何混淆的,那么这段指令是什么呢?那么这段指令就是我们的这个外壳的代码啊, 我们这边找到这个什么我们之前讲的那个那个,呃,文原文件啊,叫什么? load 点 c c, 那 么这边 load 点 c c, 它就有这个壳逻辑的这个代码啊, 我们呃寻找一下 ctrl 加 f setup, setup 什么 image, 直接这样搜啊, 然后就是这个啊,那么就是这个函数啊,那么这个函数它就它是个壳代码啊,那么就被翻译出啊,被写入到这个我们虚拟化的这个程序,我们加密的这个程序的这个 local 了啊, 然后我们将这个程序呃拖到这个 id 上去看一下,我们打开 id 啊,直接把这个 test 应用批拖过去看一下, 那么这边就能够啊,用这个 f 五啊,分析出的这个就是显示出这个什么 c 加加的这个为指令, 那么我们看一下它这边,它这边是一个什么判断啊?这个函数它如果是等于这个帧,那么就跳到什么 加码 alt, 那 么就是跳到这个它的入口点,那不是,那么就执行这个什么退出这个进程,那么我们看下这个函数,那么这个函数是零啊, 这个函数就是这个壳逻辑了,就这个函数,它就是这个 set up 这个函数啊,这个原码,这个 set up 函数,那么我们看一下它这个, 找到它的这个代码位置啊,然后我们接着一直翻啊,看一下它这边,那么这些代码, 这些那个 c 加加 f 五出来的这个代码,它就是这个 我们这个源码里面的这个内容啊,我们看一下啊,他这边啊,就是这些啊,这些都是都是可以找的到的啊。

哈喽,大家好,我们今天来讲这个 vm p 三点五点一的这个报账解决方法,那么打开我们这个十三节课这个课间它是有一幅图片,这幅图片就是我们上上节课讲的这个堆账的这个分布啊, 那么这个报账是什么呢?啊?我们找到这个大神写的这个账问题啊, 就是说啊,如果压藏时,那么这个压藏就是这个虚拟藏啊,压藏那么这个虚拟藏的这个指征会变大啊,他是他的这个指会变小,压藏他其实就是入藏啊,那么如果超出了这个藏的大小, 就说它这个虚拟站它有个范围哦,就目目前我们看到还没有超赞的情况,那么这个超赞,我们找到这个 honda 来讲解一下, 那么这个我已经提前准备好了,那么这个这个程序呢,也是我们之前课间的那个程序哦,大家可以找到这个 课时期的,那么这个程序给它拖到叉三二第二第八格,然后进行这个用我们插件去分析哦,然后我们找到这个,那么它这个 首先啊它这个会引起这个报站的这个 hud 呢,都是这个入站类的 hud, 那 么就是 p 曲啊,比如说这个 p 曲 im 三二或者是 p 曲 vr 三二, 那么这个 push 类的 hand, 它的这个结尾都有一个这个报账的这个解决程序啊啊,报账的修复程序啊,那我们走,那么这是 push 鞍三个,那么到这边到这边它的这个功能代码执行完了, 接着它就计算这个下一条 hand 的 地址,那么计算完之后呢,它有一个降坡啊, 那么键盘到这边啊,我们看一下,那么这个后面指定,然后下面一个这个 c m p e s i 逗号 e d s, 那 么这个 ex i e s i, 它是虚拟账啊,虚拟虚拟账记文器啊, 那么这个代码大家熟悉吗?那么这个 ga 就是 判断它有没有这个 啊?我们这边先先说一下这个 j l, 那 么这个 j l 啊,基本上它是一直都是跳的啊,很少,当然有些啊,就碰到这个爆炸的情况下,它就不会跳了,它还会到这边下面进行去执行。 那么我们结合这个前面的这个这个课间我们分析一下啊,那么这个虚拟站呢,比如说虚拟站初死值是这个啊,幺九 f f 四八,那么它如果说执行什么慷德呢? 执行这个什么虚拟站的这个入站行的,那么虚拟站的这个值它就会更小,它可能就会进入这个虚拟继承去的这个区域啊,它的值的这个范围,那么这边就会进行这个判断,我们看一下 它这边就是啊, l e a e d s e s p 加上个零 x 六零,那么这边是六十啊,零 x 六零, 我们知道这 e s p 啊,它是这个什么虚拟计算器的这个机子啊,那么加上零 x 六零, 那我们这边是不是能够猜到,那么虚拟计算器的这个啊,整个范围他就是六十个字节,那么六十个字节他就啊存储了啊,若干个虚拟计算器,那么每个虚拟计算器他是四个字节,对吧?那么我们这里用这个 计算器来进行这个算一下,六十除以去除以四,它是等于多少?十八,那么它就有十八个这个计算器啊,十八个这个虚拟计算器啊, 那么我们接着单步走啊,然后它就比较什么 e s i e s i 就是 当前这个虚拟站的这个啊,职称,那么如果说 ga 就 执行比较,然后这个 ga, 这个 ga, 我 们说一下它是什么意思啊?这个 ga 啊,就是比较这个 e s i, 那 么这 e s i 如果就是大于 e d s, 那 么则跳转, 那么 esi 就是 虚拟站,它这个没有到这个什么没有顶到这个什么这个虚拟呃,计算器的这个末端,那个虚拟计算器这个区域的这个末端, 那么它就跳转,那如果说顶到的话,它会执行这边啊,那么首先它这边是 o v e d s 逗号 esp, 将这个 esp, 它这个指征 它存到这个虚拟计算器的机子指征存到 e d s, 接着它是 零 x 四零给 e c s, 那 么这个 e c s 是 什么呢?我们看一下,我们这边先记住啊,先等一下我们再再分析,这 e e c s, 为什么它是四十啊? 接着它是什么呢?来 e a e a s 逗号什么,那么就是 e s i, 它的这个值减去八十给 e s, 那 么接下去什么 e s 跟这什么零 s f f f c 进行这个语音算,我们看下这个解释啊,它是让这个后两位为零啊,这边做啊,它是为了这个地址对齐啊,为什么要啊地址对齐呢? 它有时候它库许啊,它入站的字节,它不是四字节,它可能是为两字节啊,或者是一个字节啊, 那么这个就是为了对齐地址,比如说库许 imm 八,对吧?库许 vr 八,库许 vr 幺六啊,对吧?这两个类型呢,它就是要它是一个字节或者是两个字节的,那么就是要用这个进行这个地址对齐啊, 然后这个 s u b 啊, e s 到 e c s, 那 么这整个运算,我们往上看啊,这个 e s 是 相当于 e s i 减去这个八十,那么 e c s 四零, 那么整个就相当于 esi 减去这个零 x c 零, esi 减去零 s c 零,我们知道这个虚拟站的这个站顶,我们结合这幅图, 虚拟站的这个出市值,它就是这个虚拟站的这个站顶啊,减去零 s c 零, 那么这个虚拟计算器的这个大小就零 s c 零,对吧?那么虚拟站的这个站点,它跑到上面来,比如说跑到这边来,对吧?跑到这个地方,那么减去零 s c 零,它的这就相当于将这个虚拟站这个 啊,不是,是这个新的这个虚拟计算啊,计算出新的这个虚拟计算器的机子啊,那么新旧的这个虚拟计算器的这个机子啊,它就是通过这个虚拟站的这个站点减去零 x c 零啊, 那么新的虚拟站的啊,虚拟计算器的这个机子,那么就等于新的虚拟站的这个啊,站点减去这个 零 x 设定啊,大家能明白吗?啊? ok, 我 们接着往下看啊, 我们回到这个叉三二的 bug, 那 么这边啊,这边它又什么库取 edi 啊,我们知道这个什么,这些都是功能计算机啊,库取 edi 啊,库取 esi, 那么这个 e d i e s i 首先它这个只要进行保存,因为它后面会使用到啊, 然后铺写 f d 啊,那么这个是标志计算器啊,这边运算的话可能会影响,所以说它这个也要保存,然后接着什么木五在 e d s 到 e s i 啊,然后写了 d, 然后这个是这个拷贝指定啊,那么这这个拷贝指定,它就是要用到这个 esi 和 edi 啊,所以说它这边要先保存, 那么它拷贝的大小是多少呢?那它就是什么 ecs, 就是这个 e c s, 它是大小为零 s 四零啊。那么这里我们回到这个这边,我们看一下,它这个是循环这个进行拷贝的这个 i e p 这个前缀,那么它是, 它是读取这个 e c s 的 值,那么这个 e c s, 它这个寄存器寄存器也叫什么?技术寄存器啊? c 啊, code 啊,就是技术寄存器,那么它是四十啊,那么它是从这个 esi, 那 么 esi 就是 这个 es 的 esi 的 来源是 e t s, 那 么这 e t s 是 这条会编指令,那么这条会编指令,它是这个旧的保存这个旧的这个虚拟呃,计算器的这个机子,旧的 esp 和 esi, 那 么新的就是 es, 就 这边算出来的。 这样子,他就是将这个旧的这个虚拟计算器的这个机子,然后拷贝到这个新的虚拟计算器的这个机子啊,那么大小是什么? 四十啊,那这边我们就可以得出一个结论了,那么真正这个虚拟计算器的这个大小是什么?四十除以这个四,那么它就是十,它就是十六个这个 十六个这个虚拟计算器,那么刚刚我们讲到这个它这边是什么?我们回到这个这边看一下 这条 l e a d s 逗号,什么 e s p 加六十,那么我们刚刚是六十除以这个四十啊,那么显然啊,它这个有这个笼鱼的这个空间, 有个有这个多余的这个空间,那么用做什么呢?它这个就是用做这个缓冲了啊,比如说我们这个,我们看这个帖子啊,解释它是怎么解释的? 就是啊,在最后的什么 ip 目录中啊,拷贝单位拷贝的这长度 e c s e c s 等于四十,我们之前讲过这 esp 加六十, 我们推出计算器有十八个,怎么解释呢?就是利用 context, 那 么这就是虚拟计算器啊,只有十六个计算器,记十个计算器啊,多出来的这个零 x 二十个字节, 那么就是这个多出来的字节啊,是给这个压账缓冲用的啊, 比如说我们先压胀,再判断是否爆炸了,如果爆炸了,那么 comtesse 的 十八个计算器,它就覆盖到第十七个计算器啊, 那覆盖那就完蛋了,是吧?对吧?所以说它就是说做个缓冲,反正它这个被覆盖也没事,反正这个虚拟计算器它也没存储到那边啊,就是用来这个检测,如果检测到,那就让它把这个 虚拟计算器的这个机子进行抬高啊。 那么我们看一下后面,后面它就是 pop f d, 把这个什么标志计算器给它 还原,然后 esi、 edi 都还原,那么最后就跳到下一条框的去执行。

哈喽,大家好,我是阿强啊,今天我们来讲这个课时,十一啊 vmp 一 点八获取 iet 的 信息, 我们上节课啊给大家演示啊,我们这个对这个 vmp 啊的这个 talk 的 这个全过程,那么我们知道啊,我们会啊, 首先我们会对这个啊 vmp 啊一点八的这个壳啊,获取它的这个 iat 的 这个信息啊,是用这个脚本, 那么今天我们这节课啊,就是来讲啊,如何获取它的这个 iat 的 这个信息啊?那么首先我们打开这个 iat 帕,取点这个 tst, 那 么这个 tst 啊文本文件, 就是我们用这个脚本啊生成的这个文本文件,那么里面的内容就是关于它的这个 it 的 这个信息,那么这边我跟大家就稍微解释一下啊,那么 首先它一个 a p i 函数啊,它它有四个这个数据啊,那么第一个数据数据,它就是这个, 呃,它它是有三个数据啊,那么第一个数据是这个呃 va, 那 么就是它的这个呃这个地址啊, 就是说,那么第二个是什么?是这个 key, 那 么就是这个密钥啊,那么这个密钥就是参与这个解密出这个 ap 函数的这个地址啊, 那么第一个就是存放这个密钥了啊,就就这个意思了第一个地址,那么第三个信息,就是啊,就就是这个啊 ap 函数啊,然后这个动态链接库的它的这个名称, ok, 那 么我们现在打开 o d 啊,去分析这个顶点 v n p 啊, 然后我们第一步要找什么呢?我们是要找这个,首先它这个壳,它会去这个搜索这个 api 函数的这个地址啊,它是通过这个 怎么搜索呢?它就根据这个制腐串啊,来这个进行搜索,那么我们就要找到它的这个 搜索的这个代码,那么我们怎么找呢?我们可以啊,这边找个这个动态链接库啊,比如说我们找可以找这个 virtualitek 的, 那么我们可以在这个 kernel 三二,那么在这个 kernel 三二点这个 update, 那 么这个地方啊,双击进去,然后用这个查找二进自创,然后这边阿斯卡马啊 virtualitek, ok, 那 么找到的这个地址是七五三二零 b c 九, 我们在这个内存窗口转到七五三二零 b c 九, ok, 然后我们在这个啊,它的这个第一个字节,我们下个内存访问断点, 然后点击运行, ok, 那 么现在断下了啊,把内存断点删掉,断下之后呢,我们可以看到啊,它这个 它是去这个比较了,那么是比较什么的啊?比较这个 e s i 指向的这个,那么就是这个幺九 f f 二八,这个是堆站这边啊, 啊,指向的这个完全 protect 啊,然后这个,呃 edi 是 什么呢? edi 就是 刚刚我们找的这个地址,那么它这边就在这个搜索这个 a p 函数的,先通过这个判断 a p 函数的这个名称,然后去获取这个 a p 函数的这个地址啊,那么我们这边可以进单步啊, 单步走,继续走, 那么他这边啊,一直都在比较啊,一直都在比较, 那么这周这边我们可以看到他这个名称是一模一样的啊,所以说他等等一下这个比较完之后呢,他就会啊,能够找到这个啊, which part 的 这 a p 函数的这个地址啊, 我们这边就,呃一直走啊,走到他这个最后一个,这个啊,这个字母创啊,字母。 ok, 那 么这边啊,他这个就不跳了,然后我们再走啊,然后走到这个地方,我们接着再走啊, 他这边还有一个是个零啊,这个字母串的是这个结尾。 ok, 那 么走到这边之后呢,它这个就不跳了啊,然后我们再接着走啊, ok, 走到这个绿腾啊,我们再单步来到了这个啊,四 d 啊,六幺 cd, 那 么到这个地方呢, 我们就能够啊得到啊,从这个它的这个计算器中可以得到这个。首先第一个是 es, 它是什么?这个 a p 函数的地址,那么 esi 是 什么? esi 就是 这个啊,动态链接库的它的这个名称啊, ctrl 三二点。第二个,那么 edi 就是 这个 ap 函数的这个啊,它的这个文本之创, 所以说,那么我们到这边可以进行这个啊,这边做个下个断点,对吧?那么他,呃这个壳他执行到这边之后呢啊,他接下去会做什么呢啊?他接下来就会这个对这个 a 片函数啊,这个 地址啊,进行这个加密啊,加密之后呢,他又会将其写入到啊一个地址,那么这个地址我们其实前面遇到过, 我们可以啊,这边啊,嗯,在这个地方,我们啊先到这个路口点,我们再倒回去分析一下啊, 这边下个这个断点啊,点击运行 window 里, ok, 然后我们再转到这个路口点,这边 这边下个这个硬件执行断点啊,那么现在下这个硬件执行断点,它就能够这个成功,然后删掉啊, ok, 那 么我们接着单步走来到这个第一个,这个呃,调用这个 a p 函数的地方, 那么它这边是直接这个什么,跟我们这个一点七、一点六不一样哦, 它是在这个地方直接这个扩扩到这个啊, v o p 这个区段啊,那么一点六一点七,它这边并不是啊,它这边并没有改啊,它是在这个扩啊,我们扩之后,然后它的这个内部啊进行这个 修改,对吧?还记得吗?我们是他是将扩他的这个内部,他说他的第一条这个指定是一个降频,对吧?降频到这个什么表,对吧? i a t 表了,那么把这个降频给它降到这个啊 v o b 区段,那么这边就不一样了, 所以说我们这边就啊没必要这个使用这个搜索这个什么 ff 二五这个特征码,对吧?我们这边就啊不用这样子,然后我们这边直接单步走啊, 那么这个地方我们啊上上节课啊,已经跟过了,那么我们再进行这个啊,讲一下啊, 到这边首先它这个,呃木五这个什么啊?四二 c b 一 六到 edi, 那 么我们打开这个刚刚的这个啊, it patch 点这个啊,基础本这个文件,那么这个首先我就这边做个比喻吧,对吧?这边做个比喻, 那么这个值啊,不一定跟它相等,那么它因为是不对应的,因为 a p 函数它不一样,那么就是说首先它这个 e d i 加上这个七幺 f 二一 啊,这个值它现在是等于多少?四九啊?一比零七啊,那么这个值其实就是这个啊,就是第一个 va, 就是 这个 va, 它的这个啊,它的这个地址啊,然后啊, 然后这个,呃,这个 edi 加上这个七幺 f 二幺,它存放的这个值是什么?零 b 七幺四 e b 六,那么它这个值是什么呢?它这个值其实就是这个 被这个加密后的这个啊, ap 函数的这个地址, 我们知道这个啊,零 b 七幺四 e b 六。我们在单步走,他现在是给的 e d i, 然后我们看一下啊,然后这个 e d i 加上什么零 x 六九哎, b 八 b e 是 a, 对 吧? 那么跟进行这个相加之后,然后就解密出来了这个,那么当这时候这个 e d i 就是 a p 函数的地址,那么这边就解密这个 a p 函数的地址,所以说它这个值, 它这个啊, c f f 啊,四五九二二啊,它这个位置的这个值,就是这个刚刚我们讲的这个,刚刚这个 key 啊,就是这个啊, edi 啊,加零七幺 f 幺存放的这个值了啊, 那么接下来我们要,我们要做什么呢?我们就是要做啊, 去寻找对这个 edi 加上零 s 七幺 f 二幺它的这个内存地址,写入这个数据的这个地址啊,那么我们可以怎么办呢? 我们回到这边,嗯,那么这边已经走过头了,所以说我们这边就啊重来一下吧,重新再来重新重新运行这个程序, 然后下这个 project 断点, 点击到这个 delete 里,然后到路口点,然后我们这边就不单不走了,直接这个走到那边 到头了, 呃, 在这边我们下个这个啊,硬件执行断点,让他走到这边再把这个断点给删掉啊, 然后我们可以在这个地方啊,我们现在是要记住这个地方啊,他是这个四九啊,一比零七啊,四九一比零七, 然后我们把这个地址啊复制一下,我们直接点修改,呃,我们可以这样子啊,就是我们现在记住四九一 b 零七,然后重新这个 运行这个程序啊,然后在这个内存窗口,四九 b b 零七四九一 b 零七, ok, 转到这边,然后我们在这个地方给他下个这个断点,下个内存, 呃,下个那个内存写落断点啊,然后我们再点击运行, ok, 那 么到这边我们可以看到啊,这边断下了啊, 那么这个值啊,就是这个地址,他对这个地址进行写录,那么他不是我们要找的, 那么我们就是再点击这个运行一下,他这边还会断下啊,那么这个地址啊,五四 b 七 e 七,那么这个地址就是我们需要的啊, 这个地址啊,刚刚这个地址也是对这个啊四九 e b 零七进行写录,那么不是我们要找的,那么这个地址才是我们要找的啊。 咱结合我们前面啊找的第一个这个地方,我们前面找的第一个地方是哪里啊?那么这边我们就打开这个课间的这个脚本这边看一下, 我们前面啊找的第一个地方是这个啊,这个四 d 六幺 cd 啊, 然后我们现在找的这个是五四 b 七一七,那么它这个壳它就是会啊,先执行到这个四 d 啊六幺 cd, 然后再执行这个五四 b 七一七, 那么这个四 d 六二 c d, 它就是查找这个 api 函数的这个地址,通过这个搜索这个字母串,那么查找对到这个 api 函数地址之后呢,它就会执行到这个五 b 五四 b 七 e 七, 然后他又去找下一个这个 api 函数的这个地址,然后就是这样子循环, 那么我们再回到这个,嗯,这个啊, i a t patch, 那 么这个脚本输出文件这边啊分析一下, 那么首先这个啊, ctrl 三二点,第二点这个啊,这个 a p 函数的这个字母差,我们在刚刚这个第一个这个这个地方就是我们啊,我们再回到这个脚本看一下, 就刚刚我们找的这个啊,四 d 六幺 cd 啊,在这边下段就能够获取这个, 获取这个这个啊,这个第三个这个数据啊,就是这个自助餐。那么 第一个和第二个我们怎么获取呢?我们就在要在这个五四 b 七一七这边获取啊,那么这边我们在脚本 里面也是在这个地方下个硬件段的啊,那么这边断下之后呢,我们 的这个,首先这个 e a s, 那 么就是这个第一个 v a 啊,就对应这个四五七啊九五三这个数据,那么第二个呢?第二个是怎么来的呢?第二个是啊,通过我们这个, 通过我们前面这个四,呃, 再结合这个脚本讲一下啊,是我们前面这个在这个啊,四 d 六幺 c d 啊,第一个这个地方获取到这个 api 函数的这个地址,然后减去啊,减去这个, 我们再结合这个脚本看一下啊,它是减去什么?好像是 e d s, 它是保存到这个啊,就是这个 e d s, 那 么它就是啊,通过这个 这个前面这个啊,四 d 六幺 c d 获取到的这个 a p 函数啊,让它减去这个 e d s, 那么这个 e d s 是 什么呢?它其实就是被加密后的这个 a p 函数 的这个地址了,我们可以看到这个 e d s, 它写入到这个 e s, 那 么 e s, 就 刚刚我们讲的这个 好,这个第一个这个啊地址这个 v a, 所以 说他这边就可以,他本来就是通过这个加法来进行这个解密的,那么所以他的这个 key 就 能够获取了啊, 这个 key 就是 用这个 a p 函数的这个地址减去这个他被加密后的这个 a p 函数的这个啊,这个地址,那么他得到的这个值就是这个 key 了。 ok, 那 么到这边我们就能够获取这三个数据,那么这三个数据 就能够使用这个啊, ruby 它写的这个啊,它的这个 ruby 点 d l, 来来这个辅助我们啊脱这个壳。 ok, 那 么我们这节课啊,讲这个理论啊,就讲到这边,那么我们下节课啊就来分析它这个啊脚本。

哈喽,朋友们大家好,今天我们来学习啊, vmp 托克入门啊,克什三啊, vmp 啊,一点六脚本的这个编辑思路,还是打开我们的这个克什二的这个课间,然后打开叉三二的 bug 啊,将这个调皮啊,这个点 vmp 拖过去啊, 然后找到断点啊,那么这个断点是咱们啊这个上一节课设置的这个断点啊,我们点击运行, 那这个是硬件执行断点,那么现在是断在这个啊,原来这个程序的这个第四条这个会编指令了,那么前三条会编指令他是被这个给这个偷走了,那么这个偷走他是进到这个虚拟机去执行啊,然后我们在这边啊,单步走啊, 走走走,那么走到这边我们先啊注意一下这条汇编指令啊, s o r e a s 逗号 e a s, 那 么这条汇编指令它其实是对这个 j f 标志位进行这个写一啊,对吧? 他是清理那么这个一或他同一个计算器,他执行的结果就是零啊,那么所以说这个 zf 标志位他被他清零了啊,呃,他就变成一啊,那这个非常重要,这个对我们后面这个 研究的话,那么这个是一个坑啊,就是这个作者埋的这个坑,我们等一下会解释啊。 ok, 我 们在单步走, 走到这边,那么这个就是库这个呃,这个 i a t 了,那么我们怎么走?那么这个是一个 jump, 那 么我们上节课讲到了这个 jump 是 jump 到这个 ap 函数了,但是它这边被改成了这个虚拟机的这个代码号, 然后它这边下面还有好几个这个降频啊,那么这个降频其实也是啊,这个降频的这个 a p i 函数,它这边是改成了这个也是虚拟机这个呃区间的这个地址,但是它们这个地址都不一样啊, 那么不一样的话就是说明啊,每一个这个地址其实就是代表它能够解密出啊,唯一的这个这个 a p i 函数啊, 所以说我们可以利用这一点啊,来进行这个啊 a p i 函数的这个给它还原啊,把这个转本后面的地址给它改改回去啊。 然后我们再注一下它这个降频,它其实是降频到这个 it 这个那个表里面去,但是它这边下面还有一个这个非常明显的这个标志啊,就是这个八 b c 零啊,那么这个降频啊, 只不过说它这个它原来的这个降频,它是六个字节啊,那么这边是一个啊跨断的这个跳它,所以它是五个字节,那么多出来一个字节,本应该它是这个呃零,只不过它这边变变成了这个随机数字啊, 所以说这个 vmp 作者啊,还是非常狡猾的。然后我讲一下这个插件的一个这个关键的这个思路啊,它就是说 咱们这个有这么多个 jump, 然后这个 jump 并且跳到这个不同的这个虚拟区,呃,这个 vmp 区段的这个地址,那么这个 vmp 区段呢?就是这个 vmp, 这个我们就是就任意一个这个 jump, 这个每个 jump 都其实都跳着这个虚拟机代码去解密出这个 api 函数去执行。但是它这个这边我们 随便一个跟进去之后呢,他其实会跑到一个,就是会执行到一个地方,那么这个地方是他们所有的这个降坡啊,根据跟进去都会执行到的这个地方, 那么我们现在以这个降坡这个四六零 b d、 d 为这个例子跟大家解释一下,单步走啊, 那么这些啊,我们走走的时候我们去观察一下计算机的值,只要它出现这个 a p r 函数的这个地址,我们就注意一下走, 呃,刚刚是不是有一个条件跳转啊?就这个条件跳转啊,那么我们这边下个断点吧,这边下个硬件执行断点,我们重来已经走过头了,那么这个非常关键啊, ok, 断在这边, ok, 现在就断在这边了,我们把这个断点给删掉啊,那么这个 j l e 它是光,它是按照这个 j f 标志位进行这个判断的啊, 它就说现在 j f 标志为 e, 那 么它就执行这个跳转啊,那么跳转啊, 那么这边我就不,呃,不再跟踪代码,我直接说原理啊,大家,呃,有兴趣可以自己去试啊。然后这个跳转我们 可以怎么改呢?他这边其实是跳转到两个地方,对吧?他就是跳和不跳,他的结果都是一样的啊,比如说现在是跳啊,跳,跳到这边啊, 跳到这边,然后这个啊,那么这边就是解密出这个 get more new handle 了啊, ok, 然后行到这边啊,什么四幺四,什么 e 二,然后这个啊,在 在这个跳到这边啊,然后去啊,他这边就去执行这个 ap 函数了啊,然后我们还有另外一种情况下,就是他不跳啊, 他这边不跳也可以啊,所以说他这个可以可以进行这么改哦,他这边跳和不跳,他的这个结果都是一样的哦, 那么我们可以这边给,那么我们这边下个硬件执行断点啊,然后这边 执行到这边之后呢,我们把这个呃断点给它,也也不能禁用,直接这个 删除映间段的,然后这边做个标记,然后这边我们用这个 note 给它填充啊,就是让它永远不跳,你永远不跳的话,那它就走这一边啊,走这条路,那么这条路它也是可以, 也是可以解密出这个啊, get module handle 的 啊,那么它为什么要这么做呢?为什么要让它这个程序分成两条路走呢?啊?那么这个其实就是因为来这个就是相当于就是为了干扰我们去分析啊, 我们这个插件有一个非常巧妙的地方,就是绕过了这个 e a s 啊,就前面我们讲的这个 e o, 那 么我们刚刚说的这个指令啊, 这个指令我们我们回来啊,那么这个我也是想了很久啊,终于明白这个为什么这个脚本它能够正确的这个恢复, 就是这个会编指令,它是这个根据 j f 标志位啊,那么 j f 这个标志位它为一,就是前面那个异货,那个 e s 的 异货执行的结果影响这个 j f 标志位啊, 那么这个这个跳与不跳它都都能够成功啊,我们这边给它改成 jump, 我 们再演示一下。 呃,现在是,我们刚刚是改改成这个 nope 啊,那我们现在改成 nope, 然后我们就运行啊,它这个是能够呃运行成勾,现在是这个让它不跳啊,那么等一下我们给它改成这个 demo 试一下啊。 呃,这边下个硬件指令断点,我们重新载入一下啊, 然后这边给他断点,给他,嗯,删除这边,我们改成这个 jump, 让他永远跳, 那么我们现在点击运行 ok, 他 也是能够成功。那他那个作者为什么要这么搞呢?他其实就是为了防止我们抓住一个这个固定点,那么这个这个固定点是干嘛用的吗?就是说他所有的这个, 我们再回到前面,回到这边 就这边啊,像它这个 jump, 比如说它这边被修改成这个区段啊, v o p 这个代码,那么下一个也是被修改成 v o p 的 这个代码,再下一个也是被被改成 v o p 的 这个代码。但是我们任意一个 jump 跟进去之后呢, 我们的思路就是它会固定执行到一个地方, 就是会固定执行到我们这边,让它不跳啊,设置 eip 啊,它这边会固定执行到 这个地方,那么这个地方就是我们的这个切入点哦,我们边写这个脚本的时候,就要在这边下这个硬件断点了,那么执行到这边它这个 e s 就是 这个 啊,这个 api 函数解密出的这个 api 函数,然后我们就让脚本把这个前面的这个 jump 给它改回去啊, 那么这个前面的 jump 怎么发现的呢?我们就是根据这个指令去搜,从四零零、四零幺零零开始用这个脚本去搜,它这个 jump 是 怎么搜到的呢?我们回到前面看一下,它这个 jump 是 再回到前面它这个键盘,它这个键盘有个特点啊,它是这个开头是,它是五个字节,开头是一九,然后结尾是零零啊,我们就搜这个特征啊,用这个脚本搜, 然后收到,收到的时候收到,比如说收到这边,那么就把这个,呃 eip 改成这个四六零 b d d, 然后让程序去跑,对吧?跑到我们刚刚的这个切入点,就刚刚那个绿腾, 就是这个律腾啊,跑到这个律腾的时候,我们就是因为我们下映帧断点嘛,它就会断下,断下之后我们把这个 e s 的 这个值啊,给它写入到刚刚这个 jump 啊,那么我们就会成功恢复一个这个啊,这个 it 了啊,那么接下来我们继续用这个脚本去收啊,然后就这样子所有 it 就 恢复出来了, 那么啊,那么执行到这个啊,四六二零三 d 是 因为我们前面的这个啊,这个他不跳啊,就这个啊, 就是这个 j l e 他 不跳啊,但是啊,他的影响,他跳与不跳,他就是跟我们前面这个异货有没有这个 sos 逗号 sos 这个指令有关系哦,那么他有些这个, 所以说他就是他有走两条路,对吧?他就是在这个地方,相当于一个这个十字路,呃,十字路口,我们就当做十字路口了,对吧?他有两条路,一个是跳一个,另外一个是不跳,跳与不跳他的结果都一样,但是跳与不跳他会影响我们这个, 对,这个,呃,固定这个这个里程的这个定位啊,对吧?他如果跳的话,他就不 不执行到这边了啊,那么我们就没办法在这边进行这个设置,这个啊,印证断点啊,所以说他这个,嗯,这个作者的思路还是非常高明的啊, 我对这个分析的话,也有刚开始也有时也搞不懂啊,但是我们这个用个脚本他就不一样啊,我们用的这个脚本,他就直接走这 直接走这一条路,它不不经过这个 e 或 e s, 它不经过这边的啊, 我们就直接设置这个 eip 为这个四六零 b d d, 哦,所以它不经过这个 e 或,所以它就会啊,它经过这我们的这个脚本,它就会每一条对这个呃 a p 函数的解密,它都会经过这个四六零四六二零三 d 啊,这个就是这个脚本的这个高明之处,就实现了这个非常巧妙的这个,把这个他这个呃这个呃这个什么给过掉了啊。 那么如果就是说我们这个脚本,我再再讲一下啊,啊,就说我如果我们用这个脚本去这个模拟他执行,他这边就永远就不跳了啊,他这边就不跳了,相当于这个给他 nope 不跳的话,它就会啊,只要执行这个 jump 到这个 v o p 区段的这个啊,它就会永远都会再执行到这边啊, 所以说我们在这边下个段点就能够接收到它这个解密出来的这个啊, api 函数的这个地址。 那么啊,我们讲这个 v o p 一 点六的这个啊,脱壳啊,它的这个 it 啊,通过这个脚本进行修复,那么这个 啊,已经啊有很多这个资料啊,或者是这个视频教程对它进行这个讲解啊,但是啊,我发现啊,就是说它有些地方啊,讲的并没有那么深度啊,导致我们这个看下来啊,还是有很多的这个疑问 啊,就比如说啊,我们刚刚说到的这个啊, e a s 的 这个异货对这个 j f 标注的这个影响啊,从而导致我们这个啊,这个 jump 我 们给它改回来啊,这个 j l e 啊,它这个是跳和不跳啊,从而影响我们这个 这个,它的这个返回指令就是这个啊,这个四六二零三 d 能否被这个执行到, 那么这个也是我自己啊,花时间去啊研究啊,终于搞懂啊,它为什么用这个脚本啊,它能够啊成功的修复的这个 i a t, 我 敢说啊啊,我这个视频都是很多地方都是讲的非常细的,为了就是大家能够啊 对这个 v o p 的 这个分析啊,对 v o p 这个逆向能够啊,真正的这个理解不会说啊,学了之后还是云里雾里的, ok 啊,那么今天我们这节课就先聊,先讲到这里啊,那么下节课我们再详细讲解这个啊脚本它的这个编辑的这个注意事项和这个编辑过程。

哈喽,朋友们,今天我们来学习这个课时,六 v 用 p 一 点七的这个托克寻找程序的入口点, ok, 转到我们的这个今天的这个课间啊,那么我们首先打开这个 v 用 p 一 点七啊, 那么这个 vmp 一 点七啊,它对这个我们的这个程序啊进行这个夹壳,它现在就不需要这个指定啊,就是这边新建流程啊,然后什么呃,选个路口点啊,然后这边呃指定它的这个流程末端啊啊,选择是这个 虚拟还是这个什么超级或者是变异啊,那么在这个 vmp 一 点七啊,这边它不需要指定了 啊,我们给它删掉啊,那么我们只需要在这个选项中设置一下就行了,那么今天我们给大家演示的这个程序呢,就是使用它的这个呃全保护啊,那么这边就是啊,把这边所有的勾上啊, 然后我们这边点击翻译,那么就生成了我们今天讲的这个例子了,那么这个调试模式啊, 那么我们不需要勾啊,那么这个调试模式勾上去之后呢,他这边啊会把这个虚拟机的一些啊,焊的什么的啊,放在这个外面,他不会说直接放在我们的这个代码段, 然后我们今天看一下它的这个入口点怎么寻找啊,那么这边我们的这个例子啊,它这边已经有检测这个调制器了啊,所以说我们打开这个 o d 啊, 那么打开 o d 之后呢,那么因为这个 o d 啊,我已经加了这个反反调试插件了啊,那么是哪一个呢?啊?那么就是我们找一下,那么就是这个 c 四 core hider, 什么 o d e 啊, plug in, 还有这个 hook library, 那 么这个插件啊,是个开源的这个插件,那么这个插件非常强大啊,那么它能够秒杀这个 d 版本的这个 v o p 的 反调式, 然后我们把这个呃这个例子给拖过去看一下啊, 那么我们可以,那么这个插件里面的这个时钟 o d 啊,它不能过这个 v o p 一 点七的这个反调试啊。 ok, 我 们现在开始找这个啊,这个加壳程序的这个入口点,那么这个加壳程序的入口点,这个找法和我们 就是一点六的这个啊,加壳这个程序啊,找法不一样啊,那么怎么找呢?那首先啊,先讲这个一样的啊,那么都是在这个 vtoplay tag 这边下个这个断点啊, ok, 我 们现在点击这个运行啊,也是到这个 delete, ok, 下 delete only 断线了,我们把这个断点去掉,那么去掉之后我们来到这个 代码段啊,那么这边我们设置这个内存访问断点,然后接着设置这个访问的方式是这个执行,然后我们点击这个运行啊, ok, 现在是断在这个代码断这边了啊,那么我们一点六的这个方法,就是现在断下之后,如果剩下是一点六,那么现在再点击运行,那么它就跑到了这个 o v p 了啊,那么这边不行啊, 那么这边我们该怎么做呢?那么我们首先啊,他这个地方他会一直都被执行,那么我们就在绕过这个地方啊, 怎么绕过呢?那么我们可以现在就是啊单步执行啊,我们先把这个内存断点给这个删掉啊,然后单步走, 单步走,那么到这边我们按一下这个 f 四这边或者这边下个断点,我们点击运行啊, ok, 那 么我们然后在这个代码段设置这个 内存返回断点,然后设置这个执行,再点击这个运行,那么还是跑到这边来了啊,那么所以说我们刚刚的这个啊,没有取得这个效果,那么我们再把这个内存断点删掉,那么我们寻找另外一个这个条件跳转啊, 那么不是这个跳转,那么我们就找第二个这个 条件跳转,那么就是这个条件跳转啊,他这边是呃执行这个跳,那么我们让他这个他的下一句,我们设置个断点啊, 点击运行啊,那么现在我们在这个呃这个代码段这边设置这个内存访问断点,然后设置这个执行,然后我们点击这个运行,那么 ok, 那 么我们现在就断在了这个他的这个 log 电脑啊, 然后我们把这个内存断点给删掉啊,那到这边我们可以发现哦,它这边跟我们这个一点六的区别就是啊,一点六,它是在这个,它是呃入口点,它是找到的时候,它是在四十 c a 九 e, 哦, 那么我们这边是四四 c a 九八一点六,他这边啊三条指令他被这个给抽走了啊,那么这边并没有啊,他是完整的给它还原回来了, 然后我们看一下这个它的这个 i a t, 那 么这边 i a t 肯定是被加密的,因为我们这个给它加壳的时候已经设置过了,那我们跟踪跟进去这个库啊,点击回车,然后我们再点击回车, 那么我们可以看到它这边是 jump 啊,到这个啊,虚拟机的这个区段啊,所以说它这个 i a t 也被这个加密了。 那么到这边我们分析到这里的话,我们给这个,首先我们要将这个,呃,这个程序把这个它的这个 it 进行这个还原啊, 那么还原的话也是跟我们这个一点六一样啊,那么只不,只不过我们写脚本的时候,我们需要这个手动啊,找到这个 它的这个入口点,那么一点六,它,是啊,这个找入口点也写进了它的这个脚本里面,我们这边一点七啊,需要手动 找这个路口点,那么到这个到这个路口点之后呢?啊,我们就是它执行到这个四十 c a 九八啊,我们找到这个路口点之后,我们接着啊,我们运行这个 it 修复脚本,那么这样才能够进行这个 tok 啊。 ok, 那 么我们下节课就来讲这个啊 tok 的 这个脚本啊,然后。

今天我们来讲第四课时啊, vmp 一 点二的这个 认识,那么在讲课之前啊,我先问大家一个问题,那么你们啊,或多或少啊,对这个 vmp 掌握的情况怎么样?那么都有一个这个问题,就是你们刚开始接触这个 vmp 的 时候啊, 是从哪个版本开始的,那么应该没有人直接从这个最新版本开始分析吧, 啊,如果有,请在这个我们视频底下说一下啊,那我绝对是要给你竖个大拇指啊, 能直接从这个高版本也不是最新版本嘛,对啊,现在这个 vmp 版本已经到三点几了,那么目前最新版本是三点幺零点点一还是点二, 那么如果你能够直接啊把这个三点幺零啊,这个版本的 vmp 啊,直接拖到这个叉三二的 bug 能分析出来啊,一点点东西啊,那我就算你厉害, 反正啊,我是没有这个本事啊,那么我刚开始学习 vmp 的 时候啊,啊,就是我从这个第一节课的那个啊, vmp 零点七啊,自己先给他啊,拖到这个 ood 去啊,去跟踪啊,去分析一下它的这个行为, 那么后面呢啊分零点七啊,因为它这个版本啊,比较简单,所以说能学到的东西其实啊并不多啊,主要是掌握这个 vmp 的 这个架构啊,那么 零点七之后呢,那么我就去啊找这个 vmp 的 这个版本去学了,那么找来找去,找来找去 找了很久啊,后面我就找到了这个 vmp 一 点二一啊,那么这个版本啊,首先这个版本啊,分析的人啊比较多,他这个资料啊比较齐全,所以说我就入手了这个版本啊, 所以说这个 vmp 一 点二一才是算是我这个分析 vmp 的 这个路啊,这个学习路上的这个第一个啊,启蒙老师,那么这个 vmp 一 点二一,它基本上 到这个二点二点几之前啊,之之前的这些所有版本啊,都是按照这个 vmp 一 点二一啊进行这个拓展的,比如说这个混淆啊,都是在这个 vmp 一 点二一的基础之上进行展开的, 古人有云啊,不积跬步,无以至千里啊,不积小流,无以成江海。学习就是一步一个脚印,脚踏实地,这样万丈高楼平地起啊,任何 摩天大楼他都是先打地基啊,然后所以说我们学习啊也应该遵循这个规律, ok 啊,我们啊,打开我们今天的这个课间啊,那么今天的课间啊,我就给大家这个啊, vmp 啊,一点二一的这个 程序,我们双击它一下,然后这个界面啊,就是我们 vmp 一 点二一的这个界面,那么我们可以看到啊,这个界面跟我们零点七相比啊,是不是觉得更加舒服了啊?首先它没有乱码, 然后我们要去加密一个程序,那么我们就点击这个,然后它这边啊打开这个程序, 然后在这里啊,点击右键啊,然后再点击第一个这个六啊,然后这边输入我们这个程序的要加密的这个要要虚拟化的这个地址,那么这边我们就输入这个他的这个入口点就行了。四零幺零零零,点击 ok, 那 么他这边就显示出来了啊,就返回编出来的这个代码,那么我我们这边就, 那么我们现在就给他加密一条会编指令,那么我们就选中第二行,那么第一行就是我们要加密的这个会编指令,他是这个一个加法指令, 然后我们怎么办呢?啊?选中第二行右键啊,然后点击这个第二个什么 end of 这个啊,点击一下,那么大家可以看到啊,第二行之后那个指定它都变成了灰色的, 那么这个其实就比较方便了,不像我们这个零点七,他只他返回编出来多少行代码,那么这些代码全部给我们去啊,虚拟化没有必要啊,所以说到一点二一之后, 他这个 v 永 p 他 就比较人性化了啊,一些功能他就比较成熟了。 然后我们点击这个运行,那么它这边显示这个什么, 那么那么这句英文的意思就是说我们要加密的这个指令数量它小于五个字节,那么为什么会这样子呢?首先它会在这个四零幺零零 这个地方写一个降频,那么这个降频就是五个字节,那么我们 加密的这个指定这边你们看一下,他这边才三个字节,所以说小于五个字节,他这边就不能写这个这样的指定的,所以他要提醒我们,那么我们怎么改呢?到这边把这个这个勾给取消掉,然后在这边再点击一下这个, 那么这边就刚好五个字节了,那么我们点击这个三角符号, ok, 它就成功了,那么它这边就多出来一个这个啊, test 的 点 p、 o、 p。

大家好,欢迎来到逆向工程第六课,完整源码和资料已经放到我的主页,需要自行领取。这次难度稍升级,我们面对三重反调试检测程序,会在 s e h 异常处理里再加一个 output debug string, 算法也从简单的易获秤 变成简易获称加右移的混合。我们学习如何连续跳过两条关键的反调试指令,同时动态还原更复杂的混合加密算法。最后写一个通用注册机,建议立刻收藏。反复练习。我们先动手写目标程序, 它比第五课更近一节。文件包含三重反调试函数和一个更复杂的序号验证。前两道检测跟上一课完全一样, 保持稳定。这次新增 output debug string 检测,作为第三道防线主函数,在串块依次调用 rap debug break 和 output debug check except 中执行双重检测,发现调试器立刻退出。验证算法改成 先减零 x 十二 e 或零 x 五 a 乘零 x 八十九,加零 x 三十四,累加后加零 x 一 二三四又溢一位,最后取低十六位。代码完成后,我们用 visual studio 命令行翻译成 xic, 新建 crackme 六点 c p p 文件, 开始编辑六大功能模块儿, wrap debug break 依旧是 debug break 触发 int 三 wrap output debug。 调用 output debug string w 增加第三道检测 is debug 和 isn't global flex set 保持不变。 check serial 里先把每个字母减零 x 十二 再异或零 x 五 a 乘以零 x 八十九,再加零 x 三十四,累加到 sum 循环结束。 sum 加零 x 一 二三四又移一位,取低十六位。主函数依次调用四道检测,全部通过才进入验证 串块里。依次调用 rap debug break 和 rap output debug 代码编辑完毕,执行翻译命令,生成可执行文件。 把编辑好的 crackme 六点 exe 拖进 x 六四 dbg 并填好参数,加载后界面可能停在系统 dbl, 我 们先不管它, 在底部命令行依次输入 setbreakpoint system 零和 setbreakpoint entry 零,这两条命令可以直接关掉凡人的系统断点和入口断点,然后给 is debugger present 和 isn't global flagset 下软件断点, 按 f 九运行,听到 is debugger present 后, ctrl 加 f 九返回,再将 e a x 改为零, 继续 f 九,同样把 anti global flag 检测的返回值也改成零。现在找到我们里第一条 callrap debug break 指令,设置断点,再找到第二条 callrap output debug 指令, 也设置断点,然后给 check serial 下断点,准备验证算法。按 f 九,第一次停在 callrap debug break, 直接改 rip 跳过,再按 f 九,第二次停在 callrap output debug, 同样改 rip 跳过两道反调式都被跳过,程序直接进入 check serial。 现在可以安心单步仔细分析更复杂的混合算法了。 x 六四 dbg 已加载程序,参数是 alice 和错误的序号。注意,现在我们不去点菜单,直接在底部命令栏输入 setbreakpoint system 零 回车,再输入 set break point entry 零回车,系统断点和入口断点就彻底关掉了。接着在符号列表给 is debugger present 设置断点,同样给 isn't club flag set 也加上断点,然后按 ctrl 加 g, 输入第一条 call, rep debug break 指令的地址定位到第一条 call, 在 这条 call 指令上按 f 二下断点,再定位到第二条 call rep output debug 指令,同样按 f 二下断点, 最后给 check serial 也下好断点,准备分析算法,万事俱备。按 f 九运行程序停在 is debugger present, ctrl 加 f 九执行到返回,双击 eax, 把一改成零,再按 f 九停在 nt global flag 检测,同样把 eax 改成零。第三次 f 九程序准确停在了 callrap debug 检测,同样把 eax 改成零。第三次 f 九程序准确停在了 callrap debug break 这条指令上,双击 rip 存器, 把地址直接改成 call 的 下一条指令地址,再按 f 九程序继续执行。又停在第二条 call rap output debug, 同样双击 r i p, 把地址改成这条 call 的 下一条指令,两次跳过完成,再按 f 九程序直接停在了 check serial 的 入口, 完美避开所有异常。先在底部命令行输入 bpc, 清除所有断点,保持界面清爽。然后按 f 八单步观察每一步运算,先减零 x 十二,再 e 或零 x 五 a 在 f 八看到乘法指令执行,接着加法零 x 三十四,反复 f 八观察循环,直到所有字母处理完毕。按 ctrl 加 f 九执行到 check serial, 返回 eax 显示为零,双击 eax 修改为一, 让他以为验证成功。最后按 f 九程序直接弹出注册成功对话框,连续跳过两道 call, 三重检测,全部绕过,效率极高。我们在调试器里亲眼看到了混合算法的每一步,现在把汇编逻辑逐行翻译回 c 代码循环,以空字符作为终止条件, 每次取一个宽字体符,先减零 x 十二,再与十六进至零 x 五 a 做 e 或运算 e 或结果乘以常数零 x 八十九加零 x 三十四,再与 sum 累加。循环结束后, sum 加上颜值零 x 一 二三四,再又移一位, 最后只保留第十六位,这就是实进制。序列号公式已经到手,下一步就是动手写注册机,新建 k 阵六点二 c p p, 把混合算法直接搬进去注册机,接收命令行参数作为用户名,在循环里完成简易或成家累加。加严后,又移一位,截取 d 十六位,用 brentif 打印出来,编一连接 终端里执行开镇六点 exe, 报瞬间输出 bug 对 应的正确序号,把序号填回原程序,弹出注册成功。屏幕前的你一定要亲手敲一遍,理解才会深刻。新建 key 镇六到 c p p 代码和混合算法公式一样清晰,设置控制台为 unico 的 模式,支持宽字母串输出,判断参数个数不够就提示正确用法便利。每个宽字母依次减零 x 十二 e 或零 x 五 a 乘零 x 八十九 加零 x 三十四,累加,结果到 sum 退出循环后,加上零 x 一 二三四,又移一位,截取第十六位,用 brun prf 同时打印用户名和序号儿,翻译连接后 运行 keygen 六点 exe, bob 控制台立刻显示出 bob 的 正确序号,效率极高。把序号复制回到 crackme 六多多 exe 中,粘贴验证成功,弹窗证明注册机完全正 确。恭喜你完成了第六课,技能树又粗壮了一圈儿,我们这次连续突破了两道异常反调试,学会了在调试器中连续跳过两条关键扣指令, 再次通过动态单步还原出更复杂的混合算法,还亲手写出了生成速度飞快的通用注册机,请务必把代码自己从头敲一遍,再用 x 六四 dbg 走一遍。觉得有收获的话,欢迎收藏视频,以便随时回来复习。感谢你的耐心观看,我们下一课挑战更强的保护机制!