本帖最后由 天朝的梅花 于 2018-5-21 03:27 编辑
俗话说的好授人以鱼不如授人以渔
可可通杀软件给了你一条做熟的鱼
而假设有一天一条生鱼摆在你面前,没人给你做鱼了,你不能说生吃了它吧?
然后返回到汇编窗口在堆栈的第一行右键
果不其然找到了传说中的标志位:1F
想办法做掉它喽{:5_121:}
在1F的位置右键找到修改然后改0
然后双击去除断点运行一哈
我 Ri 什么鬼? 关机睡觉
既然有详细问题信息点开看下吧
程序里找一下吧
模块基址+异常偏移 = 00400000 + 00009dcd = 00409dcd
首先ALT+E找到程序的主模块双击进去
或者Ctrl+G 输入00401000 回车
然后再次Ctrl+G输入刚才我们算出的异常代码地址 回车
原来是个INT3暗桩
断首retn
没办法因为程序已经死了 刚才我们的分析必须重复上述所有步骤在它异常之前提前到达它的异常点
否则程序就死了无论怎么分析也没办法了。
ok重复刚才的步骤以后
在修改判断位1F之后不能直接运行了,因为知道结果会碰到暗桩导致程序假死
那么在修改判断位1F以后怎么办,这里因为VM要释放源汇编代码
所以需要时机
时机就是在调用系统函数:CreateWindowExA 的时候
【这个函数是用来创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口】
也就是说在它弹出程序主窗口之前我们使它停止下来
然后找到刚才的异常地方把其retn掉
我们可以用在快捷命令窗口下:bp CreateWindowExA 这个命令让其断下
或者用工具API常用段点里找到这个断点
好了我们运行两次第一次在:LocalAlloc 这个函数断下
我们修改标志位1F以后继续下断:bp CreateWindowExA
然后在运行一次就断在了程序窗口弹出之前
我们Ctrl+G输入之前找到的错误地址【别忘了先回到程序领空也是就ALT+E然后找到主程序双击】
好了今天继续更新 因为昨天发现这个东西并没有那么简单,而且它竟在我发完教程以后更新了 我估摸着也许作者正在偷偷的偷窥我的教程? 那我只能说一声抱歉了啊哈哈哈
这玩意是个双重验证也就是说 外层的验证只不过是一层壳 而如果PJ了验证那层壳以后 壳就会放出真正的FZ
而真真的FZ里还有一层验证 我们之前所有的分析都是建立在验证壳上 不管怎样想办法让验证释放真真的FZ才是我们的目的 废话不多继续教程 上次说了我们得提前到达int3暗桩的断首retn 才能阻止程序奔溃
今天最新版更新以后我发现 没有虚拟机检测了 那么就更加方便我们了,不过他竟然把字符串给我混淆掉了 妈的蛋,还好我们之前有存根 先讲如果过int3断点吧 我们载入最新版 地址自己去下载:http://dnf-nb-zhuxian.cccpan.com/ 密码:6666
不懂这个断点含义的同学可以看上文
然后直接运行【因为没有虚拟机检测所以可以直接跑起来】
等程序抛出异常【这是一个暗桩,应该是作者自己写的一个检测OD的功能暗桩】
好的我们重新记下异常偏移地点
然后套用公式:基地址+异常偏移 = 错误汇编代码段 基地址:00400000 + 异常偏移:0000d918 = 错误代码段:0040d918 这里的基地址用AIT+E 然后查看当前我们调试程序的名称【也就是内部诛仙.vmp.exe】 切记双击来到程序领空【系统领空是找不到异常点的,因为异常点被作者写在程序中而不是调用系统函数来抛出异常】
【此时的程序依旧处于假死状态不过这并不妨碍我们查看代码段】 然后输入刚才我们找到的异常地址:Ctrl+G 输入:0040d918 【记得回车】
可以看到异常点了,这里我们直接从断首开始复制二进制【也就是这里异常点的特征码方便等下异常之前找到它】
好了我们重载一下程序然后重新下断点用快捷命令行:bp CreateWindowExA 【记得敲回车】 之所以下这个断点是因为现在如果直接到程序领空里看代码是没有任何代码的【因为此时VMP壳还没有释放源代码】 这个断点作用就是在VMP释放代码以后程序运行之前断下来【时机刚刚好不多也不少】
程序断下来以后我们AIT+E 或者直接Ctrl+G输入00401000【回车来到程序领空】 然后我们直接 Ctrl+B 二进制码快捷查找命令粘贴刚才复制的二进制码也就是俗称的特征码
直接来到了断首我们直接按F2下断点然后运行跑起来看一下
结果又抛出了一个相同的异常 而且还是刚才的位置 那是怎么回事 仔细一看原来是因为我们用二进制特征码找到的地方不是刚才抛出异常的地点 看来这个暗桩并不存在为一个啊,可能有3、4、5、6个 那我们该怎么办呢? 没关系我们就继续用特征码找 直接CTRL+L 来到下一个特征码位置【直到提示找不到下一个】 每找到一个就下个断点 然后我们看看找到几个 最后找到两个 好的那我们重新载入程序
继续更新教程 最近作者对防逆向一块很是上心,我发现他最新的版本启动了可可高级验证模块 所谓高级就是FZ验证开始验证你的合法性 换句话说作者的验证后台开始起作用了 它会判断你的账户和密码是否为正版用户 如果正版点击登录提示成功 如果你的账户和密码没有存在于它的后台 他就返回一个错误参数给你 但是这个参数返回后 你点击登录以后没有是没有任何效果的 有人可能好奇高级和普通有什么区别 【高级只返回一个参数】 【普通返回多个参数】 高级参数:即为无效果参数所谓无效果就是不会触发任何暗桩和提示【间接的增加了逆向的难度】 普通参数:每一个返回值都可能处发一种提示或者一种暗桩 而我们可以根据触发的暗桩或提示顺藤摸瓜【方便我们逆向】 好了 话不多说 我现在来彻底分析一下这个FZ的验证思路 首先:如果通过外层的可可验证,验证外壳会释放两种文件 1.第一种:真真的FZ程序 2.第二种:第一层通过的标志
标志文件的作用:作者说是用来防封的 而通过本人实践发现 真真的FZ在启动之前会寻找标志文件如果没有发现即不会启动 那么现在我们的逆向分析思路就变得很清晰了 1.首先要通过可可的外壳验证让其释放真真的FZ程序和标志文件 2.启动真真的FZ然后让其成功 可是我发现作者最近不光启动了高级模块而且还加强的VM的力度 把登录关键CALL里的代码V的一塌糊涂根本没法分析 而且即使现在你如何努力最后发现登录按钮就像失效了一样再也不会有任何效果 这里就要用到一个巧妙的方法,因为旧版验证可以释放验证程序而且程序本身VM力度很弱 所以我们只需要找到一个旧版本的验证然后将其逆向让它释放标志文件 然后在下载一个新版FZ 然后 用PE提取工具提取藏在程序内的新版FZ 最后即可达到逆向目的
好了正式开始新的教程 首先下载一份它之前的版本 我在这里已经帮大家提供了下载地址 地址:https://www.lanzouw.com/i12cm0h 这是它2.0的版本
我们下载下来然后用OD加载 这里我给大家推荐一款OD过检测插件 是大牛最近才更新的玩意这东西很好用 ScyllaHide下载地址:https://www.lanzouw.com/i126ywf
ENO、返回错误、黄金会员点数不足、扣点成功、err 等等一系列的关键字 只能用笨办法下按钮断点之后F8单步一步一步跟踪才能到达最后的关键CALL
这个CALL也就是在所有验证和暗桩都被通过了以后程序最终必需要运行的CALL
F7跟进然后F7单步【因为易语言的按钮事件提供的只是一个接口】 换句话说也就是易语言按钮事件本身是一个功能CALL 易语言按钮功能CALL调用作者想让程序执行运行的功能CALL里运行起来 也就是俗话CALL中CALL 【CALL到想要CALL的CALL里】【调用到想要调用的代码段里】
http://dnf-nb-zhuxian.cccpan.com/ 密码:6666
下载好后 用PF工具提取里面的EXE文件 即可提取到最新的FZ 因为FZ里自带垃圾安装所以我直接为大家做好了压缩包链接 FZ最新版本:https://www.lanzouw.com/i12cx7a PE文件提取工具:https://www.lanzouw.com/i11atzg PE提取工具用法【打开FZ选择进程】 如下图所示 先打开FZ然后打开PE工具FZ会弹出虚拟机检测提示我们无视 找到FZ的进程然后第一个进程双击点击提取
可以看到文件夹里多出了三个其中两个DLL 一个真真正的FZ程序 我们现在双击真正的FZ程序不会有任何反应 我们直接尔到OD中看看
看来真正的FZ也带了壳,懒得查壳了 直接手动找一下OEP吧 用的是ESP定律
首先F8单步 然后观察寄存器中ESP和EIP的变化 当两者同时变动以后【也就是同时变红以后下硬件断点】
很幸运当F8单步第二步就发现ESP和EIP同时变红 鼠标点击寄存器中的ESP的值右键按照下图
然后直接F9跑一下 程序断在了一个很大的跳转上 熟悉ESP定律的都知道 百分之80单步F8一下就是OEP【程序入口点】 我们单步F8一下
来到了一片乌漆嘛黑的地方 删除分析即可恢复源代码 发现还是和刚才程序载入入口的代码一样 那我们再一次用ESP定律 再一次F8单步 ESP和EIP又一次同时变红 我们继续在ESP处下硬件断点 F9跑起来 程序断在了一个JMP上面我们F8到JMP在F8一步就到了程序的入口点
看得多了也就懂OEP【程序真正的入口点长得什么样了】
然后我们删除所有硬件断点
F9运行的话会退出【因为之前跑过一次程序】 所以我们提前下一个退出断点
下好断点F9跑起来 程序退出了 我们看堆栈 堆栈的第一行就是程序中调用退出功能CALL的回调段首 堆栈就像一个瓶子它的作用是存一些需要处理的数据 数据被调用以后会被装进瓶子内 用完以后会被扔出去 也就是哪来的回哪去 电脑想要知道它从哪里来就得顺藤摸瓜 这里的藤就是踪迹 我们直接在堆栈窗口的第一行回车键敲一下 就回到了它进来的下一行 发现他不过是一个退出功能CALL 我们直接段首RETN
上一个【retn返回参】下面第一行就是下一段代码的段首这是规则 我们直接将其retn 但是程序此时已经死了 所以只好复制二进制特征码我们得在他死之前 提前来到它死去的那个地方 盗梦空间都看过吧? 小李子演的.就是在梦里制造一个梦 【也可以用陈奕迅的歌词来解释:梦里梦见醒不来梦】 其实看完以后挺感动的 因为小李子所有的梦都围绕着一个梦展开 那个梦就是他妻子没死之前的梦 他之所以在梦里做梦只是因为他想活在他想活在的那个梦里
烧脑又拗口的语言 但是好好用脑细胞分析通了也许你也会感动到 好了我们重载程序相当于创造一个梦境这个梦境是在程序还没有死之前 但是我们其实知道它会死 所以我们要做的就是不能让他死 推荐大家看一部小短片:解夏的MV【做的相当的棒】 看完你不会明白什么{:5_188:} 但是当你开始假设MV里的救了女孩的那个男人是当初预见女孩的男孩长大以后穿梭时空回来 拯救女孩防止她爱上当初的那个自己的那个人你就会明白点什么了{:5_188:} 我们选中这段促使程序假死的代码 右键选择二进制 —— 二进制复制 然后重复之前的寻找OEP的步骤【因为没到达OEP之前程序壳不会释源放代码】 到达OEP之后Ctrl+B 搜索特征码 找到以后RETN掉 然后运行
好了程序总算复活了
然后呢? 然后我们随便打开一个文件 可以新建一个记事本 在记事本页面选中输入A然后按HOME 我们不能用DNF程序做演示了 因为DNF程序自带驱动保护无法任何形式的调试 如果用打开DNF程序后按HOME键以后OD就会奔溃我们也就是失去了调试的机会 所以只能勉强用记事本做例子演示了 当按完HOME 键以后最小化记事本 打开FZ发现FZ没有任何提示了 这就证明FZ加载记事本成功了 然后我们在FZ界面按F1
然后我们顺腾摸瓜 搜索字符串 关键字:黄金 然后双击进入代码段 然后我们在断尾下断
我们回到FZ继续按F1 程序断下我们F8单步 看看它返回到哪 究竟被谁调用了
返回到这并没有用因为没有跳转可以跳过这个调用【我们要跳过错误提示所以要寻找能跳过它的判断】 我们继续F8单步 发现来到了系统领空我们直接:AIT+F9让它回到程序领空 我们从系统领空出来后直接来到了程序中调用它的地方 我们发现有在调用他的地方的上面有一个判断可以跳过错误提示 我们双击下断点然后改成:JMP
改完以后我们F9让程序重新运行起来 在JMP处下断点 按F1键程序重新断下来 断在了JMP上我们F8单步 F8到下一个CALL上我们回车进入看看 只有一句JMP【我们回车跟上去看看】 里面只有一个CALL我们在回车跟进去看看 一直跟到这里我们发现
发现是一个易语言提供的调用DLL的功能CALL 我们不用管 按小键盘上的负号键也就是减号键 - 回到我们之前进入之前的地方 然后继续F8 好了今天就分析到这了
|